Repository navigation
Sync ako/mxcli: send/delete external object, queued-call retry, grid Delete selection, describe round-trip fixes, syntax reference - #1741
Merged
Merged
Conversation
`mxcli syntax drop` answered with three unrelated topics, and DROP ENTITY, DROP MICROFLOW, DROP NANOFLOW and DROP SNIPPET were documented nowhere. A new `drop` topic lists each statement, and a drift test holds it to the grammar's dropStatement rule. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
…1866) `mxcli syntax expression` named no isNew, add*/subtract* or trimTo* function. A new microflow.expressions.functions topic is rendered from the type checker's signature table (exprcheck.Functions), so the reference and check agree on which functions exist and what they take. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
…dio Pro MCP detail out (#1211) Plain exec resolves a forward call microflow/nanoflow (and a navigation target) since mendixlabs#1405; only the modes that cannot roll back refuse it. The correction pushed the body past TestLargeSkillsWereSplit's 700 lines, so the Studio Pro MCP section moves to reference/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
… a rename; check resolves members (#1935) After rename attribute, a member keeps its stored element name until Studio Pro refreshes it, and describe printed that name as the attribute, so its output failed on exec. Describe now prints the attribute the member references with the stored exposed name as `as '…'`, and alter … drop member accepts that name. check --references now refuses a member naming an attribute the entity lacks, as exec does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
…ing attribute (#1397) minutesBetween/div results render with their whole fraction and overflow a String(n) attribute on commit, though the build accepts them. check -p --references now warns when both halves are established: the argument is provably a Decimal and the attribute provably bounded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
…#533) A malformed microflow/nanoflow argument in a widget property was reported only at the property keyword (`no viable alternative at input 'datasource'`). The error now also names the argument at fault and its own line:column: an argument with no value, a missing `=`, or a stray comma. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
…y fixed|exponential) (#1931) A queued call's retry (Queues$QueueFixedRetry / QueueExponentialRetry) had no MDL spelling, and a flow carrying one was refused on rewrite, so it was locked for MDL. The clause follows IN QUEUE with every property required; describe prints a stored retry so it round-trips; check refuses Retries 0 (CE7044, measured on mxbuild 11.12.6). A rewrite that keeps a queued call but drops its stored retry is refused on both the rebuild and the splice path. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
…gate (#1931) TestTypeGates_CoverEveryWrittenType requires every written type to be named by a gate. The retry types arrived with QueueSettings (9.10.0) and are only written under it, so the existing queued-call gate covers them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
) `textfilter f (Attributes: [Name])` warned that `attributes` is hidden when attrChoice is "auto", but SetAttributeObjects stores attrChoice "linked" whenever it fills the list. The three filter definitions declared the constant "auto", so check evaluated the .mpk's visibility rule against a configuration exec never writes. They now carry an `attributes` mode (hasAttributes -> attrChoice linked), the shape the drop-down filter got under mendixlabs#1519; a bare filter keeps the "auto" default mode. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
mendixlabs#1707: on 0.28.0 `check -p` warned that a dynamictext's Content (top-level and in a Data grid 2 column) was hidden. `dynamictext` is builder-owned; a project `.mxcli/widgets/dynamictext.def.json` could take the keyword over in the registry, and check validated the Forms widget against that package's editorConfig rules. mendixlabs#1463 already closed that on main (registry refuses builder-owned names, lookupWidgetDef never resolves one), so this adds the regression test with a shadowing definition, and the bug-test script. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
mendixlabs#1690: an overlap caused by a loop's box (sized by its body) reaching into the activity before or after it was reported as "each MDL statement needs its own @position", sending authors to add annotations that were already there. When either box is a LoopedActivity, MPR008 now names the loop, its size and the neighbour it covers, and suggests widening the gap (with the minimum x distance) or letting the layout place the loop. Two plain activities keep the generic message. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
The non-nesting decision warning, the unrepresented-merge warning, the NORMALIZED note and the `syntax` help cited "mxcli #923". In ako/mxcli that number is an unrelated MCP-backend issue; the one meant is mendixlabs#923. Every emitted citation now names the owner. Interleaved branches are not given an MDL form here; only the citation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
…ing` (#1915) Studio Pro 11.16 stores an optional OData action parameter left blank as `Argument: ""`. describe printed it through describeExpr as `name = )`, which does not parse, so every `mdl 1;` create or modify of such a microflow was refused (MDL-V1-REBUILD). The language already spells that stored state on call microflow / call nanoflow: `Param = nothing`. The external-action describer now uses the same describeCallArgument, and the visitor accepts `nothing` in call external action. `= empty` (11.14's stored form) stays a distinct value, and both round-trip unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
…1929) A decision one of whose branches ends the flow is described with its own merge as a label: `end case; join shared1; merge shared1;`. Building that as a fresh create drew the decision's merge and a second merge for the label, wired merge -> merge, and every describe -> drop + create added another (`join junctionN; merge junctionN;`). Upstream mendixlabs#1727. resolveJoins now lets the label's merge BE the decision's merge when the join leaves an unlabelled merge with no other way out and is the label's only way in. A label reached from elsewhere is a real crossing and keeps the decision's merge as its own node (control test). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
…ote (#1933) A note whose only link ended at the start event or at another note was missing from describe microflow (upstream mendixlabs#1731): it counted as linked, so it was not a free note, and the element it is linked to prints no @annotation, so it was not printed at all. Re-executing the description deleted it. collectFreeAnnotations now treats such a note as free, so it is described (and the canonical describe keeps the first statement's @position, which is what keeps a free note free on re-parse). The link has no MDL form; a -- WARNING line says a rewrite drops it. A note with no link at all was already described and is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
…1` (#1932) A Delete button in a Data grid 2 control bar deletes the grid's selection: Studio Pro stores Forms$DeleteClientAction.SourceVariable = Forms$PageVariable{Widget: "grid1"}. MDL had no spelling for it, the writer never set it (mx check: CE7005 "No value selection has been made"), and describe printed a stored one as plain `delete`, so describe -> exec dropped it (upstream mendixlabs#1730). - grammar/visitor: `delete [$source] [close page]` - builder: $source resolves like a flow argument (#1560): a widget of the document is its selection, an object page/snippet parameter binds by name - writer: SourceVariable as a PageVariable; null otherwise, the key Studio Pro writes on all 13 Delete actions in ako/TestApp (mxcli omitted it) - describe: prints the source back - check/exec: a bare `delete` in a control bar or outside every data widget is refused as MDL-PAGEDEL01 (measured: CE7005 on mx 11.12.1) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
An attributesList item `attr (attribute: 'aria-label', …)` was read by
check --references (which exec runs first) as an attribute binding with no
data container, so describe -> exec refused every AccessibilityHelper that
sets an HTML attribute. walkWidgetsWithContext now skips object-list items
and slot blocks of the enclosing widget's definition (unstoredContainerKinds,
as the CE0495 rule already does).
The other half of the report (describe emitting `content { }`, MDL-WIDGET26)
was already fixed by mendixlabs#1400; a regression test pins it.
Housekeeping: knownUnsupportedContainers (ATTRIBUTE/ATTR/EVENT, #239) was
stale since widgetTypeV3 admits `| keyword`; the container-keyword test now
asks the parser and covers attributesList/attributes/events.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
describe wrapped long text in `$$ … $$`, and the lexer ends a DOLLAR_STRING
at the first `$$` it meets — it has no escape. A JSON sample holding a
Teamcenter UID ("SR::N::BOMLine..10.7$$Otklm9GclKA") ended the literal early
and `mxcli check` on the output reported `token recognition error at: '$$`.
Every describer that emits `$$` (JSON structure sample, Java action body and
EXTRA CODE, JavaScript action body, agent prompts, data transformer steps)
now goes through mdlDollarQuote / mdlSourceBlock, which fall back to
mdlQuote's version-aware single-quoted literal when the text contains `$$`
(or ends in `$`). The Java/JavaScript `as` and `extra code` positions accepted
only DOLLAR_STRING, so they now take a sourceCodeText: DOLLAR_STRING or
STRING_LITERAL.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
…n source (#834) `database from $ctx/Assoc/Entity` (List View / pluggable database source over associations, #721 L5) read its path two segments at a time, so the short form `A1/A2` was refused ("entity A2 … does not exist") and an existing entity off the association was written as a hop's destination. The association source already resolved every spelling and refused such a destination (mendixlabs#1467). Both builders now read the path through one function, resolveAssociationHops. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
…ity (#834) `$Order/M.Flag_Account/M.Flag` — an association between Flag and Account, from an Order — passed every check the association-source builders made: the association exists and Flag is one of its ends. exec wrote an EntityRefStep that cannot be followed from the context object. resolveAssociationHops (shared by the association source and `database from $ctx/…`) now refuses a hop whose association has neither the entity the hop starts at nor a generalization of it at an end. `check` reports the first hop as MDL-ASSOCDS03, only when provable: the association is known and the start entity's whole generalization chain is in the script or the loaded models. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
…#1941) `retrieve $X from M.E offset 5000;` with no limit was written as the "all" range (a ConstantRange), so the retrieve returned the first objects instead of skipping 5000 and describe printed no offset (mendixlabs#1737). addRetrieveAction built the Custom range only when a limit was stated; it now does for a limit or an offset, as its comment already said. TestRetrieveRange_OffsetWithoutLimit fails with range = <nil> before the fix, under mdl 0 and mdl 1. Checked with mx check 11.12.6 on a fresh project: a CustomRange with an offset and no limit is 0 errors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qrr1WnXxq1eRn7qRJ
Fix the expression-type-checking, integration-contract-drift, task-queues, mdl-syntax-design and syntax-help clusters
The MDL-PAGEDEL01 check added for #1932 refuses a bare `delete` in a grid control bar, which the page-patterns examples used. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qX9b6UKkp2oYD78jC
…24rqgv fix(microflows): retrieve … offset n without a limit keeps its offset
) Studio Pro's "Send external object" (Microflows$SendExternalObject) and "Delete external object" (Microflows$DeleteExternalObject) had no MDL. A flow that saves an external (OData) object could not be written - a plain commit on one is a Studio Pro error - and describe printed `-- Unsupported action`, so the drop + create rebuild MDL-V1-REBUILD recommends deleted the send silently (mendixlabs#1735). send external object $Obj [refresh] [on error …]; delete external object $Obj [refresh] [on error …]; One ExternalObjectStmt over both, two SDK actions; writer, reader, describe, and every statement switch rollback (the same shape: variable, refresh in client, error handling) appears in. `on error continue` on either is MDL076: measured on 11.12.6, one microflow per project, it is CE6035 while the default and custom handlers with or without rollback are accepted. Checked against Studio Pro's own activities (ako/TestApp 31a34ca, Odata.ODataSendDeleteMF, Studio Pro 11.16): the writer produces their property set and values - ErrorHandlingType stored as Rollback with no handler, unlike a plain delete - the reader describes them, and drop + create from that description gives the same activities. The write test fails with the "omit when empty" default. Also: mx check 11.12.6 is 0 errors on a fresh project with an updatable OData set, and the reporter's drop + create keeps the send. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qrr1WnXxq1eRn7qRJ
…ents (#1939) An external (OData) entity is saved with Send external object and removed with Delete external object; Studio Pro refuses a commit of one. MDL had no statement for either, so OData write flows could not be authored and a stored one was described as an 'Unsupported action' comment. send external object $Obj [refresh] [on error ...]; delete external object $Obj [refresh] [on error ...]; Measured on mxbuild 11.12.6 against an updatable external entity: both build clean and round-trip through describe; on error continue is CE6035 (now MDL076) and either one in a nanoflow is CE0009 (now MDL091). Gated at 9.7.0 / 9.12.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
…ress (#1939) A stored activity with no MDL statement is described as a comment, so a drop + create of the flow (the route MDL-V1-REBUILD recommends) or a whole-flow rebuild wrote it without that activity and reported success. check -p and exec's pre-flight now refuse a drop + create of such a flow, and the rebuild path refuses it, naming the activities. The splice path already keeps them and is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
…ument (#1914) A per-argument include associations ( … ) clause, nested like the stored tree, with IsParent derived from the association's ends and describe printing it. Self-associations are refused: their direction cannot be derived. BSON taken from the committed Studio Pro 11.16.0 fixture. Regenerates the proposals index. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
A brain can be filled before its project exists — every store command uses -p only as filepath.Dir — but plan and check failed with "mpr file not found". With no model the true answer is "nothing is built", so they now say that. A missing .mpr selects a NoModel resolver that answers every anchor with a new Unverifiable state: not NotFound (that would report the whole store stale) and not built. checkSlice counted every state other than NotFound as built, so the new state is handled there explicitly; without that a project that does not exist reads 100% built (the test asserts Built 0 and fails with Built:1 when the guard is stubbed). Unverifiable anchors are counted, not listed, and never fail the check. Output says the model is absent once; --json carries model_absent and an unverifiable count. Only os.IsNotExist selects NoModel: an .mpr that exists but will not open is still an error. Fixes #1948 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82sxYNXAhaYkijzRwae
…iting the model (#1833) mendixlabs#1684 reported that `exec <file> --mcp` and `-c ... --mcp` "write the .mpr and mprcontents/ on disk ... and skip the .mpr.lock refusal", and that a plain `--mcp http://localhost:7782/mcp` needs `--mcp-dial 127.0.0.1:7782` on Windows. The write-to-disk claim does not reproduce on main. The real CLI with the reporter's flags, against a fake Studio Pro and a project whose .mpr.lock is present, sends ped_create_document and leaves .mpr + mprcontents/ byte-identical; a statement with no PED route (create image collection) is refused by the MCP backend, not written. The empty --mcp-trace that led to the report was fixed in 93f9478. TestMCP_ExecAndOneLinerNeverWriteTheProject- StudioProHasOpen pins both through main() in a child process; with the fault forced back in (factory ignoring --mcp, lock guard off) it fails with the report verbatim: exit 0, "Created constant", PED calls [], files changed. The dial ask was still open: dialPlan dialled `localhost` through the resolver, which can answer with a LAN address first, while Studio Pro on Windows listens on 127.0.0.1 only. A localhost URL now dials 127.0.0.1 first, then the resolver's answer, then host.docker.internal; the Host header stays `localhost`, which Studio Pro requires. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
…24rqgv feat(microflows): send external object and delete external object
…ities A flow holding an action mxcli has no MDL for - describe prints `-- Unsupported action: <$Type>` (Generate document, the workflow jump-to actions, Send external object before #1939) - lost that activity when it was rebuilt from MDL: a drop + create from its describe output, which MDL-V1-REBUILD recommends, or the whole-flow rebuild `create or modify` falls back to under mdl 0. check passed and exec reported success. Both are now refused before anything is written, as MDL-FLOW-UNSUPPORTED, naming the activities: - the verdict pass that check -p and exec's preflight share records a dropped flow's unsupported actions and refuses a create of it later in the script, and refuses a create or modify predicted as an mdl 0 rebuild. The drop + create route has to be refused there: by the time its create runs, the drop has deleted the flow; - exec refuses the rewrite of an existing microflow or nanoflow that holds them, beside checkNoQueuedCalls (ADR-0005), for runs without the preflight (--no-check). The in-place splice under mdl 1 keeps them and is not affected. Tested on Studio Pro's own WorkflowCommons flows in ako/TestApp: drop + create of ACT_Workflow_JumpTo and the mdl 0 rebuild of ACT_WorkflowJumpToDetails_Apply are refused; a drop + create of a flow without unsupported actions, and an mdl 1 splice that keeps the activity, are the controls. Stubbing the verdict fails both refusal tests; stubbing the exec guard lets exec run the rebuild and lose the activity. The CLI exec of the drop + create refuses with "Nothing was written". Full mdl/executor suite passes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qrr1WnXxq1eRn7qRJ
…8b6spq # Conflicts: # CHANGELOG.md # cmd/mxcli/syntax/features_microflow.go
#1947 (merged while this PR was open) implements the same #1939 statements, measured against Studio Pro's own activities. Its version of every file the duplicate commit afe1624 touched is kept and the duplicate is dropped; the rebuild guard, the #1914 proposal and the #1833 change are unaffected. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
A brain could already be filled before its .mpr existed, but only because no store command opens the -p path. Nothing said so, so the next Stat in brainProjectPath would have removed the feature. - `-C/--dir <dir>` names the brain's directory on every brain command; `-p <app.mpr>` stays as the shorthand for the directory an .mpr is, or will be, in. Both together is refused. With -C, plan and check use the one .mpr in the directory (none: no model, via NoModel; several: refused, naming them), so the same command keeps working after the project is created there. - `brain init` takes no arguments. It accepted a directory and ignored it, writing the store wherever -p pointed. - `mxcli new` adopts a target directory holding only a brain: docs/brain/ with mxcli's marker, and .mxcli/brain/. Anything else is still "not empty"; a foreign docs/brain/ is ErrForeignStore. - moveProject merges the project around an adopted brain and finds every conflict before moving anything. The old rename-then-CopyFS fallback merged by accident and stopped half way on the first file that already existed. Layout decision: the brain lives where the project will live, so the directory is the project root from the first requirement onwards. Fixes #1949 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82sxYNXAhaYkijzRwae
Measured on mxbuild 11.12.6: both external-object activities in a nanoflow are CE0009 "This action is not supported in nanoflows.", which check passed. They now report MDL091 like the other server-side actions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
Urgent clusters: rebuild guard for unexpressible activities, include-associations proposal, --mcp localhost dial
Fix describe-round-trip-gaps, describe-round-trip-gaps-pages and misleading-diagnostics clusters
brain: plan and check answer when the .mpr does not exist yet
…o remove them (#1914) Decided: an omitted clause over a stored non-empty tree is still carried, so an old script never drops Studio Pro's settings, but check and exec warn and point at include associations (). Adds how associations are removed (restate the clause with less, or ()), and the limit refusing self-associations sets: such a tree cannot be partly removed from MDL. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
An entry's id is a handle (promote, resolve and prose cite it), but there was no edit path: every correction went drop + capture, which minted a new id and orphaned the old one. - `brain edit <id> [<text>] [-a @anchor]…` rewrites a staged or committed entry in place, keeping id, position, kind, slice and date. -a replaces the anchors and is validated as capture validates; with -a the text may be left out. - `brain move <id> --slice <s>` moves a requirement to another slice. A decision is refused: a slice would make it a requirement. - Re-anchoring a decision moves it to its new module's shard, unless it was placed elsewhere on purpose (promote --to project). Once an id is a handle it need not match its text, so duplicates are now found by ContentKey (what the entry says) rather than stored id, in Queue.Append, Store.Promote, capture (against the store too) and edit. Capturing an edited entry's ORIGINAL wording, which hashes to that entry's id, gets a fresh id (AssignFreeID) instead of colliding. The brain test helper now resets every brain flag between runs: cobra StringSlice flags append across runs of the shared rootCmd, so a second `capture -a X` captured [X, X]. Fixes #1950 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82sxYNXAhaYkijzRwae
An entry had no way to say it came from sample-prd.md lines 18-21, so a requirements UI could not show the source line behind a requirement, nor find the parts of a document that produced none. - `capture --source <doc>[#<locator>]` and `edit --source` set Entry.Source. The path is resolved from the shell's directory and stored relative to the project directory with / separators, so it travels between machines. A document outside the project, or one that does not exist, is refused. - It renders as its own `Source:` line directly after the anchors line, and is in the JSON. Not on the anchors line: older builds match that line with an exact regex and would call every such entry malformed. After it, an older build reads it as body and keeps it on rewrite; the parser takes it back out of that shape too. - `check` fails with NO SOURCE when the document is gone, as it does for an anchor that names nothing. - Source is not part of ContentKey: the same fact found in two places is still one entry. Measured against a binary built from main (e4baec6): it checks a store with sources as OK, and its rewrite keeps the Source line, which this build then reads back. Fixes #1951 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82sxYNXAhaYkijzRwae
docs(proposal): include associations — warn on an omitted clause; how to remove them (#1914)
…on (#1784) The generated constructor named it Workflows$AnnotationActivity, the writer overrode it, and the decoder registered both. Measured on mxbuild 9.24.30 and 11.12.6 with the same workflow written each way: Workflows$Annotation is 0 errors, AnnotationActivity is TypeCacheUnknownTypeException on both. The constructor now carries a storage-name override and the unknown name is no longer registered. Of the other 40 codegen aliases, the Studio Pro-authored TestApp confirms the alias for most; the unconfirmed ones mxcli writes are covered by the doctype mx-check suite, and CallMicroflowTask is version-dependent (already handled by the writer). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
…ersion has (#1810) The user task's assignee association is WorkflowUserTask_Assignee (a Reference) on Mendix 9 and WorkflowUserTask_Assignees (a ReferenceSet) from 10.0: one association, renamed with its GUID kept, read from the 9.24.30, 10.0.0 and 11.12.6 modeler assemblies. mxcli's System module was the 11.x one for every project, so on 9.24 MDL-WORKFLOW10 suggested a claim that fails the build (CE1613), check accepted it, and exec refused the name 9.24 actually has. - System associations carry measured Introduced/Removed versions and the backend builds the System model for the project's version. - MDL-WORKFLOW10 counts a claim under either name and suggests the one for the project's version (both, labelled, when it is unknown). - check --references resolves a one-qualifier Module.Assoc member, as exec's builder does, so the two no longer disagree. Measured on mxbuild 9.24.30: the Assignee claim builds at 0 errors. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
…tures (#1367) mxcli syntax and the version registry kept separate tables that had drifted both ways (boundary event 10.6 vs 10.14, view entities 10.18 vs 10.21, notify 11.7 though the statement is 10.0; data-transformer had no version). A topic now names its registry features and its Requires lines are read from sdk/versions; Register refuses a hand-written MinVersion, and a ledger test requires every registry feature to have a topic. Also: a new 'features' topic and help entry for list features, which had none; 'list features for version 10.20.0' (three-part) and 'list features in workflows' (keyword area names) parse. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
… flow argument (#1206) check applied the CE1571 rule measured on 11.13, where a page parameter does not supply a flow argument, to every project. Bisected with one script (snippet and page parameter, nanoflow data source and button action): 9.24.30 and 10.0.0 build at 0 errors, 10.1.0 through 11.12.6 report CE1571. Below 10.1 the parameters now seed the root data context, for data sources and actions alike; check -p matches mx check on 9.24, 10.0, 10.24 and 11.12. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
On a 9.x project a pluggable widget whose stored source is Studio Pro 9's Database source (CustomWidgetDatabaseSource) was rebuilt as an XPath source when the widget itself was edited; describe prints both as database from E where …, so the statement cannot say which. The rebuild now keeps the stored type when the WHERE fits its constraint rows. Measured on a 9.24 project, editing only the grid's sort: the base build writes CustomWidgetXPathSource, this build keeps the DatabaseSource and its rows. A new grid is still written as an XPath source. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82tQYYsMeM1r2ihkNch
brain: start a brain before the project, and have mxcli new adopt it
…s to the mdl 0 preflight main gained the same guard in parallel (35398f6): a drop + create of a flow holding activities MDL cannot express is refused in check -p and exec's preflight, and exec refuses the whole-flow rebuild. This branch's duplicate of both is dropped in favour of main's (cmd_microflows_build.go taken from main, the drop/recreate tracking removed from the verdict pass). What remains is the delta: exec's rebuild guard fires only when exec reaches the statement, after the statements before it were written, so the verdict pass now refuses a create or modify predicted as an mdl 0 rebuild of such a flow before anything runs (MDL-FLOW-UNSUPPORTED, worded as exec's refusal). The tests on Studio Pro's WorkflowCommons flows stay, the drop + create ones now exercising main's validateDropRecreateKeepsActivities. Stubbing the new prediction fails the mdl 0 test; main's own tests pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qrr1WnXxq1eRn7qRJ
…a rule ID Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011oK82qrr1WnXxq1eRn7qRJ
brain: edit and move an entry without changing its id
brain: record which document, and where in it, an entry came from
…24rqgv fix(microflows): refuse an mdl 0 rebuild of a flow with unsupported activities before the script runs
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: 29 commits since #1739 — new microflow and page statements, describe round-trip fixes, and syntax/check accuracy.Microflows: OData write flows
send external object/delete external object. Studio Pro's "Send external object" and "Delete external object" had no MDL; a plain commit on an external entity is a Studio Pro error, so OData write flows could not be authored, and describe printed-- Unsupported action.on error continueis refused as MDL076 (CE6035, measured on mxbuild 11.12.6). Either one in a nanoflow is MDL091 (CE0009). Gated at 9.7.0 / 9.12.0.check -p, exec's pre-flight and the rebuild path now refuse it, naming the activities; the splice path already kept them.Fixes #1735
Microflows: authoring
in queue … retry fixed|exponential, every property required. describe prints a stored retry so it round-trips, check refusesRetries 0(CE7044), and a rewrite that keeps a queued call but drops its stored retry is refused on both the rebuild and the splice path. A flow carrying a retry was locked for MDL before. Fixes Feature: author the retry policy of a queued call (in queue … retry fixed|exponential); a flow with a retry is locked for MDL today #1729retrieve … offset nwithout a limit keeps its offset. It was written as the "all" range, so the retrieve returned the first objects instead of skipping, and describe printed no offset. Fixes DB retrieve with offset cannot be generated #1737database from $ctx/…resolves multi-hop paths through the same function as an association source, so the shortA1/A2form is accepted and an entity off the association is no longer written as a hop's destination. A hop whose association does not start at the context entity (or a generalization) is refused, bycheckas MDL-ASSOCDS03 when provable.Microflows: describe round-trips
join junctionN; merge junctionN;). Fixes DESCRIBE → drop + create adds a merge to a decision one of whose branches ends the flow — one more on every round trip #1727-- WARNINGsays a rewrite drops it. Fixes annotations not linked to an activity are missing in MDL #1731= nothing, notname = ), which did not parse and made everymdl 1;rewrite of the microflow refused.$$is described as a string literal, not a$$ … $$block it would end early (JSON structure samples, Java/JavaScript action bodies, agent prompts, data transformer steps).mendixlabs/mxcli#923by owner.Pages
delete $grid1 [close page]. MDL had no spelling, the writer never setSourceVariable(CE7005), and describe printed it as plaindelete. A baredeletein a control bar or outside every data widget is now refused as MDL-PAGEDEL01. Fixes Data grid 2 control-bar Delete button: MDL cannot set its source (the grid selection) and describe drops it;action: deletepasses check but fails mx check with CE7005 #1730attributesListre-executes — its items were read as attribute bindings without a data container.check and lint
@positions already there. Fixes MPR008: name the loop box as the cause when a loop overlaps its neighbours, or let layout place loops #1690Attributes(check evaluated anattrChoiceexec never writes), and a regression test for dynamictext Content, already fixed by Native mobile widget packages take over the built-inimageandradiobuttonskeywords on web pages #1463. Fixes False MDL-WIDGET10 on dynamicText Content #1707toStringof a Decimal is written to a short String attribute (minutesBetween/div results overflowString(n)on commit though the build accepts them). This is the Decimal part of the issue only. Refs check passes expressions the build rejects or that misbehave at runtime (function arguments, Decimal toString, raw backslash literals) #1515as '…'), so its output execs again;check --referencesrefuses a member naming an attribute the entity lacks. Fixes Message definition: after RENAME ATTRIBUTE, describe prints the member under the old attribute name; the output passes check but fails on exec ("has no attribute") #1733mxcli syntax
droptopic documenting every DROP statement, held to the grammar by a drift test. Fixes DROP ASSOCIATION not well documented in mxcli syntax #1716Studio Pro MCP
localhostURL dials 127.0.0.1 first (then the resolver, then host.docker.internal), Host header unchanged — Studio Pro on Windows listens on 127.0.0.1 only, so--mcp-dialis no longer needed.exec --mcp/-c --mcpwrite the.mprdoes not reproduce on main; a test now pins it throughmain()against a locked project, and fails with the report verbatim when the fault is forced back in.Fixes #1684
brain
planandcheckanswer "nothing is built" when the.mprdoes not exist yet, instead of failing with "mpr file not found".Docs
include associations ( … )on a call external action argument. Refs CALL EXTERNAL ACTION — no MDL syntax for IncludeAssociations flag #1721delete $grid