Open source

MuiLint, a Modern UI linter

Reports a Modern UI screen change that matches nothing, which fails the build, and a field the screen code does not declare, which does not show, while you edit and on the pull request.

MuiLint reports Modern UI screen problems while you are still editing, and again on the pull request, before Acumatica builds the screen.

When a screen change matches nothing, that build fails. When the screen code does not declare a field, the field does not show. You see both before that build.

What you get

  • The change that would fail the build, while the screen is still open.
  • The field that would not show, while you are still editing.
  • The same report from the command line and on the pull request.
  • Free and open. MIT-licensed, so you can read and change the source.

How it works

Modern UI customisations are extra screen files. Acumatica merges them into the stock screen when the site builds. MuiLint reads those files first. It reports the two problems above as you type, and again in the check on the pull request.

For developers

  • Version 0.4.0 (13 October 2026), MIT. Visual Studio 2022 and 2026, including the Web Tools and classic HTML editors. The web workload is not required. Acuminator covers the C# side. MuiLint covers the screen HTML and TypeScript.
  • Install the v0.4.0 VSIX from Manage Extensions, then restart.
  • CLI, with the .NET 8 SDK: dotnet run --project src/AISI.MuiLint.Cli -c Release -- path/to/FrontendSources/screen/src/development/screens. Point it at development/screens. The whole src folder reports every stock screen under AISI0003.
  • CI: AISI-Dev-Co/AISI.MuiLint@v0.4.0, with a path. Findings are annotations on the pull request. The job fails on errors. Warnings and suggestions do not fail a run unless .editorconfig raises them to error.
  • AISI0009 (warning) reports a selector that names a [name] or #id the stock screen, its extensions and the lines above do not have. The Modern UI build fails on a selector that matches nothing. Without the stock screen in the checkout, this finding stays quiet. It runs from the command line, the GitHub Action and Visual Studio, and not in the Roslyn analyser.
  • AISI0011 (warning) reports a view.bind, field, state.bind or control-state.bind the screen’s TypeScript does not declare. For a field, the message says it will not show up. A field marked unbound is not reported.
  • AISI0009, AISI0011, AISI0019 and AISI0024 stay quiet without the neighbouring files they read: the stock screen, the screen’s TypeScript, its other extensions and included files.
  • AISI0020 to AISI0022 need the site’s node_modules/client-controls.
  • AISI0027 to AISI0031 read the site Bin and source in App_RuntimeCode. Members added only at run time, such as Actions.Add, cannot be seen.