nx 22.2.0-canary.20251121-9a6c7ad → 22.2.0-canary.20251125-7e00ec4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/executors.json +16 -16
  2. package/generators.json +13 -13
  3. package/migrations.json +143 -143
  4. package/package.json +14 -11
  5. package/presets/npm.json +4 -4
  6. package/release/changelog-renderer/index.d.ts +1 -0
  7. package/release/changelog-renderer/index.d.ts.map +1 -1
  8. package/release/changelog-renderer/index.js +12 -12
  9. package/schemas/nx-schema.json +1285 -1285
  10. package/schemas/project-schema.json +359 -359
  11. package/schemas/workspace-schema.json +165 -165
  12. package/src/ai/constants.d.ts +6 -1
  13. package/src/ai/constants.d.ts.map +1 -1
  14. package/src/ai/constants.js +14 -3
  15. package/src/ai/set-up-ai-agents/schema.json +31 -31
  16. package/src/ai/set-up-ai-agents/set-up-ai-agents.d.ts.map +1 -1
  17. package/src/ai/set-up-ai-agents/set-up-ai-agents.js +41 -7
  18. package/src/command-line/release/utils/resolve-semver-specifier.d.ts +1 -1
  19. package/src/command-line/release/utils/resolve-semver-specifier.d.ts.map +1 -1
  20. package/src/command-line/release/utils/resolve-semver-specifier.js +3 -3
  21. package/src/command-line/release/utils/shared.d.ts +2 -1
  22. package/src/command-line/release/utils/shared.d.ts.map +1 -1
  23. package/src/command-line/release/utils/shared.js +27 -1
  24. package/src/command-line/release/version/derive-specifier-from-conventional-commits.js +1 -1
  25. package/src/command-line/report/report.d.ts +4 -0
  26. package/src/command-line/report/report.d.ts.map +1 -1
  27. package/src/command-line/report/report.js +72 -1
  28. package/src/core/graph/main.js +1 -1
  29. package/src/daemon/cache.d.ts +2 -1
  30. package/src/daemon/cache.d.ts.map +1 -1
  31. package/src/daemon/cache.js +10 -26
  32. package/src/daemon/client/client.d.ts +2 -0
  33. package/src/daemon/client/client.d.ts.map +1 -1
  34. package/src/daemon/client/client.js +53 -26
  35. package/src/daemon/is-nx-version-mismatch.d.ts +3 -0
  36. package/src/daemon/is-nx-version-mismatch.d.ts.map +1 -0
  37. package/src/daemon/is-nx-version-mismatch.js +24 -0
  38. package/src/daemon/server/server.d.ts.map +1 -1
  39. package/src/daemon/server/server.js +7 -18
  40. package/src/daemon/tmp-dir.d.ts.map +1 -1
  41. package/src/daemon/tmp-dir.js +1 -0
  42. package/src/executors/noop/schema.json +8 -8
  43. package/src/executors/run-commands/schema.json +187 -187
  44. package/src/executors/run-script/schema.json +25 -25
  45. package/src/nx-cloud/generators/connect-to-nx-cloud/schema.json +38 -38
  46. package/src/tasks-runner/pseudo-terminal.js +1 -1
  47. package/src/tasks-runner/task-orchestrator.d.ts +1 -0
  48. package/src/tasks-runner/task-orchestrator.d.ts.map +1 -1
  49. package/src/tasks-runner/task-orchestrator.js +22 -5
  50. package/src/utils/package-manager.d.ts +1 -0
  51. package/src/utils/package-manager.d.ts.map +1 -1
  52. package/src/utils/package-manager.js +4 -0
@@ -1,6 +1,7 @@
1
1
  import { ProjectGraph } from '../../../config/project-graph';
2
2
  import type { ReleaseGroupWithName } from '../config/filter-release-groups';
3
3
  import { GitCommit } from './git';
4
+ import { NxReleaseConfig } from '../config/config';
4
5
  export declare const noDiffInChangelogMessage: string;
