fix: small CLI and language fixes — features for version, mxcli version, BOM/UTF-16, -c, describe quotes, XPath double quotes, LSP - #919
Merged
Conversation
…#910) The bare VERSION branch of ExitShowStatement ran before the FEATURES branch and claimed 'show features for version 10.24', printing the session's show version output. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… reporting success with nothing stored (mendixlabs#1214) A list view / data view stores Editable as a boolean; the setter only wrote strings, so `set Editable = true on lvRows` returned nil. The stored value's type now decides the vocabulary (true/false vs Always/Never), the input enum is canonicalised, anything else is refused, and EditableIf writes the Conditional enum beside its settings element as CREATE does. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Prints exactly what --version prints (version and build time), the bare-subcommand spelling go, docker, gh and mx all accept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…627) The fluent API's AttributeModifier.Apply() rebuilt the attribute with raw == nil and kept only its $ID, so the codec minted GUID = $ID - the mendixlabs#1119 data-loss class. The write guard refused it, leaving the API unusable on any Studio Pro-authored attribute. Carry the stored raw bytes and export level via carryStoredAttribute, now shared with the entity rewrite's carryAttributeIdentity. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…1253) Windows PowerShell 5.1 writes a UTF-8 BOM (Set-Content -Encoding UTF8) or UTF-16LE ('>'), and every script reader passed the raw bytes to the lexer: an invisible token-recognition error at line 1:0. One decoder, mdl/srctext, now strips the BOM and decodes UTF-16 for check, exec, fmt, diff, the multi-file check pass, the test runner and EXECUTE SCRIPT. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#528, mendixlabs#293) A data view's footer is a region: its widgets live in the data view's FooterWidgets and the footer has no stored Name, so the name a script wrote and describe's invented footer1 both named nothing ALTER could find. - ALTER PAGE: <dv>.footer resolves as a region; INSERT INTO appends, REPLACE swaps the whole content (a describe-style footer { } block is unwrapped), DROP empties it. A not-found names the footer addresses the page has. - REPLACE may reuse the names of the widgets it removes (the target's descendants), which was refused as a duplicate. - A name on a data view footer is MDL-DEPR005 (unstored widget name), like a layout grid row's; describe prints footer { } unnamed. The AST is identical, so writes do not change. Docs/examples/skills rewritten. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… not run (mendixlabs#1218) An empty -c fell through to the interactive REPL and hung callers with an open stdin. A failing statement in a ;-separated -c stopped the run silently. -c keeps exec's fail-fast semantics but now reports 'statement N of M' and how many later statements were not run, and takes --continue-on-error like exec. describe entity/association of an unqualified name names it instead of the create-path message. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ndixlabs#394) describe enumeration wrote 'It's a test', which does not re-parse. Caption and folder now go through mdlQuote. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#1245) uri.URI.Filename panics on any scheme but file, and the VS Code extension opens describe previews as mendix-mdl: documents: the server crashed on every didOpen. documentPath reads the path component of a non-file URI; the on-disk semantic check skips virtual documents. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ion (#906, #558, #563) Seven places where check -p passed a statement exec then refused part-way (or both accepted a write that broke the project). Each prediction now calls the decision exec makes instead of restating it: - demo user that exists: into the create registry (stmtCreateKind/setFor) - jar dependency that exists: alter module jar actions replayed through applyJarDepAction on a copy of the stored settings, in script order - translations into the source language / plain create of a language with translations: translationsRefusal, shared with execCreateTranslations - task queue created earlier in the script satisfies `in queue` (mendixlabs#1211); one created later is MDL-ORDER01 or, for a later create or modify, reported against the project (validateForwardDefRefs) - page/snippet widget naming a microflow/nanoflow created later: MDL-ORDER01 via eagerDefRefs (mendixlabs#1212) - variable passed to a Microflow-typed Java action parameter: microflowParamArgRefusal, used by the flow builder and the reference pass (mendixlabs#1210, unloadable project: refused under both versions) - referenceselector: MDL-WIDGET38 from formsWidgetsWithoutWriter, which the builder's fall-through uses too (no more `widget init` hint) - retrieve constraints (mendixlabs#1213): MDL047 also matches `!= empty`, MDL091 startsWith()/endsWith(), unknown bare members and CreatedDate-for-createdDate are reference errors. Each measured CE0161 on mxbuild 11.13.0 against a clean control. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
MoveEntity scanned only the plain associations of the source unit, so a cross-association created by an earlier move was invisible: moving its second endpoint left a ParentPointer naming an element absent from its unit and Studio Pro could not open the project. Handle the three shapes: convert back to a plain association when both endpoints share a module (raw transform, GUID carried), let an own cross-association travel with its FROM entity, and re-point a cross-association in another module. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he refusal exec's pre-flight (semantic checks, references, name clashes) moves out of the command into execPreflight, which prints what the checks report and returns the message exec exits with. No change in behaviour; diff is about to run the same checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…writes (#907, #807) mxcli diff answered "what would exec write?" a second way: it rendered each statement as MDL and compared the text with the stored document's describe output, without running anything. Every normalisation exec applies had to be re-derived by that renderer, so it reported phantom changes (Boolean against Boolean default false, String against String(unlimited), positions, flow layout), did not compare pages, translations or layouts at all, said unchanged for a plain create exec refuses (#807), and could not diff a statement that depends on an earlier one (#856). The new mdl/scriptdiff package copies the project to a scratch folder, runs the script there with exec's own code (the same pre-flight, ExecuteProgram or the continue-on-error run, under the script's header), and compares the copy with the project unit by unit, the .mpr's container rows included so a move is seen. Each changed unit is rendered by DESCRIBE before and after; a domain model per entity and association, module and project security per role and demo user. A unit that is written but describes the same is listed with the properties that change. The scratch run always uses the file engine. The statement-based differ (cmd_diff_mdl.go, cmd_diff_render.go, spliceVerdict) and its tests are removed; diff gains --no-check, --continue-on-error, --deprecations and --exec-output as exec has them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…endixlabs#849) Studio Pro does not reload the model from disk, so a write mxcli makes while the project is open is silently discarded by Studio Pro's next save. The writer now refuses any write that would reach storage while Studio Pro's <project>.mpr.lock is beside the .mpr (matched without regard to case, as Studio Pro lower-cases it). Reads and writes elided as no-ops are never refused; exec --force or MXCLI_ALLOW_STUDIO_PRO_OPEN=1 override. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…its mappings and its commit option (#571) create published rest service wrote only the path's {name} placeholders as operation parameters, each a String: a query or body microflow parameter failed mx check with CE0350, an Integer {id} with CE6539. import mapping, export mapping and commit parsed and were thrown away. - Parameters are derived from the microflow as Studio Pro derives them (path name -> Path, object/list -> Body, HttpRequest/HttpResponse -> none, else Query), each with the microflow parameter's type, merged over the stored parameters so a header / renamed / described one survives. - Mappings and commit go AST -> model -> BSON and back; describe prints them and notes parameters MDL cannot state. An unknown commit option is refused by exec and check (MDL-REST03). - create or modify carries the restated operation's summary, documentation and object handling; the service rewrite carries the stored keys MDL cannot state (authentication, CORS, documentation). List markers as Studio Pro writes them. TestApp's Services.OrdersRestApi leaves the round-trip allowlist. Fixes mendixlabs#1206 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
diff executes the script for real on a scratch copy. A headerless script that connected to the -p project wrote into the real project and reported that exec writes nothing; a connect to another project, also inside an execute script, wrote that one; sql queries and import ran against real databases. Every statement now passes Executor.SetStatementGuard: a connect to the project is redirected to the copy, anything else outside it is refused with an error. The copy also skips the scratch folder when TMPDIR lies inside the project, instead of copying itself into itself. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e binding (mendixlabs#1235) Studio Pro stores an input bound to a page variable as SourceVariable {LocalVariable} with no AttributeRef (measured over MCP on TestApp). MDL refused `Attribute: $ShowAll` (MDL-WIDGET34) and describe printed the widget unbound, so describe -> exec cut the binding silently. - builders map a bare `$name` naming a declared page variable to that SourceVariable; check validates it against the document's Variables; ALTER sees the stored variables - describe prints `Attribute: $name` for that shape - text box / text area bound to a variable get MaxLengthCode 0 (unlimited); -1 is mx check CE6553 Also wires ALTER REPLACE's stored-widget description (used by the next commit) through cmd_alter_page.go. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he statement does not state (mendixlabs#1247) A pluggable widget is rebuilt from its template, so a REPLACE reset every property MDL has no word for. On TestApp's Studio Pro-authored Rules.BusinessRule_NewEdit, adding a sort to comboBox1 also turned its stored Editable Never into Always and an expression property's PrimitiveValue into 'false'; the reporter lost a translated placeholder and readOnlyStyle. For one pluggable widget replaced by one of the same package, the executor builds the stored widget as describe prints it beside the replacement; the mutator keeps the stored Type and every property/field the two builds agree on, and grafts the differing values with their TypePointers re-aimed at the stored Type by key path. Anything that cannot be lined up falls back to the plain replace. Running the same REPLACE twice writes nothing. Also: findings, mutator-addressing pattern page, alter-page skill. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- mendixlabs#591: list activities and cast carry the flow flavour's error handling (Abort in a nanoflow, where "Rollback" was CE6035); create, commit, call nanoflow and call microflow in a nanoflow accept only a handler without rollback (measured), refused otherwise; check now reports the nanoflow rules exec's build enforces (MDL091) and the annotation rules. - mendixlabs#698: the MCP mapper writes errorHandlingType and refuses a custom handler / error-handler flow PED cannot express. - mendixlabs#991: @anchor and @Curve inside an error handler are applied; describe emits the handler body's layout annotations. - mendixlabs#992: `@anchor(true: (to: top))` parsed as a division; the paren value now wins, unusable @anchor parameters are refused (MDL092), and `@curve(true: …)` is refused on nanoflows too. - mendixlabs#870: lock/unlock name their workflow; `pause all` / `unpause all` is Studio Pro's "(Un)pause instances"; bare `all` is refused (MDL-WF17); describe no longer turns a Studio Pro lock into `all`. - mendixlabs#175: `call workflow … on error continue` refused (MDL076), MDL076 exec-enforced. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…s too (mendixlabs#1247) Restating TestApp's dataGrid2_1 with one column caption changed fell back to the template rebuild: the filter widgets nested in the columns value point into their own Type, which the graft could not re-aim, so itemSelectionMethod, onClickTrigger and every column's unmapped properties were reset. A nested pluggable widget is now grafted as built, and an object list that lines up with the baseline is merged object by object. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The hint told authors to declare `Variables: { … }`, the brace form
MDL-DEPR123 deprecates; it now writes `Variables: ( … )`.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…oted name is stripped (#566, mendixlabs#1243) On the left of a comparison a double-quoted token is a quoted name and its quotes are stripped, as every XPath sink does (GRANT … WHERE, retrieve, workflow targeting). On the right it is a value Mendix XPath writes in single quotes: stripping it stored a member path, keeping it stored a constraint Mendix rejects. Both are wrong writes, so it is refused under every language version (ADR-0011), naming the single-quoted form. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # CHANGELOG.md
# Conflicts: # cmd/mxcli/cmd_diff.go
11 tasks done
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.
Seven small fixes, one commit each, each with a test and a fix-issue finding.
show features for version x.y(andlist features …) prints the feature table instead of the session's version output (visitor_query.go branch order).mxcli versionis an unknown command, though the code already expects it #534: a newmxcli versionsubcommand that prints what--versionprints.check/execreject.mdlfiles that start with a UTF-8 BOM (or are UTF-16) with an invisible "token recognition error" — Windows PowerShell 5.1 writes both by default mendixlabs/mxcli#1253:checkandexecread scripts that start with a UTF-8 BOM or are encoded in UTF-16, instead of failing on an invisible token.-c ""is an error instead of starting the REPL, and when a-cstatement fails the output says which statements were not run.mxcli syntax workflow user-task targetingshows a double-quoted XPath literal, which is CE0161 #566, GRANT … WHERE keeps a double-quoted name verbatim for most rule shapes — XPath string literal, the access rule silently matches nothing (check / exec / mx check all pass) mendixlabs/mxcli#1243: in an XPath (GRANT … WHERE, retrieve, workflow targeting), a double-quoted name on the left of a comparison is stripped. A double-quoted value on the right is refused, naming the single-quoted form, because both previous readings stored a wrong constraint (ADR-0011: refusing a silent wrong write).didOpenfor a non-file URI.Closes #910, closes #534, closes #566. Fixes mendixlabs#1253, mendixlabs#1218, #394, mendixlabs#1243, mendixlabs#1245 (text only).
Test plan:
go teston ./mdl/visitor, ./mdl/executor, ./cmd/mxcli/... and ./mdl/upgrade passes.make lint,check-conformance,check-findings,check-mdlandcheck-skill-mdlpass.xpathQuotedValuesstubbed to return nothing,TestXPathDoubleQuotedValueIsRefusedfails; restored, it passes. Each of the other items' tests was written first (see the commit messages and findings).🤖 Generated with Claude Code