Skip to content

Sync ako/mxcli: navigation list ALTER and addressing, Studio Pro type names, test --local hang - #1398

Merged
ako merged 12 commits into
mendixlabs:mainfrom
ako:main
Oct 12, 2026
Merged

ako merged 12 commits into
mendixlabs:mainfrom
ako:main

Conversation

@ako

@ako ako commented Oct 12, 2026

Copy link
Copy Markdown
Collaborator

Syncs ako/mxcli:main into mendixlabs/mxcli:main: 6 commits since #1397, landed in the fork through PRs ako#1130, ako#1132 and ako#1133.

Navigation lists (#1388)

  • ALTER PAGE/SNIPPET can add navigation list items (insert into navList1 { item … }) and address widgets inside existing items. Before, it failed with "item must be a direct child of navigationlist", and replacing the whole list was the only workaround.
  • Items are addressable by content or position, the way DataGrid 2 columns are: nav item(t1) (the item holding widget t1), nav item('Home') (the item showing that text, in any language), nav item@2, or nav item('Home')@2. An ambiguous address is refused unless @n picks one, and a miss lists every item's addresses.
  • Describe and create keep an item's class, style and dynamic classes. Describe printed the class as an unparseable ButtonStyle: nav-orders, and create wrote an empty appearance.

Studio Pro document names (#1395)

  • mxcli describe --help, the "Unknown type" hint and auto-detect lead with Studio Pro's names: consumedrestservice, consumedodataservice, publishedodataservice, taskqueue, aimodel and appsecurity. Every old spelling stays accepted.
  • Catalog views use the same names (consumed_rest_services, consumed_odata_services, published_odata_services, task_queues, …), and the old view names stay as alias views. objects.ObjectType reports CONSUMED_REST_SERVICE, CONSUMED_ODATA_SERVICE, PUBLISHED_ODATA_SERVICE and TASK_QUEUE.

Testing

claude and others added 12 commits October 12, 2026 10:24
…hem (#1388)

ALTER SNIPPET/PAGE could not add an item to a navigation list:
`insert into navList1 { item … }` failed with "item must be a direct
child of navigationlist", and a widget inside an existing item failed
to resolve (`widget "t1" not found`), leaving REPLACE of the whole
list as the only workaround.

- Route an INSERT of only `item` blocks to a new
  PageMutator.InsertNavigationListItems, which appends to the list's
  Items using CREATE's serialization (a throwaway wrapper list).
- Descend into NavigationList Items in the find, widget-scope and
  nearest-data-source walks, so widgets inside an item are targets.
- Items carry no Name, so BEFORE/AFTER a widget inside an item is
  refused naming the INTO form; mixed item/widget inserts are refused.

Verified on Mendix 11.12.1: the issue's script runs, mx check reports
0 errors, and the ALTERed snippet's BSON is identical in shape to one
CREATEd with both items.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013WEPgso8WF2GxsRHvhP4cB
A navigation list item has no stored name, so it could not be the
target of INSERT BEFORE/AFTER, DROP, SET or REPLACE. Address it the way
a DataGrid 2 column is addressed:

  nav item(t1)         the item holding the widget named t1
  nav item('Home')     the item showing that text (any language)
  nav item@2           the second item
  nav item('Home')@2   the second of several items showing Home

An address matching several items is refused unless @n picks one; a
miss lists every item's addresses.

The address travels as the widget reference string
(backend.NavItemSelector) and the page mutator's widget finder resolves
it to the item in the list's Items, so SET (Action), DROP, INSERT INTO
an item and INSERT BEFORE/AFTER an item { item ... } use the paths they
already had. REPLACE of an item with item blocks gets its own mutator
method; widgets next to or in place of an item are refused.

Verified on Mendix 11.12.1: every form runs, mx check reports 0 errors,
and the ALTERed snippet's BSON is identical in shape to one CREATEd in
the same final state.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013WEPgso8WF2GxsRHvhP4cB
`mxcli test --local` hung indefinitely after the tests finished whenever
mxbuild started a new Gradle daemon. `mxbuild --serve` and
`mx sync-java-dependencies` write to a buffer, so exec.Cmd creates a pipe
and Wait blocks until every holder of its write end closes it. A fresh
daemon inherits that end, outlives mxbuild, and escapes the tree kill, so
ServeServer.Stop — which runs before results are printed and the JUnit
file is written — never returned.

Set cmd.WaitDelay on both commands. It starts only once the process has
exited, so it cannot cut a live build short. SyncJavaDependencies treats
exec.ErrWaitDelay as success: mx's own exit status is the result.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzsC1uYbnDNq7qprVpYahn
Describe printed a navigation list item's Appearance.Class as
`ButtonStyle: nav-orders` - not an item property, and unparseable
unquoted - and CREATE wrote an empty appearance whatever the item said,
so a styled item lost its class on describe -> exec.

- describe reads the item's Class, Style and DynamicClasses and prints
  them as a widget's are
- pages.NavigationListItem carries them; buildNavigationListItemV3
  sets them and navListItemToGen writes them into Forms$Appearance,
  where Studio Pro keeps them (every item in PedApp and the WidgetDemo
  showcase stores the same Forms$Appearance as a widget)
- the wireframe no longer reports an item's class as a button style

Verified on Mendix 11.12.1: a styled item passes mx check with 0
errors, and describe -> exec of it is "Unchanged". With the pre-fix
binary the same describe output fails to parse.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013WEPgso8WF2GxsRHvhP4cB
mendixlabs#1395: "mxcli describe --help ... still use the old names"
after #755 (R10) renamed the document types. The cobra command keeps
its own type table, so the help, the "Unknown type" hint and the auto-detected
keyword (also printed in the ambiguity hint) still said restclient,
odataclient, odataservice, queue, model and projectsecurity.

The canonical keywords are now consumedrestservice / "consumed rest service",
consumedodataservice, publishedodataservice, taskqueue, aimodel and
appsecurity; every old spelling stays accepted. Auto-detect maps both the new
catalog ObjectType values and the pre-#1395 ones, which a cached catalog
still holds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019jnar6SL6PZUqymiE9peEo
mendixlabs#1395: "... the catalog.db still use the old names".

The views are now consumed_rest_services, consumed_rest_operations,
consumed_odata_services, published_odata_services and task_queues, and
objects.ObjectType reports CONSUMED_REST_SERVICE, CONSUMED_ODATA_SERVICE,
PUBLISHED_ODATA_SERVICE and TASK_QUEUE. The old view names stay as alias
views (LegacyTableAliases) so saved queries keep answering, but LIST CATALOG
TABLES shows only the new ones. The _data storage tables are unchanged.

An ObjectType literal cannot be aliased: a query filtering on an old value
returns no rows. Every Go reader of ObjectType accepts both, the shipped
conv018 lint rule, skills and docs use the new values, and the catalog-tables
page lists the renames. Schema 24, since views are CREATE VIEW IF NOT EXISTS.

Control: with tables.go/catalog.go reverted, TestCatalog_StudioProDocumentNames
fails with "Tables() still lists the old name CATALOG.REST_CLIENTS" and "no
such table: consumed_rest_services".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019jnar6SL6PZUqymiE9peEo
fix(docker): bound Wait when a Gradle daemon outlives mxbuild (mendixlabs#1396)
Studio Pro document names in describe --help and the catalog (mendixlabs#1395)
ALTER: add, address and edit navigation list items (mendixlabs#1388)
@github-actions

Copy link
Copy Markdown

AI Code Review

Review Summary

This PR syncs three independent changes from a fork: navigation list item addressing (#1388), Studio Pro document name updates (#1395), and a test--local hang fix (#1396). While each change is well-implemented and tested, the PR violates scope guidelines by combining unrelated features.

Critical Issues

None found.

Moderate Issues

Scope & Atomicity Violation


Automated review via OpenRouter (Nemotron Super 120B) — workflow source

@ako
ako merged commit dbeca8f into mendixlabs:main Oct 12, 2026
15 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants