Repository navigation
Sync ako/mxcli: integrate five contributor PRs (#744 #1238 #1552 #1128 #740), klauspost/compress and go-mssqldb bumps - #1590
Merged
Merged
Conversation
mxcli new always generated a Docker-based devcontainer because it called initCmd.Run() without forwarding the container runtime preference. This adds --container-runtime (docker|podman, default docker) to newCmd and sets initContainerRuntime before the init call so the generated .devcontainer/ reflects the user's choice. Closes #739 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ndows The devcontainer template generated by `mxcli init`/`new` had two bugs that failed `postCreateCommand` (red error in VS Code) when the workspace is a 9p bind-mount from a Windows drive under Podman: 1. `file` was never installed in the image, so `file ./mxcli | grep -q Linux` emitted `command not found` and the Linux-binary fast-path was never taken (always re-downloaded). Add `file` to the Dockerfile apt list. 2. The download fallback ran an unguarded `chmod +x ./mxcli`, which fails with `Operation not permitted` on 9p (Unix perm changes disallowed) and failed the whole postCreate even though the binary is already executable. Guard it with `2>/dev/null || true`. Fixes #742 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The reference documented three values that do not match what the runtime returns. Each mismatch makes a rule match nothing and report a clean pass, which is indistinguishable from the project being healthy. - entity_type is normalised to Persistent/NonPersistent/View in LintContext.Entities (context.go CASE), not lower case. The SEC001 example rule in this document used "persistent" and so matched no entity at all. - permission.access_type is written upper case by builder_permissions.go (CREATE/READ/WRITE/DELETE/EXECUTE/VIEW/ACCESS/MEMBER_READ/MEMBER_WRITE). - permission.module_role_name is qualified (Sales.Admin), which matters because rules compare it against user_role.module_roles.
A user role carries four security-governance settings that no rule could
read: Studio Pro's per-role "Check security" flag, and the three
user-management grants (ManageAllRoles, ManageUsersWithoutRoles,
ManageableRoles).
All four are already modelled on sdk/security.UserRole and already read
from BSON by security_read.go — UserRoleInfo simply did not carry them, so
they stopped at the linter boundary. This adds the fields and exposes them
as check_security, manage_all_roles, manage_users_without_roles and
manageable_roles.
Motivating rules, neither expressible today:
- "User roles with a certain amount of module roles should be checked
for security" — asserts check_security is on for any role above a
module-role threshold. Without the field a rule can only count module
roles, which is a different and much weaker claim.
- "Only 'admin' roles should manage other users" — needs the
user-management grants.
No catalog change, so no CatalogSchemaVersion bump: these come from the
MPR reader via GetProjectSecurity, not from a catalog table.
change $a (A_B.Title = ...) — a member whose dotted qualifier is an association, not a module — passed check, exec reported success, and the next mx check failed the build with CE1613: Mendix's ChangeActionItem cannot represent setting an attribute through an association at all (probe matrix in the bug report). The writer's one-dot heuristic wrote the name verbatim into the Association slot; check's blanket skip for dotted members trusted a FINDINGS #51 refusal that only fires when the qualifier is a real module. check -p now reports the form and exec refuses it, both naming the retrieve-then-change replacement; Module.Assoc association-sets and Module.Entity.Attribute qualified attributes are untouched.
An association retrieve binds a single object for a reference, which the current executor mis-types as a list and refuses to change — the example rolled back under exec. Use the database retrieve + `first` form with a qualified member, which check, exec and mxbuild all accept.
Records the maintainer's decisions on the draft and sets it to accepted: path addressing `'Admin' > 'Users'` (suffix match, one direct step per `>`, @n per segment, shortest-unique-address listings), the set/drop page clauses, `alter menu` for menu documents, captions read and written with the page rule (default language for describe and the resolver, authoring language for writes), and no `move` for `alter page`. The README generator listed only partial/proposed/draft, so an `accepted` proposal - this one and the three already marked so - never appeared in the index. It now has an Accepted group, and the status is in the lint vocabulary. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
…sions A second dependency scan of the published .exe, run after the mongo-driver upgrade (#1372), still blocked the customer's release. github.com/klauspost/compress v1.19.2 -> v1.20.3 github.com/microsoft/go-mssqldb v1.10.0 -> v1.11.2 klauspost/compress v1.19.2 predates GHSA-fpmh-frq8-7rj8, a zstd DecodeAll crash on crafted input fixed in v1.20.2. #1372 had only raised it to whatever mongo-driver/v2@v2.9.2 declared, which is not a security floor; it is now an explicit requirement so the floor is ours. As in #1372, the module is compiled into no mxcli build — no go.sum entry and no `go version -m bin/mxcli` line — so this moves only the requirement graph the scanner reads, not the binary. go-mssqldb is a blank import in sql/drivers.go for driver registration and mxcli calls none of its API, so the bump carries no API surface. That registration had no test, and a bump could drop a driver name without breaking the build — surfacing only as "unknown driver" at connect time in front of a user with a real database. TestExternalDriversRegistered now pins it; with the import removed it fails with `driver "sqlserver" is not registered`. Not fixed here: go.mongodb.org/mongo-driver v1 stays flagged for CVE-2026-107325, which has no fix on the v1 line — v1.17.10 is its last release and the module is deprecated. mxcli is not exposed. Measured on v1.17.10, `bsoncore.Array.Validate([]byte{0,0,0,0})` panics with `index out of range [-1]`, but mxcli imports v1 x/bsonx/bsoncore in zero files, every .Validate() call site in the tree resolves to the v2 driver, and v1's bson.Unmarshal — the API mxcli does use, 112 times on .mpr bytes — does not panic on the malformed payloads tried. The same measurement on v1.17.9 is identical, so #1372's v1 bump bought nothing for this CVE and was only CVE-2026-88031 (GridFS). Note also that CVE-2026-107324 does not reproduce on v1 at all, so that code path is v2-only and the v1 report overstates by one CVE. Clearing the finding at source means moving the remaining v1 bson imports to v2, which touches the BSON core and belongs in its own change. Verified: go build ./... clean, 104 test packages pass, go vet and gofmt clean, sqlserver/oracle/pgx all register at runtime, and `go version -m bin/mxcli` shows go-mssqldb v1.11.2 with klauspost/compress still absent. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Rer1mzP69XxbXKxQqheipM
The AST node and executor handler named "alter" implement `create [or modify] navigation`. Renaming them to CreateNavigationStmt / execCreateNavigation frees the name for the item-level `alter navigation` of the accepted proposal. No behaviour change. The rename made the create statement visible to TestEveryCreateStmtIsClassified, which lists Create* types from mdl/ast; it is recorded as not classified, because exec never refuses a plain CREATE of an existing profile - it writes the stated clauses into it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
The rule DESCRIBE reads a page's texts with (selectTranslationText: the project's default language even when empty, else en_US, else the first non-empty translation) moves to model.SelectTranslation, and the rule ALTER PAGE writes one with (setTextsTextTranslation: update or add the authoring language's translation, keep every other language) moves to bsonnav.SetTextsTextTranslation, so the navigation reader and the menu splice can call the same code rather than a copy of it. Both callers delegate unchanged; no behaviour change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
A menu item's caption was read by textOf as the first non-empty translation in document order. Page describe reads the same kind of text in the project's default language (an empty entry in it included), else en_US, else the first non-empty translation - so on a multi-language project describe navigation and describe page disagreed, and the ALTER NAVIGATION address resolver (which matches what describe prints) would have matched a different string than a page-style read. Accepted proposal, decision 4. textOf now calls model.SelectTranslation with model.AuthoringLanguage(). Because the backend reads the language through that process-level value, describe navigation, list navigation menu, describe menu and the create handlers resolve the project's default language before they read. The reader also dropped an item whose caption read empty and whose action was not a page, so describe never printed it and a describe -> exec round trip deleted it; reading captions in the default language would have made that reach every item not translated into it. Every Menus$MenuItem is read. Effect on describe output (intended): unchanged on a single-language project; on a multi-language one the default-language caption is printed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
The address of the accepted ALTER NAVIGATION / ALTER MENU proposal: `'Admin' > 'Users'`, a caption path written outer to inner. The first segment matches anywhere in the tree, each further one a direct sub-item of the previous match, so a path matches as a suffix; @n picks the n-th match of its own segment in describe order. A miss lists what is at the level searched and any case-only match; an ambiguity lists the shortest unique address of every candidate. types.MenuItemAddress is the address (the AST carries it); backend.ResolveMenuItemAddress and ShortestMenuItemAddress work on a MenuTreeNode tree, which both a navigation profile's menu and a menu document are read into. A property test checks that every printed address resolves back to its item on generated trees with heavy caption reuse (control: accepting a non-unique suffix fails it). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
…ocuments The backend half of ALTER NAVIGATION / ALTER MENU. menumutator edits the stored Menus$MenuItemCollection of a web profile (Menu) or a menu document (ItemCollection) - the same item tree under a different key - item by item: insert, replace, move, drop, set caption / action / icon, plus the profile's page clauses (home page per role, login page, not-found page). It is a splice, not a rebuild: an item no operation names re-encodes to its stored bytes, a moved item is the same document in another list (its $ID, sub-items, translations and an action MDL cannot spell go with it), and only new nodes get fresh $IDs. A caption is set as ALTER PAGE sets a text (bsonnav.SetTextsTextTranslation), a replacement carries the other-language translations of a caption it keeps, and the page clauses update stored elements in place and clear as Studio Pro does (Form "" for the login page, null for the not-found page). Saved through UpdateRawUnitPatch, so canon elides a no-op and does not re-pair $IDs. The mutators take positions, not addresses: the executor resolves an address against MenuTree and applies its refusals once, for check and exec alike. NavigationBackend gains OpenNavigationProfileForMutation and OpenMenuDocumentForMutation (MCP: unsupported; the mock gets an in-memory MenuMutator). A native profile is refused. Tests on a fixture copy with a Studio Pro-shaped two-language nested menu: every operation keeps the items it does not name byte-identical; the control - the same post-drop menu written by the create path's rebuild - fails that assertion. A restating set is elided; a real change lands. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
The syntax of the accepted proposal:
alter navigation <Profile> {
insert (before | after | into) <item> { <menu items> }
insert { <menu items> }
replace <item> with { <menu items> }
move <item> (before | after | into) <item>
drop <item>, …
set ( Caption: '…', OnClick: <action>, Icon: <icon> | none ) on <item>
set home (page | microflow) M.X [for Role] drop home page for Role
set login page M.P drop login page
set not found page M.P drop not found page
}
alter menu Module.Menu { <the item operations> }
An item is addressed as a caption path, `'Admin'@2 > 'Users'`. A fragment
is navMenuChildren, the block `create navigation` and `create menu` take,
and is built by the same visitor, so an OnClick a menu item cannot carry is
refused as there. `set ( … )` is strict: a key written twice is an error. A
bare `drop home page` parses so the executor can refuse it with the reason
(CE0527). No new tokens.
The statements are not executed yet; the executor follows.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
Every Menus$MenuItem Studio Pro writes carries `Icon: null` when it has no icon. `create menu` encodes items through the codec, which drops a null element property the type does not register, so an iconless item it wrote had no Icon key at all (CLAUDE.md rule 4: Studio Pro's exact property set). It surfaced once a second writer reached the same document: an ALTER MENU insert builds Studio Pro's shape (the navigation writer's), and the next describe -> `create or modify menu` of the unchanged menu reported "Modified", because the rebuild dropped the key the splice wrote. With Icon registered as a null field the two writers agree and the round trip is Unchanged (measured on a copy of testdata/expr-checker, 11.6.6). Test: TestCreateMenuDocument_ItemsCarryANullIcon (control: without the registration all three items lack the key). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
`set ( Icon: … )` on an item an older `create menu` wrote failed with "menu item … has no Icon property": that writer left the Icon key out of an iconless item. Setting Caption, Action or Icon now inserts a missing key where Studio Pro keeps it (properties in alphabetical order after $ID and $Type) and writes the grown item back into its list, instead of assuming every stored item has every key. Found by the end-to-end run on a fixture copy (alter menu on a menu document created by `create menu`); TestSetMenuItemIcon_InsertsAMissingKeyInStudioProOrder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
…robust on Podman-on-Windows Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
Conflicts in mdl/linter/context.go and starlark.go: main added a user role's description to the same struct literal and Starlark dict. Both sides kept. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
CHANGELOG.md conflict resolved by keeping both sides. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
…te-lint-rules skill Two of the PR's three corrections were already on main (entity_type, access_type), and its element_type line is now wrong (main lists the upper case values the catalog stores). The conflict keeps main's rows and takes the PR's module_role_name row: the catalog stores the qualified role name. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
… with mxcli init) cmd/mxcli/cmd_new.go has been reworked since the PR was opened (steps are now 1-7, with theme, layout and skip-build added). The conflict takes main's file and re-applies the PR's three lines: read the flag, set initContainerRuntime before initCmd.Run in step 5, register the flag. The example block gains the flag, as init's help has it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
…tainer mendixlabs#744 shipped without a test (its description says none covers the string). The test fails against main before #744: the chmod is unguarded and the image has no file package. Finding recorded. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
mendixlabs#1238 added check_security, manage_all_roles, manage_users_without_roles and manageable_roles to user_roles() without a test. A role that sets none of them is the control. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
…he reader's path Review follow-ups on mendixlabs#1552: - check consulted only the project's module list, so a script that creates module M and then changes `M.Assoc` was told M.Assoc is a member reached through an association. The script's own modules now count. - The writer test mocked GetModuleByName as (nil, nil), so moduleExists never consulted the module list, which is the branch production takes: the reader answers a missing module with an error. New table test on that path, with an unreadable list and a real module qualifier as controls. - backendRefusesModule sat between associationNamedInModule and its doc comment; moved above it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
mendixlabs#740 had no test. Asserts the flag exists on new with init's default, init's own flag being the reference. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
mendixlabs#1238 added four rows to the user_role table, which moved the sections after it. Regenerated with scripts/skill-index.py (make build). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
Adding one menu item no longer means restating the menu (mendixlabs#1522): `alter navigation <Profile> { … }` and `alter menu M.Menu { … }` splice the operations into the stored document and write it once, through UpdateRawUnitPatch and canon.Reconcile. applyMenuAlterOps is the one function that resolves every target (against the menu as the earlier operations left it), applies every refusal and drives the mutator: exec runs it and saves; `check -p --references` runs it on a mutator it never saves (validateAlterNavigationReferences), sharing it across successive alters of one document, so the two report the same refusal with the same message. A refusal stops before Save: the statement is atomic. Refused, each naming the statement, operation and target: a missing or ambiguous address (the ambiguity lists every candidate's shortest unique address) and an @n out of range; insert/move into an item that has an action, and an OnClick other than `nothing` on an item with sub-items (CE0548); a move into the item's own subtree or relative to itself; a bare `drop home page` (CE0527) and `drop home page for` a role with none; a native profile and a profile the project lacks (each says what to write instead); an unknown menu. Only what the statement states is validated: its fragment items and set values go through the checks `create navigation` runs (references, icons MDL077/MDL078, user roles) via a create-statement view of the alter; stored items it does not name are not re-judged. `list navigation menu` is now a table with an Address column, the shortest unique address of every item. Measured on copies of testdata/expr-checker (11.6.6) and a blank 11.15.0 app: insert before/after/into/top level with a nested fragment, drop, replace, move, set Caption/OnClick/Icon, set and drop of every page clause, and alter menu on a menu document each leave `mx check` at 0 errors, and a describe -> exec afterwards reports Unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
mendixlabs#1238's four user_role rows took the body to 701 lines and TestLargeSkillsWereSplit failed. manage_all_roles and manageable_roles are one grant (every role, or the listed ones), so they share a row; nothing is dropped. Index regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
fix(deps): raise klauspost/compress and go-mssqldb to their fixed versions klauspost/compress v1.19.2 -> v1.20.3 (GHSA-fpmh-frq8-7rj8, a zstd DecodeAll crash fixed in v1.20.2) and go-mssqldb v1.10.0 -> v1.11.2, clearing the second dependency scan that still blocked the customer's release after #1372. Adds TestExternalDriversRegistered to pin the blank-import driver registration, which had no coverage. mongo-driver v1 stays flagged for CVE-2026-107325, which has no fix on the v1 line; mxcli is not exposed, as the vulnerable bsoncore.Array .Validate is imported in no file. Clearing it needs the v1 bson imports moved to v2, tracked separately.
- `mxcli syntax navigation.alter` documented the describe/edit/re-run round trip; it now documents the statement. New topic navigation.menu-document.alter (alias menu.alter) for ALTER MENU; navigation.create and navigation.menu-document point at them instead of saying there is no way to clear a page clause or edit one item. - docs-site: the page titled ALTER NAVIGATION documented CREATE OR REPLACE NAVIGATION. It moves to create-navigation.md (CREATE [OR MODIFY] NAVIGATION, REPLACE named as the deprecated alias) and alter-navigation.md documents ALTER NAVIGATION: operations, addressing, page clauses, refusals. menu.md gains ALTER MENU; list-navigation.md the Address column; the language guide an ALTER NAVIGATION section. menu.md's note that glyph and image icons cannot be written was stale (all three kinds round-trip) and is corrected. - MDL_QUICK_REFERENCE: rows for alter navigation / alter menu; the navigation rows say create or modify. - manage-navigation skill: "Change One Item: ALTER NAVIGATION" is the default for editing an existing menu, "Adding a New Page to Navigation" uses it, and the detail (every operation, address rules, refusals, the two-level menu bar limit, CE0549) is in reference/alter-navigation.md; SKILL.md stays at 618 lines. Skill index regenerated. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
…#1522 repro mdl-examples/doctype-tests/navigation-alter.mdl has one block per operation - insert before/after/into/top level with a nested fragment, drop, replace, move, set Caption/OnClick/Icon (none, glyph, collection), set and drop of every page clause, and alter menu on a menu document - and restores the blank app's profile at the end. mdl-examples/bug-tests/1522-alter-navigation-adds-one-item.mdl is the reported case: adding one item to an existing menu keeps the others. Both pass `mxcli check -p --references` and exec on copies of testdata/expr-checker (11.6.6) and a blank 11.15.0 app, with `mx check` at 0 errors on each. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
af7ac9c shared one row between manage_all_roles and manageable_roles, and TestLintSkillDocumentsEveryStructField wants a row per field, so both read as undocumented. The rows are separate again, and the line comes from the blank line before the Validation section's code fence (a fence may follow a paragraph directly). Body is 700 lines. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
The conformance gate parses every ```sql block in the docs as MDL. The CREATE NAVIGATION and ALTER NAVIGATION synopses (and the SYNC fragment) are metasyntax, so they are fenced as ```text; the allowlist line the old alter-navigation.md needed is gone (it only shrinks). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3x8Fyvir8kLyPgJs1BDmF
Integrate wave 2 of the upstream PRs (mendixlabs/mxcli #744 #1238 mendixlabs#1552 #1128 #740), with review follow-ups. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01QiMsnXa9crge2qnSk9S7Zn
feat(navigation): alter navigation / alter menu — item-level menu edits
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#1493 and ako#1494.ako#1494 integrates five open contributor PRs that each needed a small change, and adds those changes on top so the PRs can land together. Each PR's own commits are kept unchanged. When this merges, GitHub should mark the five PRs as merged.
Integrated PRs
postCreateCommandtolerates a failingchmodon Podman-on-Windows, and the image installsfile(#742)user_roles()exposescheck_security,manage_all_roles,manage_users_without_rolesandmanageable_rolesdescriptionfield; kept bothchangeof a member reached through an association (Assoc.Attr) is refused incheck -pandexec. The message names the retrieve-then-change idiom (CE1613)module_role_nameis the qualified role namemodule_role_namerow is kept, and the staleelement_typerow is droppedmxcli new --container-runtimepasses through to init (#739)cmd_new.gowas reworked on main. Took main's file, re-applied the PR's 3 lines, and added a help exampleFollow-ups on top
checknow counts a module that the script creates further up.M.Assocover a just-createdMis no longer refused as a member reached through an association.Module.Associs still an association-set.newtakes init's--container-runtimeflag.user_roles()field and stays within the 700-line body bound.Dependencies (ako#1493)
A second scan of the published
.exe, run after the mongo-driver upgrade, still blocked a customer release.github.com/klauspost/compressv1.19.2 → v1.20.3 for GHSA-fpmh-frq8-7rj8, a zstdDecodeAllcrash.github.com/microsoft/go-mssqldbv1.10.0 → v1.11.2.TestExternalDriversRegisterednow pins that registration. Its control: with the import commented out, the test fails withdriver "sqlserver" is not registered.go.mongodb.org/mongo-driverv1 stays flagged for CVE-2026-107325. There is no fix on the v1 line: v1.17.10 is its last release, and the module is deprecated.Validation