Conversation
Upgrade Node.js runtime across the monorepo: .nvmrc, package.json engines, Docker Compose images (node:24.14.0-alpine3.23), Dockerfiles, and CI workflows. Impact study results: - npm install: clean (npm 11.11.0) - All 4 app builds pass (api, frontend, cli, mcp-server) - All tests pass with --no-experimental-strip-types - All 29 lint targets pass - Known issue: Node 24 native TS stripping conflicts with Jest config loading Includes migrate-24_11.md with backport guide for proprietary repo. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Greptile SummaryThis PR upgrades Node.js from 22.17.0 to 24.14.0 across the entire monorepo — touching CI workflows, Dockerfiles, docker-compose files, NX configuration (21→22), Storybook (9→10), and all Key changes:
Outstanding items flagged: The Confidence Score: 4/5Safe to merge for CI/build paths; Docker image builds may fail due to the unverified openssl pin, which should be validated before merging. All CI test jobs, lint, and application builds are correctly updated and verified by the author. The one outstanding P1 concern is the openssl=3.5.5-r0 pin in both Dockerfiles, which is an acknowledged TODO and was not covered by the testing matrix — if that exact package revision does not exist in Alpine 3.23's repos the Docker build pipeline will hard-fail. The P2 findings (digest pin removal, npm version inconsistency) are minor. Once the OpenSSL pin is confirmed or corrected this is ready to merge. dockerfile/Dockerfile.api and dockerfile/Dockerfile.mcp — openssl version pin needs verification against Alpine 3.23 package index before Docker builds are run Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[Push / PR] --> B[build.yml]
A --> C[quality.yml]
A --> D[docker.yml - hadolint]
B --> B1["nx build api\nNODE_OPTIONS: --max-old-space-size + --no-experimental-strip-types"]
B --> B2["nx test api/frontend/mcp/packages/cli\nNODE_OPTIONS: --max-old-space-size + --no-experimental-strip-types"]
C --> C1[lint-and-format]
C --> C2[sonarqube]
D --> D1["hadolint\n(all branches)"]
D --> D2["build-scan-push\n(main + release tags only)"]
B & C --> E[docker.yml - build-scan-push]
E -->|main/release only| F["Build Docker images\nFROM node:24.14.0-alpine3.23\napk add openssl=3.5.5-r0"]
F --> G[Scan and Push to DockerHub]
style F fill:#ffe0b2,stroke:#e65100
style D1 fill:#e8f5e9,stroke:#2e7d32
Reviews (11): Last reviewed commit: "Upgrade esbuild-loader dep" | Re-trigger Greptile |
… workflow Node 24 enables native TypeScript stripping by default, which conflicts with Jest's own TS config loading (require() in .ts files, extensionless imports). Append --no-experimental-strip-types to all NODE_OPTIONS in build.yml to restore previous behavior. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Docker image node:24.14.1-alpine3.23 does not exist - Align all config files with the available 24.14.0 image Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The pinned version openssl=3.5.5-r0 does not exist in Alpine 3.23, causing Docker builds to fail at the apk add step. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Remove branch gate on docker job in main.yml - Remove job-level if condition in docker.yml - Push steps retain their own ref guards (main/release only) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove phantom workspace references to non-existent packages/linter-ast/parsers/* and regenerate lockfile with npm 11.9.0 (Node 24.14.0) to fix "invalid or damaged lockfile" CI errors. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Rename SiNuxtdotjs to SiNuxt (react-icons API change) - Fix Chakra UI variant type mismatches in PMLink, PMButton, PMIconButton, and PMHeading using Omit + cast pattern for custom variants not in Chakra's base types Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Pin openssl=3.5.5-r0, bash=5.3.3-r1, ca-certificates=20251003-r0 - Fixes hadolint DL3018 warnings in Dockerfile.api and Dockerfile.mcp Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…tore Docker hardening (#271) * 📦 deps(nx): upgrade Nx from 21.6.8 to 22.6.0 - Bump all @nx/* packages and nx to 22.6.0 - Upgrade storybook from v9 to v10 (10.3.3) - Add @nx/vitest plugin; move vitest testTargetName from @nx/vite - Convert all jest.config.ts from ESM to CJS (require/module.exports) - Fix require('../../jest-utils') → require('../../jest-utils.ts') for Node.js resolution - Update story files to import from @storybook/react-vite instead of @storybook/react (Storybook v10 rule) - Allow require() in jest.config.ts via ESLint override - Fix getAbsolutePath return type any → string in .storybook/main.ts - Bump @nx/devkit in tools/packmind-plugin/package.json to 22.6.0 - Add .claude/worktrees and .claude/settings.local.json to .gitignore Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * 📦 deps: deduplicate workspace dependencies across packages (#270) Remove external dependencies from child package.json files that are already declared in root, fixing version drift and reducing maintenance burden. Key changes: - Removed ~48 redundant dependency declarations across 21 packages - Fixed version mismatches (uuid, bullmq, slug, codemirror in skills/node-utils/ui) - Standardized @packmind/* internal deps from pinned 0.0.1 to wildcard * - Removed unnecessary devDependencies already provided by root Co-Authored-By: Claude <noreply@anthropic.com> https://claude.ai/code/session_018K74TaQrsXvK3qnvR9t2Ma Co-authored-by: Claude <noreply@anthropic.com> * 🔒️ security(docker): restore apk hardening and fix misleading CI comment - Restore rm -rf /sbin/apk in Dockerfile.api and Dockerfile.mcp after apk add to prevent runtime package installation (P1 Greptile fix) - Fix misleading comment in docker.yml: build-scan-push runs on main and release branches only, not all branches (P2 Greptile fix) - Add missing newline at end of .gitignore (P2 Greptile fix) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
|
Update your review @greptile |
* 📦 deps(vite): upgrade Vite 6 → 8.0.3 with ecosystem updates - Bump vite ^6.3.6 → ^8.0.3 - Bump @vitejs/plugin-react ^4.2.0 → ^5.2.0 (Vite 8 support) - Bump all @nx/* packages 22.6.0 → 22.6.3 (adds Vite 8 peer dep) - Bump nx 22.6.0 → 22.6.3 - Bump @react-router/* packages ^7.12.0 → ^7.14.0-pre.0 (first release with Vite 8 support) - Install @emotion/react (missing peer dep of @chakra-ui/react, previously silently ignored by Rollup; Rolldown now errors) - Remove build.commonjsOptions (no-op in Vite 8) from frontend and ui configs - Rename build.rollupOptions → build.rolldownOptions in packages/ui config - Fix tsconfigPaths plugin call syntax in packages/ui config (tsconfigPaths → tsconfigPaths()) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * 🐛 fix(frontend): align MemoryRouter import with react-router v7 - RuleDetails uses useSearchParams from 'react-router' but test imported MemoryRouter from 'react-router-dom' (different package version), causing missing router context in tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🔧 chore(frontend): remove deprecated ts-jest isolatedModules option - Remove isolatedModules from jest.config.ts as it's already set in tsconfig.spec.json - Eliminates ts-jest deprecation warning about isolatedModules being removed in v30 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * ⚡ perf(frontend): decouple frontend build from backend packages Move test factories used by frontend specs into @packmind/test-utils to break the transitive dependency chain (frontend → deployments → node-utils). This reduces frontend build dependencies from 16 to 5 packages. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🔧 chore(ci): trigger build on all PRs regardless of target branch Remove the `branches: ['main']` filter on `pull_request` so the CI pipeline runs on PRs targeting any branch, not just main. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 📦 deps: update package-lock.json for Vite 8 upgrade * 🔧 chore: fix all lint errors across the monorepo Disable @nx/enforce-module-boundaries for jest.config.ts files, allow @packmind/test-utils in browser spec files, update @nx/devkit version, and remove stale eslint-disable directives. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 💄 style: format jest configs and UI tooling with prettier Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix(frontend): deduplicate react-router to fix invalid hook call Align react-router-dom to ^7.14.0-pre.0 across root and frontend package.json to prevent npm from nesting a second react-router copy. Add resolve.dedupe for React packages in Vite config as safety net. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix(frontend): remove react-router-dom to fix duplicate router context react-router-dom was causing @react-router/dev to pre-bundle it as a separate optimized dep from react-router, creating two copies of the router context. Since all imports use react-router directly (v7 pattern), react-router-dom is unnecessary. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * 🐛 fix(frontend): enable unstable_optimizeDeps to prevent mid-session re-optimization Vite 8 lazily discovers new deps when navigating to routes, causing the optimizer to re-run and create chunks with different version hashes. Old and new chunks coexist, splitting react-router context. Enabling unstable_optimizeDeps adds all route files as optimizeDeps entries so all deps are discovered upfront at startup. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * Add migration script --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
|
Too many files changed for review. ( |
- Update all Docker images to match .nvmrc/package.json/CI pin (24.14.1) - Prevent mixed 24.14.0/24.14.1 runtime inconsistencies Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reorder nx reset before .nx removal, add cleanup for coverage, test-results, .swc, .docusaurus, docs, tmp, vite/vitest timestamp files, graph.json, tsconfig.base.effective.json, and package-lock.json. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…24 compat @sinonjs/fake-timers in Node 24 no longer supports string parsing in the faked Date constructor. Pass pre-computed milliseconds instead. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Ensures containers are fully removed during workspace cleanup, not just stopped. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove caret range to prevent npm from resolving 1.59.1, which mismatches the Docker image pinned at v1.58.2-jammy. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- .nvmrc, package.json, package-lock.json - docker-compose.yml, docker-compose.production.yml - Dockerfile.api, Dockerfile.mcp - GitHub Actions workflows (main, publish-cli-release, tmp-cli-lint-windows) - migrate_node24.sh - apps/api/docker-package.json Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…tion Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…leak
Chakra UI v3 Dialog needs proper open/close lifecycle to clean up its
portal and pointer-events on <html>. Conditional unmount via
{inviteUserOpened && ...} prevented cleanup, leaving the backdrop stuck.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- exec NX_DAEMON=false is invalid sh syntax (exec interprets it as command name) - Replace with export NX_DAEMON=false; exec across frontend, backend, mcp-server Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|



Explanation
Upgrade Node.js runtime from 22.17.0 to 24.14.0 across the entire monorepo: version pins, Docker images, CI workflows, and Dockerfiles.
Type of Change
Affected Components
NODE_OPTIONS="--no-experimental-strip-types"for test runsTesting
Test Details:
npm install(npm 11.11.0)nx build api[DEP0180] fs.Stats deprecatedwarning)nx build frontend[MODULE_TYPELESS_PACKAGE_JSON]warning)nx build packmind-clinx build mcp-server--no-experimental-strip-typesKnown issue: Node 24 enables
--experimental-strip-typesby default, which conflicts with Jest's TypeScript config loading. Workaround:NODE_OPTIONS="--no-experimental-strip-types". This needs to be added to CI test jobs.TODO List
--no-experimental-strip-typesto CI test workflowsReviewer Notes
migrate-24_11.mdcontains the backport guide for the proprietary repopackage-lock.jsondiff is minimal (engine field + some optional peer dep cleanup by npm 11)🤖 Generated with Claude Code