From 3832cee358528cf2c269173c616dcd5af10020de Mon Sep 17 00:00:00 2001 From: Damian Reeves <957246+DamianReeves@users.noreply.github.com> Date: Wed, 27 May 2026 08:06:47 -0500 Subject: [PATCH 01/11] feat(mise): add setup:npm task to run npm ci --- .mise/tasks/setup/npm.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100755 .mise/tasks/setup/npm.ts diff --git a/.mise/tasks/setup/npm.ts b/.mise/tasks/setup/npm.ts new file mode 100755 index 000000000..c5dc364cd --- /dev/null +++ b/.mise/tasks/setup/npm.ts @@ -0,0 +1,8 @@ +#!/usr/bin/env bun +//MISE description="Install npm dependencies (npm ci)" + +import { exec, log } from "../_lib.ts"; + +log("setup:npm", "Installing npm dependencies..."); +await exec("npm", ["ci"]); +log("setup:npm", "Done"); From 6f08aa4542374c3227954ee5e6a874e715e9a717 Mon Sep 17 00:00:00 2001 From: Damian Reeves <957246+DamianReeves@users.noreply.github.com> Date: Wed, 27 May 2026 08:08:59 -0500 Subject: [PATCH 02/11] feat(mise): make setup:elm-tooling depend on setup:npm --- .mise/tasks/setup/elm-tooling.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/.mise/tasks/setup/elm-tooling.ts b/.mise/tasks/setup/elm-tooling.ts index b2582f7c0..f9830e0fb 100755 --- a/.mise/tasks/setup/elm-tooling.ts +++ b/.mise/tasks/setup/elm-tooling.ts @@ -1,5 +1,6 @@ #!/usr/bin/env bun //MISE description="Install Elm tooling" +//MISE depends=["setup:npm"] import { exec, log } from "../_lib.ts"; From 37f272ffad97f0960dc4c02a261afaf31fab9764 Mon Sep 17 00:00:00 2001 From: Damian Reeves <957246+DamianReeves@users.noreply.github.com> Date: Wed, 27 May 2026 08:13:23 -0500 Subject: [PATCH 03/11] feat(mise): include setup:npm in setup aggregate task --- .mise/tasks/setup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mise/tasks/setup.ts b/.mise/tasks/setup.ts index a79f872fd..4b2eb358e 100755 --- a/.mise/tasks/setup.ts +++ b/.mise/tasks/setup.ts @@ -1,6 +1,6 @@ #!/usr/bin/env bun //MISE description="Run all setup tasks" -//MISE depends=["setup:elm-tooling", "setup:morphir-jvm"] +//MISE depends=["setup:npm", "setup:elm-tooling", "setup:morphir-jvm"] import { log } from "./_lib.ts"; From 4a560a970b4a846b96bf5c778415851db990ef85 Mon Sep 17 00:00:00 2001 From: Damian Reeves <957246+DamianReeves@users.noreply.github.com> Date: Wed, 27 May 2026 08:15:43 -0500 Subject: [PATCH 04/11] docs: replace manual npm ci with mise run setup in Quick Start MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Update Quick Start to use 'mise run default' instead of separate mise install + npm ci - Update NPM Scripts section to reference mise run setup for all npm/tooling setup - Simplify Troubleshooting missing dependencies section to just 'mise run setup' The setup:npm task now handles npm ci automatically, integrated into the full mise task pipeline (default → setup → setup:npm). --- DEVELOPING.md | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/DEVELOPING.md b/DEVELOPING.md index 5db26b9b3..05e81988f 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -20,11 +20,7 @@ curl https://mise.run | sh # Trust the project configuration mise trust -# Install tools (node, bun) and dependencies -mise install -npm ci - -# Run the full build pipeline +# Install tools (node, bun) and all dependencies (npm ci, elm-tooling, etc.) mise run default ``` @@ -86,8 +82,8 @@ npm run build:cli # Build CLI only npm run build:cli2 # Build CLI2 only ``` -`npm ci` automatically runs `setup-elm-tooling` via the `prepare` hook, -which installs `elm`, `elm-test`, `elm-format`, and `elm-json` into +`mise run setup` handles all npm and tooling setup, including running the +`prepare` hook which installs `elm`, `elm-test`, `elm-format`, and `elm-json` into `node_modules/.bin/`. `mise.toml` prepends `./node_modules/.bin` to PATH so mise tasks resolve those binaries. @@ -184,7 +180,6 @@ mise run setup:elm-tooling ### Missing dependencies ```bash -npm ci mise run setup ``` From 973e9c54513baf2269896ea6841359cce17f4d1b Mon Sep 17 00:00:00 2001 From: Damian Reeves <957246+DamianReeves@users.noreply.github.com> Date: Wed, 27 May 2026 08:23:22 -0500 Subject: [PATCH 05/11] =?UTF-8?q?fix(ci):=20remove=20redundant=20npm=20ci?= =?UTF-8?q?=20step=20=E2=80=94=20mise=20run=20default=20handles=20it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also document setup:npm in DEVELOPING.md task table and project structure. --- .github/workflows/nodejs.yml | 3 --- DEVELOPING.md | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 149e28a5d..8e3f2ea66 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -47,9 +47,6 @@ jobs: restore-keys: | ${{ runner.os }}-elm- - - name: Download dependencies - run: npm ci - - name: Build run: npm run build --if-present diff --git a/DEVELOPING.md b/DEVELOPING.md index 05e81988f..858d73bfc 100644 --- a/DEVELOPING.md +++ b/DEVELOPING.md @@ -66,6 +66,7 @@ This project uses [mise](https://mise.jdx.dev/) with [Bun](https://bun.sh/) for | Task | Description | |------|-------------| +| `mise run setup:npm` | Install npm dependencies (`npm ci`) | | `mise run setup:elm-tooling` | Install Elm tooling binaries | | `mise run setup:morphir-jvm` | Clone and setup Morphir JVM SDK assets | @@ -114,6 +115,7 @@ test file. │ │ ├── integration.ts │ │ └── ... │ └── setup/ # Setup subtasks +│ ├── npm.ts │ ├── elm-tooling.ts │ └── morphir-jvm.ts cli/ # CLI v1 (Elm + JavaScript) From cc3e39f2fba4f504b84bef57602e547e579cf677 Mon Sep 17 00:00:00 2001 From: Damian Reeves <957246+DamianReeves@users.noreply.github.com> Date: Wed, 27 May 2026 08:36:05 -0500 Subject: [PATCH 06/11] fix(mise): build must depend on setup to prevent elm-not-found race Without this, mise ran setup and build tasks in parallel. build:check-elm-docs would fail with 'elm not found' because setup:elm-tooling hadn't finished yet. Previously masked by an explicit npm ci CI step that installed elm tooling before mise ran. Now that mise handles npm ci, the ordering must be explicit. --- .mise/tasks/build.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mise/tasks/build.ts b/.mise/tasks/build.ts index 3cbd09de9..4bc21b2b4 100755 --- a/.mise/tasks/build.ts +++ b/.mise/tasks/build.ts @@ -1,6 +1,6 @@ #!/usr/bin/env bun //MISE description="Run all build tasks" -//MISE depends=["build:check-elm-docs", "build:cli", "build:cli2", "build:treeview", "build:morphir-ts", "build:dev-server", "build:components", "build:try-morphir"] +//MISE depends=["setup", "build:check-elm-docs", "build:cli", "build:cli2", "build:treeview", "build:morphir-ts", "build:dev-server", "build:components", "build:try-morphir"] import { log } from "./_lib.ts"; From 486900300ee43242de899a20257cf8b1956c9960 Mon Sep 17 00:00:00 2001 From: Damian Reeves <957246+DamianReeves@users.noreply.github.com> Date: Wed, 27 May 2026 09:19:10 -0500 Subject: [PATCH 07/11] fix(mise): build:check-elm-docs must wait for setup:elm-tooling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit All other elm build tasks already depend on build:check-elm-docs, so this single dependency propagates the constraint through the entire build chain. Revert build.ts change from previous commit as it was the wrong fix — mise depends siblings run in parallel, so adding setup to build's depends list did not prevent build subtasks from racing against setup. --- .mise/tasks/build/check-elm-docs.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/.mise/tasks/build/check-elm-docs.ts b/.mise/tasks/build/check-elm-docs.ts index cfefcb95d..8b913c1b0 100755 --- a/.mise/tasks/build/check-elm-docs.ts +++ b/.mise/tasks/build/check-elm-docs.ts @@ -1,5 +1,6 @@ #!/usr/bin/env bun //MISE description="Check Elm documentation compiles" +//MISE depends=["setup:elm-tooling"] import { elmMake, log } from "../_lib.ts"; From 4a8fc630e857f7c8f5b656374a724c85ce69aea5 Mon Sep 17 00:00:00 2001 From: Damian Reeves <957246+DamianReeves@users.noreply.github.com> Date: Wed, 27 May 2026 09:31:12 -0500 Subject: [PATCH 08/11] fix(mise): sequence setup before build in default without polluting test deps MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previous approach (adding setup:elm-tooling to build:check-elm-docs) caused test:integration → build:cli → build:check-elm-docs → setup:elm-tooling → setup:npm, which re-ran npm ci during mise run test. npm ci wipes node_modules while test:unit runs elm-test in parallel → MODULE NOT FOUND. Instead: default.ts runs clean/checks/setup via depends (phase 1), then invokes mise run build in the script body (phase 2). Build tasks have no setup dependencies, so mise run test never triggers npm ci. --- .mise/tasks/build.ts | 2 +- .mise/tasks/build/check-elm-docs.ts | 1 - .mise/tasks/default.ts | 7 +++++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/.mise/tasks/build.ts b/.mise/tasks/build.ts index 4bc21b2b4..3cbd09de9 100755 --- a/.mise/tasks/build.ts +++ b/.mise/tasks/build.ts @@ -1,6 +1,6 @@ #!/usr/bin/env bun //MISE description="Run all build tasks" -//MISE depends=["setup", "build:check-elm-docs", "build:cli", "build:cli2", "build:treeview", "build:morphir-ts", "build:dev-server", "build:components", "build:try-morphir"] +//MISE depends=["build:check-elm-docs", "build:cli", "build:cli2", "build:treeview", "build:morphir-ts", "build:dev-server", "build:components", "build:try-morphir"] import { log } from "./_lib.ts"; diff --git a/.mise/tasks/build/check-elm-docs.ts b/.mise/tasks/build/check-elm-docs.ts index 8b913c1b0..cfefcb95d 100755 --- a/.mise/tasks/build/check-elm-docs.ts +++ b/.mise/tasks/build/check-elm-docs.ts @@ -1,6 +1,5 @@ #!/usr/bin/env bun //MISE description="Check Elm documentation compiles" -//MISE depends=["setup:elm-tooling"] import { elmMake, log } from "../_lib.ts"; diff --git a/.mise/tasks/default.ts b/.mise/tasks/default.ts index 6c8a60945..9200b0f8a 100755 --- a/.mise/tasks/default.ts +++ b/.mise/tasks/default.ts @@ -1,7 +1,10 @@ #!/usr/bin/env bun //MISE description="Full build pipeline (clean, check, setup, build)" -//MISE depends=["clean", "test:check-package-lock", "test:check-node-version", "setup", "build"] +//MISE depends=["clean", "test:check-package-lock", "test:check-node-version", "setup"] -import { log } from "./_lib.ts"; +import { exec, log, ROOT_DIR } from "./_lib.ts"; + +// setup has completed — now run build phase (elm requires node_modules from setup) +await exec("mise", ["run", "build"], { cwd: ROOT_DIR }); log("default", "Full build pipeline completed"); From 98d37fb6803ae851bf776f1a244c55c76ae6ad35 Mon Sep 17 00:00:00 2001 From: Damian Reeves <957246+DamianReeves@users.noreply.github.com> Date: Thu, 28 May 2026 01:29:11 -0500 Subject: [PATCH 09/11] chore(deps): bump elm-tooling to 1.17 and elm-format to 0.8.8 elm-tooling 1.17.0 adds Windows ARM64 support by pointing at the existing x86_64 binaries (which run under WoW64/Prism emulation), so `setup:elm-tooling` now actually installs elm/elm-format/elm-json/ elm-test-rs shims on win32-arm64 instead of silently skipping them. Also bumps elm-format to 0.8.8 (available since elm-tooling 1.16). --- elm-tooling.json | 2 +- package-lock.json | 8 ++++---- package.json | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/elm-tooling.json b/elm-tooling.json index 39fe1cde5..abd550d16 100644 --- a/elm-tooling.json +++ b/elm-tooling.json @@ -1,7 +1,7 @@ { "tools": { "elm": "0.19.1", - "elm-format": "0.8.7", + "elm-format": "0.8.8", "elm-json": "0.2.13", "elm-test-rs": "3.0.0" } diff --git a/package-lock.json b/package-lock.json index ef4ca564a..7416003bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,7 +57,7 @@ "@typespec/compiler": "^0.59.1", "del-cli": "^5.1.0", "elm-test": "^0.19.1-revision6", - "elm-tooling": "^1.15.0", + "elm-tooling": "^1.17.0", "json-schema": "^0.4.0", "node-elm-compiler": "^5.0.6", "package-json": "^8.1.1", @@ -3338,9 +3338,9 @@ } }, "node_modules/elm-tooling": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/elm-tooling/-/elm-tooling-1.15.1.tgz", - "integrity": "sha512-+rRYa7gzz6l2/Ip2i197MqkW5abOwPOP/+WlyyatLDeDhh+JR0HUMlZJYenCYodBeG/xW5xW3pRYQ2onf5bIAw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/elm-tooling/-/elm-tooling-1.17.0.tgz", + "integrity": "sha512-Y6umJYX7w/tV08pgmNF95nkvPq+xOvhirJz6LIt4YUj2I9V2W0V4Yb1E0IUZ/9X9yUgiEcFpKyObav4QMWCPrg==", "dev": true, "license": "MIT", "bin": { diff --git a/package.json b/package.json index 52cbd52a0..84a46546f 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "@typespec/compiler": "^0.59.1", "del-cli": "^5.1.0", "elm-test": "^0.19.1-revision6", - "elm-tooling": "^1.15.0", + "elm-tooling": "^1.17.0", "json-schema": "^0.4.0", "node-elm-compiler": "^5.0.6", "package-json": "^8.1.1", From dfe11303d33eacc1b624a38910cb60861b72ffcd Mon Sep 17 00:00:00 2001 From: Damian Reeves <957246+DamianReeves@users.noreply.github.com> Date: Thu, 28 May 2026 01:41:46 -0500 Subject: [PATCH 10/11] fix(mise): serialize elm builds to prevent ~/.elm cache race on Windows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Concurrent elm make processes on a cold ~/.elm package cache cause non-deterministic failures on Windows — elm's package store is not concurrent-write-safe. Fix: - build:cli runs CLI.elm then DevCLI.elm sequentially (same elm.json, would otherwise race on cold cache packages like elm/bytes, elm/file) - build:cli2, build:dev-server, build:try-morphir now depend on build:cli, so the cli/ package cache is fully warm before they start --- .mise/tasks/build/cli.ts | 20 +++++++++----------- .mise/tasks/build/cli2.ts | 2 +- .mise/tasks/build/dev-server.ts | 2 +- .mise/tasks/build/try-morphir.ts | 2 +- 4 files changed, 12 insertions(+), 14 deletions(-) diff --git a/.mise/tasks/build/cli.ts b/.mise/tasks/build/cli.ts index 75eb7d2ea..0598d296d 100755 --- a/.mise/tasks/build/cli.ts +++ b/.mise/tasks/build/cli.ts @@ -6,16 +6,14 @@ import { elmMake, log, PATHS } from "../_lib.ts"; log("build:cli", "Compiling CLI Elm modules..."); -// Build both CLI and DevCLI in parallel -await Promise.all([ - elmMake(["src/Morphir/Elm/CLI.elm"], { - cwd: PATHS.cli, - output: "Morphir.Elm.CLI.js", - }), - elmMake(["src/Morphir/Elm/DevCLI.elm"], { - cwd: PATHS.cli, - output: "Morphir.Elm.DevCLI.js", - }), -]); +// Sequential: concurrent elm make on a cold ~/.elm cache causes race conditions on Windows +await elmMake(["src/Morphir/Elm/CLI.elm"], { + cwd: PATHS.cli, + output: "Morphir.Elm.CLI.js", +}); +await elmMake(["src/Morphir/Elm/DevCLI.elm"], { + cwd: PATHS.cli, + output: "Morphir.Elm.DevCLI.js", +}); log("build:cli", "Done"); diff --git a/.mise/tasks/build/cli2.ts b/.mise/tasks/build/cli2.ts index e447dd175..dbb6bc6fc 100755 --- a/.mise/tasks/build/cli2.ts +++ b/.mise/tasks/build/cli2.ts @@ -1,6 +1,6 @@ #!/usr/bin/env bun //MISE description="Build CLI2 (TypeScript + Elm in parallel)" -//MISE depends=["build:check-elm-docs"] +//MISE depends=["build:cli"] import { elmMake, log, PATHS, join } from "../_lib.ts"; import { mkdir, rm } from "fs/promises"; diff --git a/.mise/tasks/build/dev-server.ts b/.mise/tasks/build/dev-server.ts index dcdd7f8bd..9f07fcc41 100755 --- a/.mise/tasks/build/dev-server.ts +++ b/.mise/tasks/build/dev-server.ts @@ -1,6 +1,6 @@ #!/usr/bin/env bun //MISE description="Build development server Elm components" -//MISE depends=["build:check-elm-docs"] +//MISE depends=["build:cli"] import { elmMake, log, PATHS } from "../_lib.ts"; diff --git a/.mise/tasks/build/try-morphir.ts b/.mise/tasks/build/try-morphir.ts index 773dacbd4..cd873f1c7 100755 --- a/.mise/tasks/build/try-morphir.ts +++ b/.mise/tasks/build/try-morphir.ts @@ -1,6 +1,6 @@ #!/usr/bin/env bun //MISE description="Build Try Morphir web app" -//MISE depends=["build:check-elm-docs"] +//MISE depends=["build:cli"] import { elmMake, log, PATHS } from "../_lib.ts"; From 7289dac9acb3c15b1e0658270d5a56a17d289b2a Mon Sep 17 00:00:00 2001 From: Damian Reeves <957246+DamianReeves@users.noreply.github.com> Date: Thu, 28 May 2026 01:47:53 -0500 Subject: [PATCH 11/11] fix(mise): build:morphir-ts must wait for build:cli2 (needs Morphir.Elm.CLI.cjs) --- .mise/tasks/build/morphir-ts.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.mise/tasks/build/morphir-ts.ts b/.mise/tasks/build/morphir-ts.ts index e9566e51b..a7380c5be 100755 --- a/.mise/tasks/build/morphir-ts.ts +++ b/.mise/tasks/build/morphir-ts.ts @@ -1,6 +1,6 @@ #!/usr/bin/env bun //MISE description="Build Morphir TypeScript library" -//MISE depends=["build:cli"] +//MISE depends=["build:cli", "build:cli2"] import { del, morphirMake, morphirGen, exec, log, PATHS, ROOT_DIR, copyGlob, join } from "../_lib.ts";