This is a fix to pnpm deployment which needs testing as the final part of origin/master release
No functional changes
* fix(docs): remove stray tool-call tags breaking the MDX build
platform/docs/docs/migration-guide/3p12-to-3p13/build-tooling.md ended with
two orphan closing tags (leftover tool-call serialization artifacts):
</content>
</invoke>
Docusaurus compiles Markdown as MDX (JSX-aware), so the orphan closing tag
failed the docs build:
MDX compilation failed ... Unexpected closing slash in tag, expected an
open tag first (build-tooling.md line 402)
This was the remaining blocker for build-and-deploy-docs once the
--no-frozen-lockfile change let the install step succeed. A scan of the docs
tree found no other such artifacts. Verified locally: docusaurus build now
generates static files with no MDX errors.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Update lockfile and avoid freshness check on every command
* fix(release): keep workspace:* in the repo, concretize only at publish
The release flow rewrote internal @ohif/* dependency specifiers to the concrete
version and committed them, so pnpm-lock.yaml (which records workspace links)
drifted from the manifests on every version bump. The resulting
ERR_PNPM_OUTDATED_LOCKFILE broke every frozen install: Netlify (viewer-dev),
the docs deploy, pnpm's pre-run deps check, and post-merge installs.
Keep workspace:* everywhere in the committed repo and move the concrete-version
substitution to publish time only:
- publish-version.mjs: bump each package's own `version` field only; stop
rewriting @ohif/* dependency/peerDependency specifiers.
- publish-package.mjs: publish with `pnpm publish --no-git-checks` instead of
`npm publish`. pnpm rewrites workspace:* to the exact version in the published
tarball; npm would publish the literal "workspace:*", which npm/yarn consumers
cannot resolve.
- One-time: revert the 25 workspace manifests' @ohif/* specifiers to workspace:*
(version fields untouched) and regenerate pnpm-lock.yaml to match.
Because internal deps are workspace:* (links, not versions in the lockfile),
version bumps no longer change pnpm-lock.yaml, so it stays in sync and frozen
installs keep working.
Verified: `pnpm install --frozen-lockfile` passes, and `pnpm pack` of @ohif/core
emits a tarball whose @ohif/ui dependency is the exact version (3.13.0-beta.92),
not workspace:*.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs(ci): correct build-docs install comment for workspace:* release flow
publish-version.mjs no longer rewrites @ohif/* deps to concrete versions, so
the old comment was stale. Internal deps stay workspace:* and the lockfile
stays consistent; pnpm publish concretizes only the published tarball.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* ci(docs): use --frozen-lockfile now that the lockfile no longer drifts
With internal deps as workspace:* the lockfile stays in sync across version
bumps, so the docs deploy can install frozen -- failing fast on genuine
lockfile drift instead of silently reconciling. The --no-frozen-lockfile
workaround is no longer needed.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* ci: use --frozen-lockfile in CI install steps now that the lockfile is stable
Internal @ohif/* deps are workspace:* so pnpm-lock.yaml no longer drifts; the
UNIT_TESTS/BUILD/NPM_PUBLISH installs can run frozen and fail fast on genuine
drift. Kept --no-frozen-lockfile only where it is still required: the Dockerfile
(platform/docs is excluded from the build context) and the playwright CS3D-version
step (mutates @cornerstonejs versions before installing).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* test: stability of seg load mpr test
* Better drag fix for crosshairs
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Initial pnpm change
* Install/update in pnpm sort of works
* Attempt to fix install
* fix pnpm
* Refactor build process to use RSPack instead of Webpack across multiple extensions and modes. Update package.json scripts for development and production builds, and adjust webpack configuration files to accommodate new plugin imports and settings.
* Update RSPack dependencies to version 2.0.0 across the project, enhancing compatibility and performance. Refactor webpack configuration in multiple extensions and modes to utilize the new library structure for UMD output. Adjust package.json scripts and settings for improved build processes.
* Implement migration guide for OHIF 3.13, detailing the transition from Webpack to Rspack v2, the shift to pnpm workspaces, and the increase in minimum Node.js version to 24. Include new build commands, plugin replacements, and updates to package configurations across the monorepo.
* Fix some dev:fast bugs
* Move netlify to top level and remove webpack builds
* Update version script to deal with lerna missing
* chore(tests): Update multiple screenshot test images for various specs
* feat(screenshot-reviewer): Add screenshot review tool and update package.json scripts
* fix(DICOMSRDisplayTool): Improve actor presence check in viewport
* chore(tests): Update multiple screenshot assets for various specs
* chore(tests): Integrate waitForPaintToSettle and waitForViewportsRendered in multiple specs for improved rendering stability
* chore(tests): Update screenshot assets for SEGHydration and SEGNoHydration specs
* test: update progressive loading screenshots
* jest 30 test fixes for compatibility with pnpm cs3d
* Use correct setDisplaySets instead of setDataId
* fix: Naming change for LegacyVolumeViewport3D
* Update to allow tolerance for contour tests
* update
* fix
* refactor: Replace instanceof checks with utility functions for viewport type validation
* fix: Update createSegmentationForViewport to handle undefined displaySetInstanceUID gracefully
* bun lock
* chore(pnpm): align workspace setup to cornerstone3D and address PR review
- .npmrc / pnpm-workspace.yaml: mirror cs3d (node-linker hoisted,
strict-peer-dependencies=false, link/prefer workspace packages,
minimumReleaseAge, frozenLockfile); sync axios 1.17.0 + tmp override
- root: packageManager pnpm@11.4.0, engines pnpm >=11, wire preinstall.js
- restore preinstall.js (token/private-repo + CLAUDE->AGENTS symlink)
- playwright.yml: keep base CS3D-integration workflow, switch only the
package manager (bun/yarn -> pnpm) and node 20 -> 24
- webpack.base.js: revert prod devtool to source-map (drop hidden-source-map)
- remove @percy/cypress; .netlify + cli templates engines pnpm >=11
- Dockerfile pin pnpm@11; document tests/globalSetup.ts warmup
- drop dicom-sr -> measurement-tracking edge (breaks pnpm cyclic dep)
* chore(pnpm): regenerate lockfile and restore cs3d:* dev scripts
- Regenerate pnpm-lock.yaml against the resolved workspace (cycle removed,
cs3d 4.22.10, workspace:* internal deps).
- Restore cs3d:checkout/check/build/watch/install/link/unlink helper scripts
(dropped when taking the PR's root scripts), converted yarn -> pnpm since
the local cornerstone3D checkout is now pnpm too.
* Merge base branch issues
* Link ohif app
* ci: pin pnpm to 11.4.0 in action-setup (was version: latest)
version: latest floats across runs and breaks reproducibility. Pin to the repo's packageManager version (pnpm@11.4.0) in both playwright and build-docs workflows.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* fix: Accidental commit of .npmrc config
* Fix build issues
* build fix
* Dependency fixes
* fix: Dependency bug in app on extensions/modes
* Fix output configuration
* Replace percy screenshots with native cypress
* Remove percy screenshot entirely
* fix: Build issues
* force click to prevent canvas cover issues
* Enable swiftshader
* Update launch of electron
* fix: Broken size calculation
* Empty change to force a re-build
* fix(cypress): generate ui-next tailwind classes; drop unsupported electron arg
Tailwind only scanned @ohif/ui-next via ../../node_modules/@ohif/ui-next, which no longer resolves under the pnpm layout, so ui-next-unique classes (e.g. toolbar split-button sizing) were never generated. Those buttons' hit-boxes collapsed, producing Cypress 'covered by element' failures on toolbar interactions. Scan ui-next by direct filesystem path like ui/extensions/modes.
Also stop pushing --enable-unsafe-swiftshader into Electron's launchOptions.args (Electron ignores it and warns); it is supplied via ELECTRON_EXTRA_LAUNCH_ARGS in CI. The arg is still pushed for non-electron chromium (local chrome).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(e2e): disable dev-server overlay during coverage runs
The rspack dev-server client overlay injects an iframe (id=rspack-dev-server-client-overlay) that intercepts pointer events, causing Playwright/Cypress clicks on toolbar buttons to time out (e.g. MicroscopyPanel). Disable the overlay when COVERAGE=true (e2e/Playwright webServer) while keeping it for normal local dev.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* fix(microscopy): provide dicom-microscopy-viewer runtime assets
The microscopy viewer is loaded at runtime via peerImport('dicom-microscopy-viewer'), which fetches the copied asset served at /dicom-microscopy-viewer/. Two issues prevented those assets from reaching dist, so the viewer never initialized and drawing produced no measurement row:
1) dicom-microscopy-viewer was declared in no workspace package.json (only under libs/@cornerstonejs), so it was not installed at root node_modules and the pluginConfig copy source did not exist. Declare it (0.48.6, matching libs) in the microscopy extension.
2) createCopyPluginToDist appended the public/dist folder name to entries that specify an explicit directory, breaking the dicom-microscopy-viewer public entry (looked for .../dynamic-import/public). Use an explicit directory as-is; only append the folder name for package-derived entries.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* Update to pnpm 11.5.2 and cs3d 5.0.2
* Lock file
* fix: Update to newer versions of actions to try to fix hang
* Remove unnecessary version
* fix: Tests that are flaky
* PR comments
* Incorrect run name
* docs: Explain pluginConfig tooling
* Updated notes on pluginConfig and PR comments
* fix: resolve plugins in rsbuild build and fix directory-based asset copy
rsbuild.config.ts: merge getPluginResolveAliases() and an @ohif/app$ alias into resolve.alias, and add resolve.modules (root, platform/app, platform/ui node_modules) so extensions resolve their shared @ohif/* imports. Brings the rsbuild (dev:fast) path to parity with webpack.pwa.js / webpack.base.js.
writePluginImportsFile.js: treat a 'directory' on an extension/mode entry as the package root and copy its public/ and dist/ subdirs instead of the whole directory; public-section entries keep copying their directory verbatim via a new literalDirectory flag.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* refactor: share resolve alias/modules between webpack and rsbuild configs
Extract the resolve.alias (@ohif/app, @, @components, ...) and the node_modules search paths into .webpack/resolveConfig.js, the single source of truth consumed by both webpack.base.js (and every per-package webpack.prod/.dev.js that merges it) and rsbuild.config.ts. getModules(srcDir) appends the building package's own source root, preserving the previous per-package behavior. Ends the drift where the rsbuild path kept missing aliases/module paths that webpack.base.js already had.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* Add a timeout on git fetch and avoid all the unnecessary mirrros
* PR comments and tests
* Remove cache to prevent corrupting the cache key/setup.
* Fix stale/corrupted pnpm installer
---------
Co-authored-by: Alireza <ar.sedghi@gmail.com>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* chore(tests): Update multiple screenshot test images for various specs
* feat(screenshot-reviewer): Add screenshot review tool and update package.json scripts
* fix(DICOMSRDisplayTool): Improve actor presence check in viewport
* chore(tests): Update multiple screenshot assets for various specs
* chore(tests): Integrate waitForPaintToSettle and waitForViewportsRendered in multiple specs for improved rendering stability
* chore(tests): Update screenshot assets for SEGHydration and SEGNoHydration specs
* test: update progressive loading screenshots
* jest 30 test fixes for compatibility with pnpm cs3d
* Use correct setDisplaySets instead of setDataId
* fix: Naming change for LegacyVolumeViewport3D
* Update to allow tolerance for contour tests
* update
* fix
* refactor: Replace instanceof checks with utility functions for viewport type validation
* fix: Update createSegmentationForViewport to handle undefined displaySetInstanceUID gracefully
* bun lock
* fix: Install cs3d with pnpm instead of bun
* Update node version for playwright
* Update to v5.0.0 of cs3d
* fix: Build dependency
* audit
* Change to a web await retry assert
* Fix timing related test failures
* fix: Freehand close
---------
Co-authored-by: Bill Wallace <wayfarer3130@gmail.com>
* Add (better) assertions for area calculation fixes.
* Add SVG and measurement side panel area for freehand ROI test.
* Add Playwright viewport screenshot scope migration guide.
* Update cornerstonjs dependencies to 4.22.8. Ensure all versions of @babel/preset-env are 7.29.5.
---------
Co-authored-by: Ghadeer Albattarni <165973963+GhadeerAlbattarni@users.noreply.github.com>
* fix: Use newer ONNX version and load without errors
* Only changes to enable SAM again
* fix(seg hydration): auto-hydrate RT struct on second load with disableConfirmationPrompts (#5875)
* chore(version): Update package versions to 3.13.0-beta.34 [skip ci]
* fix(Threshold tool): Threshold tool no longer becomes deselected when the Dynamic option is selected (#5884)
fix(Threshold tool): Added 'ThresholdCircularBrushDynamic' to the toolNames array so the evaluator correctly recognizes it as an active state for the Threshold button when Dynamic mode is selected.
* chore(version): Update package versions to 3.13.0-beta.35 [skip ci]
* fix: Modalities in study list should select starts with as primary (#5886)
* chore(version): Update package versions to 3.13.0-beta.36 [skip ci]
* fix(security): Bump tar version to address CVE-2026-31802. (#5893)
* chore(version): Update package versions to 3.13.0-beta.37 [skip ci]
* fix(segmentation): Display "No description S:{series number} {modality}" for segmentations with no label. (#5874)
* Bump CS3D dependency to get the fallbackLabel field additions.
* chore(version): Update package versions to 3.13.0-beta.38 [skip ci]
* fix(window level): The window level value is not displayed by default on all the viewports when selecting common/custom layout and TMTV. (#5865)
* fix(window level): Set up listener for viewport availability such that the initial window level can be read and displayed.
* PR feedback.
* PR feedback.
---------
Co-authored-by: Bill Wallace <wayfarer3130@gmail.com>
* chore(version): Update package versions to 3.13.0-beta.39 [skip ci]
* fix(security): Bump flattened version to address CVE-2026-32141. (#5897)
* chore(version): Update package versions to 3.13.0-beta.40 [skip ci]
* fix(sr-hydration): enable hydration and arrow navigation for 3D SR measurements (#5887)
Joe is away, so approving based on the code having the requested change, and otherwise looking good/passing tests.
* fix(sr-hydration): enable hydration and arrows navigation for 3D SR measurements
* test: add automated test for SR measurement navigation with arrows after hydration
* add cross-study warning in the 3D branch
* test: address reviewer feedback for the test
* fix: support 3D and 2D annotations for SR hydration
* test: improve navigation to first image
---------
Co-authored-by: Bill Wallace <wayfarer3130@gmail.com>
* chore(version): Update package versions to 3.13.0-beta.41 [skip ci]
* feat: Add combined build (#5895)
* Add combined build
* Link script location update
* Security and validation fixes
* Allow specifying target path in PR description
* fix: Version match
* Fix build detection issue
* fix: Playwright deploy
* Separate out the branch merge guard
* Update docs and link info
* test: Update the layout change to wait for network idle
* Move audit late so the rest of the build can be worked on
* Add text with network check to ensure we see this change is updated
* Attempt to fix the mpr loading on ohif-downstream
* PR review comments
* Update docs
* Update to CS3D 4.20.0
* PR comments
* Add log on ohif-integration builds
* Update build test
* Removed unused space to kickoff build
* chore(version): Update package versions to 3.13.0-beta.42 [skip ci]
* fix(SR): Added support for spline and live wire SR items. (#5870)
* fix(SR): Added support for spline and live wire SR items.
* Apply suggestion from @greptile-apps[bot]
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
* Add a script to checkout a worktree for test builds
* fix: Allow download for testing sr validator
* Remove script that wasn't intended to be included
* Bump CS3D version.
* PR comments - simplify code and use single codepath for download
* Allow both download and save buttons for SEG and RTSTRUCT
---------
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: Bill Wallace <wayfarer3130@gmail.com>
* chore(version): Update package versions to 3.13.0-beta.43 [skip ci]
* chore(tests): contour segment interactions e2e tests - rename and togglevisibility (#5891)
* chore(version): Update package versions to 3.13.0-beta.44 [skip ci]
* chore(refactor): use public appConfig getter instead of private _appConfig field (#5923)
* chore(version): Update package versions to 3.13.0-beta.45 [skip ci]
* refactor(tests): update viewport page object usage to async and update all effected tests (#5927)
* chore(version): Update package versions to 3.13.0-beta.46 [skip ci]
* fix: prevent black viewport when navigating series with client-created segmentation (#5919)
* chore(version): Update package versions to 3.13.0-beta.47 [skip ci]
* fix(measurement): Restore viewport interactivity when deleting in-progress Spline or Livewire measurement (#5905)
* chore(version): Update package versions to 3.13.0-beta.48 [skip ci]
* fix(segmentation): restrict overlay segmentation menu to same frame of reference as viewport background display set (#5900)
- Add FrameOfReferenceUID to SEG and RTSTRUCT displaySet in SOP Class Handlers so the FOR is available for filtering
- Sync optimisticOverlayDisplaySets when background display set changes so the overlay menu reflects the correct state after a background switch
- Add FOR matching guard to the hydrate segmentation synchronizer to prevent the hydration synchronizer from blindly mirroring segmentations from a source viewport to a target viewport if their primary Frames of Reference do not align.
- fix segmentation overlay order reversal on viewport re-render
* chore(version): Update package versions to 3.13.0-beta.49 [skip ci]
* fix(security): update dependencies to fix security vulnerabilities (#5936)
* chore(version): Update package versions to 3.13.0-beta.50 [skip ci]
* fix(security): Update yarn.lock that was missed in PR #5936. (#5940)
* chore(version): Update package versions to 3.13.0-beta.51 [skip ci]
* feat(component): Adds SmartScrollbar to ui-next - OHIF-2558 (#5924)
Co-authored-by: Joe Boccanfuso <joe.boccanfuso@radicalimaging.com>
* fix(defaultRouteInit): pass sorted display sets to hanging protocol for deterministic viewport order (#5933)
fix: pass sorted display sets to hanging protocol for deterministic viewport order
The `applyHangingProtocol` function already sorts display sets by modality
priority and series number into `sortedDisplaySets`, but the unsorted
`displaySets` array was being passed to `hangingProtocolService.run()`.
This caused non-deterministic viewport ordering across page loads because
`displaySetService.getActiveDisplaySets()` returns display sets in creation
order, which depends on asynchronous network responses.
Made-with: Cursor
* chore(version): Update package versions to 3.13.0-beta.52 [skip ci]
* revert: rename DisplaySet.frameOfReferenceUID back to FrameOfReferenceUID (#5943)
* chore(version): Update package versions to 3.13.0-beta.53 [skip ci]
* fix(cornerstone): read FrameOfReferenceUID from display set in viewport service (#5950)
* chore(version): Update package versions to 3.13.0-beta.54 [skip ci]
* fix: ignore auth in git (#5955)
* chore(version): Update package versions to 3.13.0-beta.55 [skip ci]
* ONNX latest version
* chore(version): Update package versions to 3.13.0-beta.56 [skip ci]
* bun lock
* fix high sev mathjs issue
* Revert onnx changes
* Update to recent CS3D version
* Undo unneeded change
* Add null check
* Undo unneeded change
---------
Co-authored-by: Ghadeer Albattarni <165973963+GhadeerAlbattarni@users.noreply.github.com>
Co-authored-by: ohif-bot <danny.ri.brown+ohif-bot@gmail.com>
Co-authored-by: Joe Boccanfuso <109477394+jbocce@users.noreply.github.com>
Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com>
Co-authored-by: diattamo <mmddiatta@gmail.com>
Co-authored-by: Pedro Köhler <pedrokohlerbh@gmail.com>
Co-authored-by: Dan Rukas <dan.rukas@gmail.com>
Co-authored-by: Joe Boccanfuso <joe.boccanfuso@radicalimaging.com>
Co-authored-by: Alireza <ar.sedghi@gmail.com>
fix: Enhance multiframe instance handling and improve instance validation
- Updated `getDisplaySetInfo` to ensure local file frame imageIds resolve correctly, falling back to the source multiframe instance when necessary.
- Improved instance filtering in `isDisplaySetReconstructable` to handle undefined instances more robustly.
- Modified `App` prop types to make `routerBasename` optional and added new props for loading indicators and data sources.
- Refactored `CinePlayer` component to replace Button with a div for better accessibility and interaction.