docker build, TUI checker and eval runner no longer write to the project - #966
Merged
Merged
Conversation
…structure and the catalog (#963) list workflows and show structure recursed over outcome flows only and skipped boundary-event flows and event sub-processes, so TestApp Workflow1 listed 5 activities where the catalog counted 8. The catalog's walk moves to wfnames.WalkActivities/CountActivities and all three use it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…g create/change (#963) commit $Order on a loop variable wrote no refs row because refs had no commit kind. A commit action, or a create/change with commit Yes/YesWithoutEvents, now emits FLOW -> ENTITY 'commit', resolved through the same intra-flow variable map as change/delete. It stays out of the analysis graph and the caller kinds. The ref_kind skill test now reads every RefKind constant, so a new kind cannot ship undocumented. Catalog schema version 19. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion widgets_data gains ParentWidgetId (nearest indexed ancestor, so skipped wrappers, layout grid rows/columns, tab pages and pluggable property / object-list items are transparent), Depth (0 at the page or snippet root; a list view template is a level), Class, Style, DynamicClasses, ActionType (raw $Type of Action, else OnClickAction, else ClickAction) and HasConfirmation (ConfirmationInfo on a microflow/nanoflow/workflow call). Catalog schema 19. Tested on hand-built shapes and on Studio Pro-authored TestApp pages. mendixlabs#1268 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gets() widgets() structs gain parent_widget_id, depth, class_name, style, dynamic_classes, action_type, has_confirmation and page_ref. mendixlabs#1268 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The widget table moves to write-lint-rules/catalog-tables.md (SKILL.md was over the 700-line bound) with an example rule for inline styles, a class allow-list and direct delete buttons. The vocabulary test scopes action_type per section (activity vs widget), holds documented widget action types to codec-registered storage names, and pins that only flow calls carry a ConfirmationInfo. mendixlabs#1268 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ction' into c24-965 # Conflicts: # CHANGELOG.md # mdl/catalog/tables.go
#963's commit refs and mendixlabs#1268's widget columns both bumped 18 -> 19 on parallel branches. A cache built at 19 by either alone would never rebuild for the other, the 15/16 collision again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The TUI checker (after every change) and the eval runner's mx_check ran a plain `mx check <project>`, which writes theme-cache/web/ and deployment/sass/ into the project. Measured with mx 11.14 on a v1 and a v2 copy of the testapp: the model is left alone, those two folders are added. New docker.MxCheckOnCopy runs `mx check` on copyProjectToTemp's copy (the #956 helper, renamed now that it is not check-only) with output paths rewritten to the project's, and applies PrepareMxCommand, which these two callers lacked. mxCheckCmd takes extra args for the TUI's -j/-w/-d. Part of #961. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tory `docker build` (and docker run / reload, which call it) ran update-widgets on the project under a snapshot that restored only MPRv2 storage, then mx check and MxBuild on the project itself. Measured on the 11.14 testapp: an MPRv1 .mpr was rewritten, every MPRv2 .mxunit was rewritten and put back with new mtimes, and theme-cache/, deployment/, 160 javasource/ proxies, the .launch file, .classpath and .project were written into it. buildOnCopy now runs all three tools on one copyProjectToTemp copy and writes only the PAD output directory (absolute, default .docker/build). MxBuild still sees the widget-normalised model, from the copy. The PAD differs from an in-place build in the same 9 files in which two in-place builds of identical copies differ (cache-bust stamps, operation ids, native metro paths), and the rebuild time is unchanged (58s vs 59s). runUpdateWidgets (the v2 snapshot) has no caller left and is removed with its tests; build_readonly_test.go covers v1 and v2 with stub tools, and TestBuild_LeavesProjectUntouched with real mx and MxBuild. Part of #961. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…c24-966 # Conflicts: # CHANGELOG.md
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.
Closes #961.
Before (measured)
Whole-tree sha256 + mtime diff before/after, on copies of
testdata/testapp(11.14, real mx from~/.mxcli/mxbuild/11.14.0). The v1 copy was made withmx update-widgets.docker buildTestApp.mprrewritten (mtime; content too when widgets are stale).theme-cache/web/,deployment/(~680 files), 160javasource/proxies,.classpath,.projectadded.TestApp.launchcontent changed.mprcontents/*.mxunitrewritten and restored with new mtimes.mx check -j … -w -d)theme-cache/web/anddeployment/sass/added. Model untouched.mx check)Fix
docker build(anddocker run/docker reload, which callBuild): newbuildOnCopyrunsmx update-widgets,mx checkand MxBuild on one temporary copy. It reuses fix: docker check never modifies the project; atomic catalog cache save (#951) #956's helper, renamedcopyProjectToTemp. Only the PAD output directory is written (absolute path, default.docker/build). The output says so up front. MxBuild still gets the widget-normalised model, from the copy.index.htmletc.,operationIds,ModelRuntimeCompatibilityHash/model.mdp, and the absolute paths innative/metro.config.js/styles.js). So the outputs are equivalent up to MxBuild's own nondeterminism.deployment/.runUpdateWidgets(the v2-only snapshot) has no caller left, so it is removed with its 4 tests.snapshotStorageFormatstays forharvest.go.deployment/is no longer refreshed bydocker build. Nothing reads it there:run --localruns its own deploy build.--help,docs-site/.../docker-build.mdandmxcli fix widgets --help(which still described the old snapshot) are updated.docker.MxCheckOnCopy(mxPath, mpr, args, stdout, stderr)runsmx checkon a copy and rewrites output paths. Both callers use it. They also gainPrepareMxCommand(FreeType LD_PRELOAD), which they lacked.Other mx/mxbuild invocations against a project (classified)
docker check(check.go)docker build/run/reload, testrunner'sdocker build --skip-checkmx_checkmxcli fix widgets/fix design-properties(RunToolPreservingFormat)marketplace install(mx module-import,cmd_marketplace_install.go)marketplace/scratch.go(create-project,module-import)mxcli new(create-project,SettleGeneratedSources=mxbuild --target=deploy)SyncJavaDependencies(mx sync-java-dependencies)vendorlib/run --local(mxbuild --serve, deploy target)deployment/,javasource/proxiesTest plan
TestBuildOnCopy_DoesNotModifyProject(v1, v2 × default /--no-update-widgets/--skip-check/--dry-run). Stub update-widgets, check and MxBuild write into their target the way the real tools do. The test asserts:.docker/is byte- and mtime-identicalTestBuildOnCopy_CheckFailureStopsBeforeMxBuildTestRunMxCheck_DoesNotModifyProject(tui; stubmxscript on PATH, v1/v2, JSON result still parsed)TestCheckMxCheck_DoesNotModifyProject(evalrunner; v1/v2 × pass/fail, detail names the project path)TestMxCheckOnCopy_LeavesProjectUntouched(11.14, v1+v2).TestBuild_LeavesProjectUntouchedis a full MxBuild, v1+v2. It ran with 11.13, because 11.14's blank app needs JDK 25, which this box lacks, so it skips there. ExistingTestBuild_PreservesMPRv2StorageFormatandTestCheck_LeavesProjectUntouchedpass.buildOnCopyback at the project fails withchanged App.mpr, theme-cache,.launch,added deployment/…,javasource/…/proxies,.classpath, and removedmprcontents/…on v2.main'sbuild.go+update_widgets.gofailsTestBuild_LeavesProjectUntouchedon v1 and v2:App.mprchanged, 370mprcontentschanged, 992deploymentadded, 216javasourceadded,.launch/.classpath/.projectadded.main'schecker.go/checks.gofails both tests withtheme-cache/web/theme.compiled.cssanddeployment/sass/main.scssadded.mxcli docker buildon the v1 and v2 testapp copies. The only change in the project is.docker/(4647 files added). Both exit 0.go test ./cmd/mxcli/docker/ ./cmd/mxcli/tui/ ./cmd/mxcli/evalrunner/ ./cmd/mxcli/,make build,make lint,make check-conformance,make check-findingsFinding appended to
cmd-mxcli.jsonl.docs-wiki/bug-patterns/package-operations-damage.mdgets a paragraph on the recurring class (#763 → #808 → #951 → #961). CHANGELOG entry under Unreleased/Fixed.Follow-ups
marketplace install's baremx module-importon the project was not re-audited for the v2→v1 collapse here.native/metro.config.jsnow carries the temporary copy's path instead of the project's. Neither path exists inside the container, and the web runtime does not use these files.🤖 Generated with Claude Code