5
6
  export type VersionData = Record<string, VersionDataEntry>;
6
7
  export interface VersionDataEntry {
@@ -54,7 +55,7 @@ export declare function shouldSkipVersionActions(dockerOptions: {
54
55
  }, projectName: string): boolean;
55
56
  export declare function createGitTagValues(releaseGroups: ReleaseGroupWithName[], releaseGroupToFilteredProjects: Map<ReleaseGroupWithName, Set<string>>, versionData: VersionData): string[];
56
57
  export declare function handleDuplicateGitTags(gitTagValues: string[]): void;
57
- export declare function getCommitsRelevantToProjects(projectGraph: ProjectGraph, commits: GitCommit[], projects: string[]): Promise<Map<string, {
58
+ export declare function getCommitsRelevantToProjects(projectGraph: ProjectGraph, commits: GitCommit[], projects: string[], nxReleaseConfig: NxReleaseConfig): Promise<Map<string, {
58
59
  commit: GitCommit;
59
60
  isProjectScopedCommit: boolean;
60
61
  }[]>>;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../../../../packages/nx/src/command-line/release/utils/shared.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAW7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAqB,MAAM,OAAO,CAAC;AAErD,eAAO,MAAM,wBAAwB,QAEpC,CAAC;AAGF,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,iBAAiB,EAAE;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,oBAAoB,EAAE,MAAM,CAAC;QAC7B,cAAc,EAAE,MAAM,CAAC;KACxB,EAAE,CAAC;CACL;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQrD;AAED,qBAAa,cAAc;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,OAAO,CAAC;gBAEV,EACV,OAAO,EAAE,qEAAqE;IAC9E,iBAAiB,EAAE,8EAA8E;IACjG,WAAW,GACZ,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB;CAQF;AAED,wBAAsB,aAAa,CAAC,EAClC,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,aAAa,GACd,EAAE;IACD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACnC,iBAsBA;AAED,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,oBAAoB,EAAE,EACrC,8BAA8B,EAAE,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EACtE,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,MAAM,GACpB,MAAM,EAAE,CA0GV;AAcD,wBAAgB,wCAAwC,CACtD,YAAY,EAAE,oBAAoB,GACjC,OAAO,GAAG,MAAM,CAElB;AAED,wBAAgB,wBAAwB,CACtC,aAAa,EAAE;IAAE,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;CAAE,EAC1D,WAAW,EAAE,MAAM,GAClB,OAAO,CAOT;AAED,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,oBAAoB,EAAE,EACrC,8BAA8B,EAAE,GAAG,CAAC,oBAAoB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,EACtE,WAAW,EAAE,WAAW,GACvB,MAAM,EAAE,CA6FV;AAeD,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAcnE;AAED,wBAAsB,4BAA4B,CAChD,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,SAAS,EAAE,EACpB,QAAQ,EAAE,MAAM,EAAE,GAEpB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,qBAAqB,EAAE,OAAO,CAAA;CAAE,EAAE,CAAC,CAAC,CAwC5E"}
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../../../../../packages/nx/src/command-line/release/utils/shared.ts"],"names":[],"mappings":"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"}
@@ -268,10 +268,36 @@ function handleDuplicateGitTags(gitTagValues) {
268
268
  process.exit(1);
269
269
  }
270
270
  }
271
- async function getCommitsRelevantToProjects(projectGraph, commits, projects) {
271
+ function isAutomatedReleaseCommit(message, nxReleaseConfig) {
272
+ // All possible commit message patterns based on config
273
+ const commitMessagePatterns = [
274
+ nxReleaseConfig.git.commitMessage,
275
+ nxReleaseConfig.version.git.commitMessage,
276
+ nxReleaseConfig.changelog.git.commitMessage,
277
+ ];
278
+ // Check if message matches any pattern
279
+ for (const pattern of commitMessagePatterns) {
280
+ if (!pattern)
281
+ continue;
282
+ // Split on {version}, escape each part for regex, then join with version pattern
283
+ const parts = pattern.split('{version}');
284
+ const escapedParts = parts.map((part) => part.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'));
285
+ const regexPattern = escapedParts.join('\\S+');
286
+ const regex = new RegExp(`^${regexPattern}$`);
287
+ if (regex.test(message)) {
288
+ return true;
289
+ }
290
+ }
291
+ return false;
292
+ }
293
+ async function getCommitsRelevantToProjects(projectGraph, commits, projects, nxReleaseConfig) {
272
294
  const projectSet = new Set(projects);
273
295
  const relevantCommits = new Map();
274
296
  for (const commit of commits) {
297
+ // Filter out automated release commits
298
+ if (isAutomatedReleaseCommit(commit.message, nxReleaseConfig)) {
299
+ continue;
300
+ }
275
301
  // Convert affectedFiles to FileChange[] format with proper diff computation
276
302
  const touchedFiles = (0, file_utils_1.calculateFileChanges)(commit.affectedFiles, {
277
303
  base: `${commit.shortHash}^`,
@@ -25,7 +25,7 @@ isPrerelease, latestMatchingGitTag, fallbackCurrentVersionResolver, preid) {
25
25
  // This should never happen since the checks above should catch if the current version couldn't be resolved
26
26
  throw new Error(`Unable to determine previous version ref for the projects ${affectedProjects.join(', ')}. This is likely a bug in Nx.`);
27
27
  }
28
- const projectToSpecifiers = await (0, resolve_semver_specifier_1.resolveSemverSpecifierFromConventionalCommits)(previousVersionRef, projectGraph, affectedProjects, nxReleaseConfig.conventionalCommits);
28
+ const projectToSpecifiers = await (0, resolve_semver_specifier_1.resolveSemverSpecifierFromConventionalCommits)(previousVersionRef, projectGraph, affectedProjects, nxReleaseConfig);
29
29
  const getHighestSemverChange = (semverSpecifiersItr) => {
30
30
  const semverSpecifiers = Array.from(semverSpecifiersItr);
31
31
  return semverSpecifiers.sort((a, b) => b - a)[0];
@@ -34,6 +34,10 @@ export interface ReportData {
34
34
  }[];
35
35
  migrateTarget: string;
36
36
  };
37
+ mismatchedNxVersions?: Array<{
38
+ version: string;
39
+ chain: string[];
40
+ }>;
37
41
  projectGraphError?: Error | null;
38
42
  nativeTarget: string | null;
39
43
  cache: {
@@ -1 +1 @@
1
- {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../../../../packages/nx/src/command-line/report/report.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,cAAc,EACf,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,WAAW,EAGZ,MAAM,0BAA0B,CAAC;AASlC,OAAO,EAAE,mBAAmB,EAAc,MAAM,sBAAsB,CAAC;AAQvE,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAYrC,eAAO,MAAM,mBAAmB,UAO/B,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAMpE,CAAC;AAIF;;;;;;;GAOG;AACH,wBAAsB,aAAa,kBAqKlC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,cAAc,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,WAAW,EAAE,CAAC;IAChC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,WAAW,EAAE,CAAC;IAChC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,0BAA0B,EAAE;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,EAAE,CAAC;IACJ,qBAAqB,CAAC,EAAE;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,EAAE,CAAC;QACJ,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,iBAAiB,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI,CAAC;CACV;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CA4DzD;AA6CD,UAAU,qBAAqB;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,EAAE,CAAC;IACJ,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,WAAW,GAChB,SAAS,GAAG,qBAAqB,CAgCnC;AAED,wBAAgB,6BAA6B,IAAI,WAAW,EAAE,CAO7D;AAED,wBAAgB,6BAA6B,IAAI,WAAW,EAAE,CAW7D;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,mBAAmB,YAQzE;AAED,wBAAgB,gCAAgC;;;IAe/C"}
1
+ {"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../../../../packages/nx/src/command-line/report/report.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,cAAc,EACf,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,WAAW,EAGZ,MAAM,0BAA0B,CAAC;AASlC,OAAO,EAAE,mBAAmB,EAAc,MAAM,sBAAsB,CAAC;AAUvE,OAAO,EAAE,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAYrC,eAAO,MAAM,mBAAmB,UAO/B,CAAC;AAEF,eAAO,MAAM,iCAAiC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAMpE,CAAC;AAIF;;;;;;;GAOG;AACH,wBAAsB,aAAa,kBAgMlC;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,cAAc,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,UAAU,EAAE,KAAK,GAAG,IAAI,CAAC;IACzB,gBAAgB,EAAE,WAAW,EAAE,CAAC;IAChC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,gBAAgB,EAAE,WAAW,EAAE,CAAC;IAChC,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,0BAA0B,EAAE;QAC1B,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,EAAE,CAAC;IACJ,qBAAqB,CAAC,EAAE;QACtB,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE;YAClB,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,EAAE,CAAC;QACJ,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,oBAAoB,CAAC,EAAE,KAAK,CAAC;QAC3B,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;IACH,iBAAiB,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI,CAAC;CACV;AAmED,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,CA+DzD;AA6CD,UAAU,qBAAqB;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,EAAE,CAAC;IACJ,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,WAAW,GAChB,SAAS,GAAG,qBAAqB,CAgCnC;AAED,wBAAgB,6BAA6B,IAAI,WAAW,EAAE,CAO7D;AAED,wBAAgB,6BAA6B,IAAI,WAAW,EAAE,CAW7D;AAED,wBAAgB,8BAA8B,CAAC,MAAM,EAAE,mBAAmB,YAQzE;AAED,wBAAgB,gCAAgC;;;IAe/C"}
@@ -21,6 +21,8 @@ const installed_plugins_1 = require("../../utils/plugins/installed-plugins");
21
21
  const installation_directory_1 = require("../../utils/installation-directory");
22
22
  const nx_json_1 = require("../../config/nx-json");
23
23
  const error_types_1 = require("../../project-graph/error-types");
24
+ const operators_1 = require("../../project-graph/operators");
25
+ const versions_1 = require("../../utils/versions");
24
26
  const nx_key_1 = require("../../utils/nx-key");
25
27
  const cache_1 = require("../../tasks-runner/cache");
26
28
  const nxPackageJson = (0, fileutils_1.readJsonFile)((0, path_1.join)(__dirname, '../../../package.json'));
@@ -47,7 +49,7 @@ const LINE_SEPARATOR = '---------------------------------------';
47
49
  *
48
50
  */
49
51
  async function reportHandler() {
50
- const { pm, pmVersion, nxKey, nxKeyError, localPlugins, powerpackPlugins, communityPlugins, registeredPlugins, packageVersionsWeCareAbout, outOfSyncPackageGroup, projectGraphError, nativeTarget, cache, } = await getReportData();
52
+ const { pm, pmVersion, nxKey, nxKeyError, localPlugins, powerpackPlugins, communityPlugins, registeredPlugins, packageVersionsWeCareAbout, outOfSyncPackageGroup, mismatchedNxVersions, projectGraphError, nativeTarget, cache, } = await getReportData();
51
53
  const fields = [
52
54
  ['Node', process.versions.node],
53
55
  ['OS', `${process.platform}-${process.arch}`],
@@ -137,6 +139,26 @@ async function reportHandler() {
137
139
  bodyLines.push('');
138
140
  bodyLines.push(`To fix this, run \`nx migrate ${outOfSyncPackageGroup.migrateTarget}\``);
139
141
  }
142
+ if (mismatchedNxVersions && mismatchedNxVersions.length > 0) {
143
+ bodyLines.push(LINE_SEPARATOR);
144
+ bodyLines.push(chalk.yellow('⚠️ Multiple Nx versions detected'));
145
+ bodyLines.push('');
146
+ bodyLines.push(`Your workspace uses nx@${versions_1.nxVersion}, but other packages depend on a different version:`);
147
+ for (const { version, chain } of mismatchedNxVersions) {
148
+ if (chain.length === 0) {
149
+ bodyLines.push(` - ${chalk.bold(`nx@${version}`)}`);
150
+ }
151
+ else {
152
+ bodyLines.push(` - ${chain.reverse().join(' → ')} → ${chalk.bold(`nx@${version}`)}`);
153
+ }
154
+ }
155
+ bodyLines.push('');
156
+ bodyLines.push('These packages should not have nx as a dependency. Please report this issue to the package maintainers.');
157
+ const whyCommand = (0, package_manager_1.getPackageManagerCommand)(pm).why;
158
+ for (const { version } of mismatchedNxVersions) {
159
+ bodyLines.push(`Run \`${whyCommand} nx@${version}\` for more details.`);
160
+ }
161
+ }
140
162
  if (projectGraphError) {
141
163
  bodyLines.push(LINE_SEPARATOR);
142
164
  bodyLines.push('⚠️ Unable to construct project graph.');
@@ -148,6 +170,53 @@ async function reportHandler() {
148
170
  bodyLines,
149
171
  });
150
172
  }
173
+ function findDependencyChain(graph, targetNode) {
174
+ const reversedGraph = (0, operators_1.reverse)(graph);
175
+ // BFS to find shortest path to root dependency
176
+ const queue = [
177
+ { node: targetNode, path: [] },
178
+ ];
179
+ const visited = new Set();
180
+ while (queue.length > 0) {
181
+ const { node, path } = queue.shift();
182
+ if (visited.has(node))
183
+ continue;
184
+ visited.add(node);
185
+ const deps = reversedGraph.dependencies[node] || [];
186
+ // Check for unvisited dependents
187
+ const unvisitedDeps = deps.filter((dep) => !visited.has(dep.target));
188
+ // No unvisited dependents - this is our shortest path
189
+ if (unvisitedDeps.length === 0) {
190
+ return path;
191
+ }
192
+ for (const dep of unvisitedDeps) {
193
+ const depName = graph.externalNodes?.[dep.target]?.data?.packageName ?? dep.target;
194
+ queue.push({
195
+ node: dep.target,
196
+ path: [...path, depName],
197
+ });
198
+ }
199
+ }
200
+ return [];
201
+ }
202
+ function findMismatchedNxVersions(graph) {
203
+ if (!graph || !graph.externalNodes) {
204
+ return [];
205
+ }
206
+ const result = [];
207
+ // Find all nx package versions that don't match the workspace version
208
+ for (const nodeName of Object.keys(graph.externalNodes)) {
209
+ const node = graph.externalNodes[nodeName];
210
+ if (node.data?.packageName === 'nx') {
211
+ const version = node.data.version || 'unknown';
212
+ if (version !== versions_1.nxVersion) {
213
+ const chain = findDependencyChain(graph, nodeName);
214
+ result.push({ version, chain });
215
+ }
216
+ }
217
+ }
218
+ return result;
219
+ }
151
220
  async function getReportData() {
152
221
  const pm = (0, package_manager_1.detectPackageManager)();
153
222
  const pmVersion = (0, package_manager_1.getPackageManagerVersion)(pm);
@@ -169,6 +238,7 @@ async function getReportData() {
169
238
  });
170
239
  }
171
240
  const outOfSyncPackageGroup = findMisalignedPackagesForPackage(nxPackageJson);
241
+ const mismatchedNxVersions = findMismatchedNxVersions(graph);
172
242
  const native = isNativeAvailable();
173
243
  let nxKey = null;
174
244
  let nxKeyError = null;
@@ -197,6 +267,7 @@ async function getReportData() {
197
267
  registeredPlugins,
198
268
  packageVersionsWeCareAbout,
199
269
  outOfSyncPackageGroup,
270
+ mismatchedNxVersions,
200
271
  projectGraphError,
201
272
  nativeTarget: native ? native.getBinaryTarget() : null,
202
273
  cache,