nx 23.2.0-beta.0 → 23.2.0-beta.10

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 (374) hide show
  1. package/dist/bin/init-local.js +3 -5
  2. package/dist/bin/nx.js +3 -1
  3. package/dist/release/changelog-renderer/index.js +4 -5
  4. package/dist/release/index.d.ts +1 -1
  5. package/dist/src/adapter/ngcli-adapter.js +60 -1
  6. package/dist/src/ai/set-up-ai-agents/set-up-ai-agents.js +35 -15
  7. package/dist/src/analytics/analytics.d.ts +6 -0
  8. package/dist/src/analytics/analytics.js +16 -10
  9. package/dist/src/analytics/index.d.ts +1 -1
  10. package/dist/src/analytics/index.js +2 -1
  11. package/dist/src/command-line/add/add.js +5 -0
  12. package/dist/src/command-line/affected/affected.js +1 -0
  13. package/dist/src/command-line/completion/command-object.js +7 -12
  14. package/dist/src/command-line/configure-ai-agents/configure-ai-agents.js +19 -25
  15. package/dist/src/command-line/format/format.js +84 -101
  16. package/dist/src/command-line/generate/generate.js +35 -35
  17. package/dist/src/command-line/graph/graph.d.ts +1 -0
  18. package/dist/src/command-line/graph/graph.js +15 -6
  19. package/dist/src/command-line/import/import.js +30 -40
  20. package/dist/src/command-line/init/ai-agent-prompts.d.ts +1 -1
  21. package/dist/src/command-line/init/ai-agent-prompts.js +12 -17
  22. package/dist/src/command-line/init/command-object.js +14 -4
  23. package/dist/src/command-line/init/configure-plugins.js +4 -1
  24. package/dist/src/command-line/init/implementation/add-nx-to-monorepo.js +12 -32
  25. package/dist/src/command-line/init/implementation/add-nx-to-nest.js +17 -21
  26. package/dist/src/command-line/init/implementation/add-nx-to-npm-repo.js +8 -21
  27. package/dist/src/command-line/init/implementation/add-nx-to-turborepo.js +3 -17
  28. package/dist/src/command-line/init/implementation/angular/index.js +10 -15
  29. package/dist/src/command-line/init/implementation/angular/integrated-workspace.js +2 -5
  30. package/dist/src/command-line/init/implementation/angular/legacy-angular-versions.js +5 -0
  31. package/dist/src/command-line/init/implementation/angular/standalone-workspace.js +8 -2
  32. package/dist/src/command-line/init/implementation/check-compatible-with-plugins.js +2 -0
  33. package/dist/src/command-line/init/implementation/dot-nx/add-nx-scripts.js +9 -1
  34. package/dist/src/command-line/init/implementation/format.d.ts +18 -0
  35. package/dist/src/command-line/init/implementation/format.js +114 -0
  36. package/dist/src/command-line/init/implementation/utils.js +8 -0
  37. package/dist/src/command-line/init/init-v1.js +15 -18
  38. package/dist/src/command-line/init/init-v2.js +40 -57
  39. package/dist/src/command-line/migrate/agentic/definitions.js +36 -9
  40. package/dist/src/command-line/migrate/agentic/handoff-gitignore.d.ts +37 -22
  41. package/dist/src/command-line/migrate/agentic/handoff-gitignore.js +30 -39
  42. package/dist/src/command-line/migrate/agentic/handoff.d.ts +7 -7
  43. package/dist/src/command-line/migrate/agentic/handoff.js +13 -10
  44. package/dist/src/command-line/migrate/agentic/print-dropped-agent-context.d.ts +7 -12
  45. package/dist/src/command-line/migrate/agentic/print-dropped-agent-context.js +7 -0
  46. package/dist/src/command-line/migrate/agentic/run-step.d.ts +10 -0
  47. package/dist/src/command-line/migrate/agentic/run-step.js +1 -0
  48. package/dist/src/command-line/migrate/agentic/runner.js +24 -24
  49. package/dist/src/command-line/migrate/agentic/select.d.ts +10 -2
  50. package/dist/src/command-line/migrate/agentic/select.js +30 -32
  51. package/dist/src/command-line/migrate/agentic/types.d.ts +33 -3
  52. package/dist/src/command-line/migrate/agentic/types.js +35 -0
  53. package/dist/src/command-line/migrate/command-object.d.ts +6 -0
  54. package/dist/src/command-line/migrate/command-object.js +19 -1
  55. package/dist/src/command-line/migrate/execute-migration.d.ts +91 -0
  56. package/dist/src/command-line/migrate/execute-migration.js +474 -0
  57. package/dist/src/command-line/migrate/migrate-analytics.d.ts +35 -0
  58. package/dist/src/command-line/migrate/migrate-analytics.js +64 -0
  59. package/dist/src/command-line/migrate/migrate-commits.d.ts +38 -8
  60. package/dist/src/command-line/migrate/migrate-commits.js +130 -15
  61. package/dist/src/command-line/migrate/migrate-config.d.ts +13 -12
  62. package/dist/src/command-line/migrate/migrate-config.js +22 -14
  63. package/dist/src/command-line/migrate/migrate-output.d.ts +45 -7
  64. package/dist/src/command-line/migrate/migrate-output.js +52 -8
  65. package/dist/src/command-line/migrate/migrate-ui-api.d.ts +2 -1
  66. package/dist/src/command-line/migrate/migrate-ui-api.js +33 -19
  67. package/dist/src/command-line/migrate/migrate.d.ts +29 -113
  68. package/dist/src/command-line/migrate/migrate.js +666 -664
  69. package/dist/src/command-line/migrate/migration-shape.d.ts +8 -0
  70. package/dist/src/command-line/migrate/multi-major.js +7 -10
  71. package/dist/src/command-line/migrate/resolve-package-version.js +4 -8
  72. package/dist/src/command-line/migrate/run/agent-output.d.ts +20 -0
  73. package/dist/src/command-line/migrate/run/agent-output.js +65 -0
  74. package/dist/src/command-line/migrate/run/index.d.ts +9 -0
  75. package/dist/src/command-line/migrate/run/index.js +23 -0
  76. package/dist/src/command-line/migrate/run/orchestrator.d.ts +20 -0
  77. package/dist/src/command-line/migrate/run/orchestrator.js +1200 -0
  78. package/dist/src/command-line/migrate/run/run-id.d.ts +16 -0
  79. package/dist/src/command-line/migrate/run/run-id.js +56 -0
  80. package/dist/src/command-line/migrate/run/run-state.d.ts +157 -0
  81. package/dist/src/command-line/migrate/run/run-state.js +438 -0
  82. package/dist/src/command-line/migrate/run/state-lock.d.ts +25 -0
  83. package/dist/src/command-line/migrate/run/state-lock.js +76 -0
  84. package/dist/src/command-line/migrate/run/state-machine.d.ts +84 -0
  85. package/dist/src/command-line/migrate/run/state-machine.js +315 -0
  86. package/dist/src/command-line/migrate/run/util.d.ts +59 -0
  87. package/dist/src/command-line/migrate/run/util.js +148 -0
  88. package/dist/src/command-line/migrate/run/worker.d.ts +16 -0
  89. package/dist/src/command-line/migrate/run/worker.js +682 -0
  90. package/dist/src/command-line/migrate/run-migration-process.js +6 -5
  91. package/dist/src/command-line/migrate/safe-prompt.d.ts +14 -26
  92. package/dist/src/command-line/migrate/safe-prompt.js +32 -43
  93. package/dist/src/command-line/migrate/sort-migrations.d.ts +16 -0
  94. package/dist/src/command-line/migrate/sort-migrations.js +32 -0
  95. package/dist/src/command-line/migrate/step-actions.d.ts +5 -0
  96. package/dist/src/command-line/migrate/step-actions.js +12 -0
  97. package/dist/src/command-line/migrate/text.d.ts +18 -0
  98. package/dist/src/command-line/migrate/text.js +26 -0
  99. package/dist/src/command-line/migrate/version-skew-guard.d.ts +60 -0
  100. package/dist/src/command-line/migrate/version-skew-guard.js +175 -0
  101. package/dist/src/command-line/nx-cloud/connect/connect-to-nx-cloud.js +17 -21
  102. package/dist/src/command-line/nx-cloud/connect/view-logs.js +2 -0
  103. package/dist/src/command-line/nx-cloud/start-nx-agents/command-object.d.ts +2 -0
  104. package/dist/src/command-line/nx-cloud/start-nx-agents/command-object.js +16 -0
  105. package/dist/src/command-line/nx-cloud/start-nx-agents/start-nx-agents.d.ts +4 -0
  106. package/dist/src/command-line/nx-cloud/start-nx-agents/start-nx-agents.js +13 -0
  107. package/dist/src/command-line/nx-commands.js +26 -24
  108. package/dist/src/command-line/release/changelog.js +11 -17
  109. package/dist/src/command-line/release/index.d.ts +1 -1
  110. package/dist/src/command-line/release/plan.js +15 -28
  111. package/dist/src/command-line/release/publish.js +5 -0
  112. package/dist/src/command-line/release/release.js +6 -17
  113. package/dist/src/command-line/release/utils/git.js +1 -1
  114. package/dist/src/command-line/release/utils/release-graph.d.ts +20 -2
  115. package/dist/src/command-line/release/utils/release-graph.js +81 -21
  116. package/dist/src/command-line/release/utils/remote-release-clients/github.js +17 -23
  117. package/dist/src/command-line/release/utils/remote-release-clients/gitlab.js +14 -23
  118. package/dist/src/command-line/release/utils/resolve-semver-specifier.js +19 -41
  119. package/dist/src/command-line/release/utils/shared.d.ts +2 -2
  120. package/dist/src/command-line/release/version/release-group-processor.d.ts +24 -0
  121. package/dist/src/command-line/release/version/release-group-processor.js +80 -6
  122. package/dist/src/command-line/release/version/resolve-current-version.js +7 -10
  123. package/dist/src/command-line/release/version/version-actions.d.ts +27 -2
  124. package/dist/src/command-line/release/version/version-actions.js +9 -1
  125. package/dist/src/command-line/release/version.js +10 -6
  126. package/dist/src/command-line/reset/reset.js +6 -1
  127. package/dist/src/command-line/run/run-one.js +1 -0
  128. package/dist/src/command-line/run-many/run-many.js +1 -0
  129. package/dist/src/command-line/show/show-target/inputs.js +50 -153
  130. package/dist/src/command-line/show/show-target/outputs.js +48 -173
  131. package/dist/src/command-line/show/show-target/utils.d.ts +28 -0
  132. package/dist/src/command-line/show/show-target/utils.js +83 -3
  133. package/dist/src/command-line/watch/watch.js +13 -0
  134. package/dist/src/command-line/yargs-utils/shared-options.d.ts +2 -2
  135. package/dist/src/command-line/yargs-utils/shared-options.js +3 -1
  136. package/dist/src/commands-runner/create-command-graph.js +5 -0
  137. package/dist/src/config/misc-interfaces.d.ts +19 -7
  138. package/dist/src/config/nx-json.d.ts +5 -3
  139. package/dist/src/core/graph/main.js +1 -1
  140. package/dist/src/core/graph/styles.js +1 -1
  141. package/dist/src/daemon/client/client.d.ts +52 -1
  142. package/dist/src/daemon/client/client.js +160 -36
  143. package/dist/src/daemon/client/daemon-environment.d.ts +17 -0
  144. package/dist/src/daemon/client/daemon-environment.js +110 -2
  145. package/dist/src/daemon/client/daemon-socket-messenger.js +4 -0
  146. package/dist/src/daemon/message-types/daemon-message.d.ts +32 -0
  147. package/dist/src/daemon/message-types/daemon-message.js +25 -0
  148. package/dist/src/daemon/server/file-watching/file-watcher-sockets.d.ts +5 -0
  149. package/dist/src/daemon/server/file-watching/file-watcher-sockets.js +16 -0
  150. package/dist/src/daemon/server/handle-tasks-execution-hooks.d.ts +1 -1
  151. package/dist/src/daemon/server/latest-nx.js +5 -2
  152. package/dist/src/daemon/server/server.js +31 -4
  153. package/dist/src/daemon/server/shutdown-utils.d.ts +5 -0
  154. package/dist/src/daemon/server/shutdown-utils.js +11 -4
  155. package/dist/src/daemon/socket-utils.d.ts +1 -0
  156. package/dist/src/daemon/socket-utils.js +24 -3
  157. package/dist/src/daemon/tmp-dir.d.ts +43 -3
  158. package/dist/src/daemon/tmp-dir.js +437 -15
  159. package/dist/src/devkit-internals.d.ts +105 -8
  160. package/dist/src/devkit-internals.js +223 -7
  161. package/dist/src/executors/run-commands/running-tasks.js +46 -29
  162. package/dist/src/generators/internal-utils/format-changed-files.d.ts +24 -0
  163. package/dist/src/generators/internal-utils/format-changed-files.js +163 -0
  164. package/dist/src/generators/testing-utils/create-tree-with-empty-workspace.d.ts +15 -0
  165. package/dist/src/generators/testing-utils/create-tree-with-empty-workspace.js +21 -3
  166. package/dist/src/generators/tree.d.ts +4 -2
  167. package/dist/src/generators/utils/nx-json.js +13 -3
  168. package/dist/src/hasher/check-task-files.d.ts +86 -0
  169. package/dist/src/hasher/check-task-files.js +378 -0
  170. package/dist/src/migrations/update-15-0-0/prefix-outputs.js +2 -2
  171. package/dist/src/migrations/update-16-0-0/remove-nrwl-cli.js +2 -2
  172. package/dist/src/migrations/update-16-0-0/update-depends-on-to-tokens.js +2 -2
  173. package/dist/src/migrations/update-16-0-0/update-nx-cloud-runner.js +2 -2
  174. package/dist/src/migrations/update-16-2-0/remove-run-commands-output-path.js +2 -2
  175. package/dist/src/migrations/update-17-0-0/rm-default-collection-npm-scope.js +2 -2
  176. package/dist/src/migrations/update-17-0-0/use-minimal-config-for-tasks-runner-options.js +2 -2
  177. package/dist/src/migrations/update-17-2-0/move-default-base.js +2 -2
  178. package/dist/src/migrations/update-18-0-0/disable-crystal-for-existing-workspaces.js +2 -2
  179. package/dist/src/migrations/update-19-2-4/set-project-name.js +2 -2
  180. package/dist/src/migrations/update-20-0-0/move-use-daemon-process.js +2 -2
  181. package/dist/src/migrations/update-20-0-1/use-legacy-cache.js +2 -2
  182. package/dist/src/migrations/update-21-0-0/release-changelog-config-changes.js +2 -2
  183. package/dist/src/migrations/update-21-0-0/release-version-config-changes.js +2 -2
  184. package/dist/src/migrations/update-21-0-0/remove-custom-tasks-runner.js +2 -2
  185. package/dist/src/migrations/update-21-0-0/remove-legacy-cache.js +2 -2
  186. package/dist/src/migrations/update-22-0-0/consolidate-release-tag-config.js +2 -2
  187. package/dist/src/migrations/update-22-0-0/release-version-config-changes.js +2 -2
  188. package/dist/src/migrations/update-22-2-0/add-self-healing-to-gitignore.js +2 -2
  189. package/dist/src/migrations/update-22-6-0/add-claude-settings-local-to-git-ignore.js +2 -2
  190. package/dist/src/migrations/update-22-6-0/add-claude-worktrees-to-git-ignore.js +2 -2
  191. package/dist/src/migrations/update-22-7-0/add-polygraph-to-git-ignore.js +2 -2
  192. package/dist/src/migrations/update-23-0-0/add-migrate-runs-to-git-ignore.js +2 -2
  193. package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.d.ts +12 -0
  194. package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.js +250 -0
  195. package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.md +50 -0
  196. package/dist/src/native/index.d.ts +37 -4
  197. package/dist/src/native/index.js +71 -28
  198. package/dist/src/native/native-bindings.js +3 -0
  199. package/dist/src/native/native-file-cache-location.d.ts +17 -1
  200. package/dist/src/native/native-file-cache-location.js +86 -12
  201. package/dist/src/native/nx.wasm32-wasi.debug.wasm +0 -0
  202. package/dist/src/native/nx.wasm32-wasi.wasm +0 -0
  203. package/dist/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.js +3 -3
  204. package/dist/src/nx-cloud/utilities/get-cloud-options.js +5 -2
  205. package/dist/src/nx-cloud/utilities/onboarding.js +5 -2
  206. package/dist/src/nx-cloud/utilities/url-shorten.d.ts +1 -4
  207. package/dist/src/nx-cloud/utilities/url-shorten.js +9 -8
  208. package/dist/src/plugins/js/lock-file/bun-parser.js +43 -10
  209. package/dist/src/plugins/js/lock-file/lock-file.d.ts +46 -4
  210. package/dist/src/plugins/js/lock-file/lock-file.js +192 -15
  211. package/dist/src/plugins/js/lock-file/pnpm-parser.js +420 -64
  212. package/dist/src/plugins/js/lock-file/project-graph-pruning.d.ts +25 -1
  213. package/dist/src/plugins/js/lock-file/project-graph-pruning.js +92 -12
  214. package/dist/src/plugins/js/lock-file/pruned-output.d.ts +330 -0
  215. package/dist/src/plugins/js/lock-file/pruned-output.js +1441 -0
  216. package/dist/src/plugins/js/lock-file/utils/pnpm-normalizer.d.ts +1 -0
  217. package/dist/src/plugins/js/lock-file/utils/pnpm-normalizer.js +9 -5
  218. package/dist/src/plugins/js/project-graph/affected/npm-packages.js +51 -20
  219. package/dist/src/plugins/js/project-graph/build-dependencies/target-project-locator.js +14 -4
  220. package/dist/src/project-graph/affected/affected-project-graph-models.d.ts +1 -1
  221. package/dist/src/project-graph/affected/affected-project-graph.d.ts +1 -1
  222. package/dist/src/project-graph/affected/affected-project-graph.js +2 -2
  223. package/dist/src/project-graph/affected/locators/project-glob-changes.js +5 -2
  224. package/dist/src/project-graph/build-project-graph.js +7 -1
  225. package/dist/src/project-graph/error-types.d.ts +12 -1
  226. package/dist/src/project-graph/error-types.js +27 -2
  227. package/dist/src/project-graph/file-utils.js +6 -1
  228. package/dist/src/project-graph/plugins/isolation/isolated-plugin.d.ts +1 -0
  229. package/dist/src/project-graph/plugins/isolation/isolated-plugin.js +18 -1
  230. package/dist/src/project-graph/plugins/isolation/messaging.d.ts +16 -3
  231. package/dist/src/project-graph/plugins/isolation/messaging.js +3 -0
  232. package/dist/src/project-graph/plugins/isolation/plugin-worker.js +58 -8
  233. package/dist/src/project-graph/plugins/loaded-nx-plugin.js +1 -0
  234. package/dist/src/project-graph/project-graph.js +23 -0
  235. package/dist/src/project-graph/utils/project-configuration/name-substitution-manager.d.ts +1 -0
  236. package/dist/src/project-graph/utils/project-configuration/name-substitution-manager.js +16 -2
  237. package/dist/src/project-graph/utils/project-configuration/project-nodes-manager.d.ts +12 -8
  238. package/dist/src/project-graph/utils/project-configuration/project-nodes-manager.js +30 -21
  239. package/dist/src/project-graph/utils/project-configuration/source-maps.d.ts +12 -5
  240. package/dist/src/project-graph/utils/project-configuration/source-maps.js +21 -7
  241. package/dist/src/project-graph/utils/project-configuration/target-defaults.d.ts +1 -1
  242. package/dist/src/project-graph/utils/project-configuration/target-defaults.js +26 -27
  243. package/dist/src/project-graph/utils/project-configuration/target-merging.js +50 -8
  244. package/dist/src/project-graph/utils/project-configuration/target-normalization.js +149 -6
  245. package/dist/src/project-graph/utils/project-configuration/utils.d.ts +15 -0
  246. package/dist/src/project-graph/utils/project-configuration/utils.js +42 -6
  247. package/dist/src/project-graph/utils/project-configuration-utils.d.ts +15 -12
  248. package/dist/src/project-graph/utils/project-configuration-utils.js +79 -99
  249. package/dist/src/tasks-runner/is-tui-enabled.js +3 -1
  250. package/dist/src/tasks-runner/life-cycle.d.ts +2 -2
  251. package/dist/src/tasks-runner/life-cycle.js +2 -2
  252. package/dist/src/tasks-runner/life-cycles/performance-analysis.d.ts +9 -4
  253. package/dist/src/tasks-runner/life-cycles/performance-life-cycle.js +5 -4
  254. package/dist/src/tasks-runner/life-cycles/performance-report.d.ts +28 -8
  255. package/dist/src/tasks-runner/life-cycles/performance-report.js +117 -30
  256. package/dist/src/tasks-runner/life-cycles/static-run-many-terminal-output-life-cycle.d.ts +26 -1
  257. package/dist/src/tasks-runner/life-cycles/static-run-many-terminal-output-life-cycle.js +99 -5
  258. package/dist/src/tasks-runner/life-cycles/static-run-one-terminal-output-life-cycle.d.ts +26 -0
  259. package/dist/src/tasks-runner/life-cycles/static-run-one-terminal-output-life-cycle.js +113 -17
  260. package/dist/src/tasks-runner/pseudo-terminal.d.ts +17 -3
  261. package/dist/src/tasks-runner/pseudo-terminal.js +22 -10
  262. package/dist/src/tasks-runner/run-command.js +28 -35
  263. package/dist/src/tasks-runner/running-tasks/batch-process.d.ts +55 -0
  264. package/dist/src/tasks-runner/running-tasks/batch-process.js +161 -8
  265. package/dist/src/tasks-runner/task-env.d.ts +9 -0
  266. package/dist/src/tasks-runner/task-env.js +31 -4
  267. package/dist/src/tasks-runner/task-orchestrator.d.ts +72 -1
  268. package/dist/src/tasks-runner/task-orchestrator.js +182 -18
  269. package/dist/src/tasks-runner/utils.js +2 -6
  270. package/dist/src/utils/acknowledge-build-scripts.js +7 -5
  271. package/dist/src/utils/analytics-enabled.d.ts +7 -0
  272. package/dist/src/utils/analytics-enabled.js +11 -0
  273. package/dist/src/utils/analytics-prompt.d.ts +0 -6
  274. package/dist/src/utils/analytics-prompt.js +4 -58
  275. package/dist/src/utils/assert-workspace-validity.js +7 -2
  276. package/dist/src/utils/catalog/bun-manager-utils.d.ts +8 -0
  277. package/dist/src/utils/catalog/bun-manager-utils.js +174 -0
  278. package/dist/src/utils/catalog/bun-manager.d.ts +28 -0
  279. package/dist/src/utils/catalog/bun-manager.js +130 -0
  280. package/dist/src/utils/catalog/index.d.ts +1 -1
  281. package/dist/src/utils/catalog/index.js +1 -1
  282. package/dist/src/utils/catalog/manager-factory.js +3 -0
  283. package/dist/src/utils/catalog/manager-utils.d.ts +8 -1
  284. package/dist/src/utils/catalog/manager-utils.js +9 -4
  285. package/dist/src/utils/catalog/manager.d.ts +13 -1
  286. package/dist/src/utils/catalog/manager.js +30 -0
  287. package/dist/src/utils/catalog/pnpm-manager.d.ts +2 -1
  288. package/dist/src/utils/catalog/pnpm-manager.js +3 -0
  289. package/dist/src/utils/catalog/types.d.ts +4 -0
  290. package/dist/src/utils/catalog/yarn-manager.d.ts +6 -2
  291. package/dist/src/utils/catalog/yarn-manager.js +23 -32
  292. package/dist/src/utils/child-process.d.ts +31 -1
  293. package/dist/src/utils/child-process.js +103 -0
  294. package/dist/src/utils/chunkify.d.ts +7 -1
  295. package/dist/src/utils/chunkify.js +10 -3
  296. package/dist/src/utils/command-line-utils.js +30 -20
  297. package/dist/src/utils/exit-codes.d.ts +9 -0
  298. package/dist/src/utils/exit-codes.js +19 -0
  299. package/dist/src/utils/fileutils.d.ts +5 -0
  300. package/dist/src/utils/fileutils.js +7 -2
  301. package/dist/src/utils/formatters/index.d.ts +13 -0
  302. package/dist/src/utils/formatters/index.js +74 -0
  303. package/dist/src/utils/formatters/oxfmt.d.ts +32 -0
  304. package/dist/src/utils/formatters/oxfmt.js +764 -0
  305. package/dist/src/utils/formatters/prettier.d.ts +26 -0
  306. package/dist/src/utils/formatters/prettier.js +201 -0
  307. package/dist/src/utils/formatters/shared.d.ts +5 -0
  308. package/dist/src/utils/formatters/shared.js +8 -0
  309. package/dist/src/utils/git-revision.d.ts +12 -0
  310. package/dist/src/utils/git-revision.js +25 -0
  311. package/dist/src/utils/git-utils.d.ts +48 -2
  312. package/dist/src/utils/git-utils.js +220 -14
  313. package/dist/src/utils/git-worktrees.d.ts +30 -0
  314. package/dist/src/utils/git-worktrees.js +212 -0
  315. package/dist/src/utils/ignore.d.ts +170 -1
  316. package/dist/src/utils/ignore.js +263 -11
  317. package/dist/src/utils/long-running-target.d.ts +10 -0
  318. package/dist/src/utils/long-running-target.js +19 -0
  319. package/dist/src/utils/min-release-age/behavior/bun.js +7 -11
  320. package/dist/src/utils/min-release-age/behavior/npm.js +5 -2
  321. package/dist/src/utils/min-release-age/packument.js +1 -1
  322. package/dist/src/utils/nx-console-prompt.js +3 -6
  323. package/dist/src/utils/nx-tmp-dir.d.ts +18 -0
  324. package/dist/src/utils/nx-tmp-dir.js +40 -0
  325. package/dist/src/utils/output.d.ts +153 -0
  326. package/dist/src/utils/output.js +289 -5
  327. package/dist/src/utils/owned-private-dir.d.ts +132 -0
  328. package/dist/src/utils/owned-private-dir.js +323 -0
  329. package/dist/src/utils/package-json.d.ts +2 -0
  330. package/dist/src/utils/package-json.js +11 -7
  331. package/dist/src/utils/package-manager-config/bunfig.d.ts +14 -0
  332. package/dist/src/utils/package-manager-config/bunfig.js +49 -0
  333. package/dist/src/utils/package-manager-config/npmrc.d.ts +23 -0
  334. package/dist/src/utils/package-manager-config/npmrc.js +124 -0
  335. package/dist/src/utils/package-manager-config/pnpm-config.d.ts +17 -0
  336. package/dist/src/utils/package-manager-config/pnpm-config.js +60 -0
  337. package/dist/src/utils/package-manager.d.ts +23 -2
  338. package/dist/src/utils/package-manager.js +268 -44
  339. package/dist/src/utils/params.d.ts +7 -1
  340. package/dist/src/utils/params.js +64 -6
  341. package/dist/src/utils/plugins/core-plugins.js +4 -0
  342. package/dist/src/utils/prompt-helpers.d.ts +53 -0
  343. package/dist/src/utils/prompt-helpers.js +111 -0
  344. package/dist/src/utils/provenance.js +6 -14
  345. package/dist/src/utils/registry-config/bun.d.ts +2 -0
  346. package/dist/src/utils/registry-config/bun.js +257 -0
  347. package/dist/src/utils/registry-config/index.d.ts +13 -0
  348. package/dist/src/utils/registry-config/index.js +102 -0
  349. package/dist/src/utils/registry-config/pnpm.d.ts +2 -0
  350. package/dist/src/utils/registry-config/pnpm.js +1551 -0
  351. package/dist/src/utils/registry-config/utils.d.ts +195 -0
  352. package/dist/src/utils/registry-config/utils.js +496 -0
  353. package/dist/src/utils/registry-config/yarn-berry.d.ts +2 -0
  354. package/dist/src/utils/registry-config/yarn-berry.js +612 -0
  355. package/dist/src/utils/registry-config/yarn-classic.d.ts +2 -0
  356. package/dist/src/utils/registry-config/yarn-classic.js +1001 -0
  357. package/dist/src/utils/safe-spawn.d.ts +24 -0
  358. package/dist/src/utils/safe-spawn.js +104 -0
  359. package/dist/src/utils/shell-quoting.d.ts +15 -0
  360. package/dist/src/utils/shell-quoting.js +35 -0
  361. package/dist/src/utils/wait-for-socket-connection.d.ts +11 -0
  362. package/dist/src/utils/wait-for-socket-connection.js +14 -8
  363. package/dist/src/utils/workspace-id.d.ts +20 -0
  364. package/dist/src/utils/workspace-id.js +54 -0
  365. package/dist/src/utils/write-formatted-json-file.d.ts +3 -2
  366. package/dist/src/utils/write-formatted-json-file.js +5 -4
  367. package/migrations.json +6 -0
  368. package/package.json +29 -19
  369. package/dist/src/generators/internal-utils/format-changed-files-with-prettier-if-available.d.ts +0 -19
  370. package/dist/src/generators/internal-utils/format-changed-files-with-prettier-if-available.js +0 -81
  371. package/dist/src/utils/is-using-prettier.d.ts +0 -3
  372. package/dist/src/utils/is-using-prettier.js +0 -62
  373. package/dist/src/utils/min-release-age/npmrc.d.ts +0 -15
  374. package/dist/src/utils/min-release-age/npmrc.js +0 -45
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.recordInitWrite = recordInitWrite;
4
+ exports.formatInitWrites = formatInitWrites;
5
+ const tslib_1 = require("tslib");
6
+ const node_fs_1 = require("node:fs");
7
+ const path = tslib_1.__importStar(require("node:path"));
8
+ const chunkify_1 = require("../../../utils/chunkify");
9
+ const formatters_1 = require("../../../utils/formatters");
10
+ const oxfmt_1 = require("../../../utils/formatters/oxfmt");
11
+ const prettier_1 = require("../../../utils/formatters/prettier");
12
+ const output_1 = require("../../../utils/output");
13
+ /**
14
+ * Paths `nx init` has created or modified.
15
+ *
16
+ * Module state because init's flows write from many call sites across
17
+ * several files, a number behind early returns; the alternative is threading
18
+ * a collector through every one.
19
+ */
20
+ const writtenFiles = new Set();
21
+ /**
22
+ * Records a file for `formatInitWrites`. Only for files a formatter handles -
23
+ * `.gitignore` and the vendored `.nx` scripts are left out rather than
24
+ * filtered later.
25
+ *
26
+ * Two recording helpers are shared with `nx import`, which drains before each
27
+ * commit amend; draining after one would leave the formatting uncommitted.
28
+ * The drain is a no-op when empty.
29
+ */
30
+ function recordInitWrite(filePath) {
31
+ writtenFiles.add(filePath);
32
+ }
33
+ /**
34
+ * Formats what init just wrote and nothing else: an existing repo's other
35
+ * files are not init's to reformat.
36
+ *
37
+ * Never fatal - the repo is already initialised, so a formatter that cannot
38
+ * run costs a `nx format` the user can run themselves, not their setup.
39
+ */
40
+ async function formatInitWrites(repoRoot,
41
+ // `nx import` drains this set too, and a user who never ran `nx init` should
42
+ // not be told `nx init` failed.
43
+ command = 'nx init') {
44
+ const recorded = [...writtenFiles];
45
+ // Cleared unconditionally: a second init in the same process must not
46
+ // reformat the first one's files.
47
+ writtenFiles.clear();
48
+ if (process.env.NX_SKIP_FORMAT === 'true' || recorded.length === 0) {
49
+ return;
50
+ }
51
+ // Repo-relative with `repoRoot` as cwd, so paths stay short and resolve
52
+ // against the repo. That also pins oxfmt's `.editorconfig` lookup, which it
53
+ // does once from the working directory; it does not pin config discovery.
54
+ //
55
+ // De-duplicated *after* normalising: the same file is routinely recorded
56
+ // both as `'nx.json'` and as `join(repoRoot, 'nx.json')`, which are two Set
57
+ // keys for one file.
58
+ const files = [
59
+ ...new Set(recorded.map((file) => path
60
+ .relative(repoRoot, path.resolve(repoRoot, file))
61
+ .split(path.sep)
62
+ .join('/'))),
63
+ ].filter((file) => file &&
64
+ !file.startsWith('../') &&
65
+ !path.isAbsolute(file) &&
66
+ (0, node_fs_1.existsSync)(path.join(repoRoot, file)));
67
+ if (files.length === 0) {
68
+ return;
69
+ }
70
+ // `detectFormatter` reads package.json, so it belongs inside the try - a
71
+ // workspace whose package.json cannot be parsed must not fail an init that
72
+ // already finished.
73
+ //
74
+ // Chunked as `nx format` chunks: the Angular flow records a `project.json`
75
+ // per project. The prettier path is sized against its quoted length; oxfmt
76
+ // goes through execFile and gets raw paths.
77
+ let formatter = null;
78
+ try {
79
+ formatter = (0, formatters_1.detectFormatter)(repoRoot);
80
+ if (!formatter) {
81
+ return;
82
+ }
83
+ if (formatter === 'oxfmt') {
84
+ for (const chunk of (0, chunkify_1.chunkify)(files)) {
85
+ if (chunk.length) {
86
+ (0, oxfmt_1.writeWithOxfmt)(chunk, repoRoot);
87
+ }
88
+ }
89
+ }
90
+ else {
91
+ // oxfmt needs no equivalent filter - it silently skips file types it
92
+ // does not handle and exits 0. prettier still formats the rest of the
93
+ // batch, but exits 2 on one unsupported file, which would end a
94
+ // successful init with a spurious warning and prettier's own stderr.
95
+ const supported = await (0, prettier_1.filterToPrettierSupportedFiles)(files);
96
+ for (const chunk of (0, chunkify_1.chunkify)(supported, undefined, (pattern) => (0, prettier_1.quoteForShell)(pattern).length)) {
97
+ if (chunk.length) {
98
+ (0, prettier_1.writeWithPrettier)(chunk, repoRoot);
99
+ }
100
+ }
101
+ }
102
+ }
103
+ catch (e) {
104
+ output_1.output.warn({
105
+ title: formatter
106
+ ? `Could not format the files ${command} wrote with ${formatter}.`
107
+ : `Could not work out which formatter to use for the files ${command} wrote.`,
108
+ bodyLines: [
109
+ ...(e?.message ? [e.message] : []),
110
+ 'Run "nx format:write" to format them.',
111
+ ],
112
+ });
113
+ }
114
+ }
@@ -26,6 +26,7 @@ const acknowledge_build_scripts_1 = require("../../../utils/acknowledge-build-sc
26
26
  const path_2 = require("../../../utils/path");
27
27
  const versions_1 = require("../../../utils/versions");
28
28
  const fs_1 = require("fs");
29
+ const format_1 = require("./format");
29
30
  const connect_to_nx_cloud_1 = require("../../../nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud");
30
31
  const connect_to_nx_cloud_2 = require("../../nx-cloud/connect/connect-to-nx-cloud");
31
32
  const deduce_default_base_1 = require("./deduce-default-base");
@@ -71,6 +72,7 @@ function createNxJsonFile(repoRoot, topologicalTargets, cacheableOperations, scr
71
72
  nxJson.defaultBase ??= defaultBase;
72
73
  }
73
74
  (0, fileutils_1.writeJsonFile)(nxJsonPath, nxJson);
75
+ (0, format_1.recordInitWrite)(nxJsonPath);
74
76
  }
75
77
  /**
76
78
  * Locate-by-target upsert against an in-memory `targetDefaults` map. Merges
@@ -221,6 +223,7 @@ function addDepsToPackageJson(repoRoot, packageManager, additionalPackages) {
221
223
  }
222
224
  }
223
225
  (0, fileutils_1.writeJsonFile)(path, json);
226
+ (0, format_1.recordInitWrite)(path);
224
227
  // nx has a postinstall script, which pnpm 11+ refuses to install
225
228
  // unacknowledged.
226
229
  (0, acknowledge_build_scripts_1.acknowledgeBuildScripts)(repoRoot, packageManager, { nx: true });
@@ -351,6 +354,7 @@ function setNeverConnectToCloud(repoRoot) {
351
354
  const nxJson = (0, fileutils_1.readJsonFile)(nxJsonPath);
352
355
  nxJson.neverConnectToCloud = true;
353
356
  (0, fileutils_1.writeJsonFile)(nxJsonPath, nxJson);
357
+ (0, format_1.recordInitWrite)(nxJsonPath);
354
358
  }
355
359
  function addVsCodeRecommendedExtensions(repoRoot, extensions) {
356
360
  const vsCodeExtensionsPath = (0, path_1.join)(repoRoot, '.vscode/extensions.json');
@@ -363,9 +367,11 @@ function addVsCodeRecommendedExtensions(repoRoot, extensions) {
363
367
  }
364
368
  });
365
369
  (0, fileutils_1.writeJsonFile)(vsCodeExtensionsPath, vsCodeExtensionsJson);
370
+ (0, format_1.recordInitWrite)(vsCodeExtensionsPath);
366
371
  }
367
372
  else {
368
373
  (0, fileutils_1.writeJsonFile)(vsCodeExtensionsPath, { recommendations: extensions });
374
+ (0, format_1.recordInitWrite)(vsCodeExtensionsPath);
369
375
  }
370
376
  }
371
377
  function markRootPackageJsonAsNxProjectLegacy(repoRoot, cacheableScripts, pmc) {
@@ -386,6 +392,7 @@ function markRootPackageJsonAsNxProjectLegacy(repoRoot, cacheableScripts, pmc) {
386
392
  }
387
393
  }
388
394
  (0, fileutils_1.writeJsonFile)(`package.json`, json);
395
+ (0, format_1.recordInitWrite)('package.json');
389
396
  }
390
397
  function markPackageJsonAsNxProject(packageJsonPath) {
391
398
  const json = (0, fileutils_1.readJsonFile)(packageJsonPath);
@@ -394,6 +401,7 @@ function markPackageJsonAsNxProject(packageJsonPath) {
394
401
  }
395
402
  json.nx = {};
396
403
  (0, fileutils_1.writeJsonFile)(packageJsonPath, json);
404
+ (0, format_1.recordInitWrite)(packageJsonPath);
397
405
  }
398
406
  function printFinalMessage({ learnMoreLink, appendLines, }) {
399
407
  output_1.output.success({
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.initHandler = initHandler;
4
4
  const child_process_1 = require("child_process");
5
- const enquirer_1 = require("enquirer");
5
+ const prompt_helpers_1 = require("../../utils/prompt-helpers");
6
6
  const fs_1 = require("fs");
7
7
  const semver_1 = require("semver");
8
8
  const add_nx_to_monorepo_1 = require("./implementation/add-nx-to-monorepo");
@@ -14,6 +14,7 @@ const child_process_2 = require("../../utils/child-process");
14
14
  const fileutils_1 = require("../../utils/fileutils");
15
15
  const versions_1 = require("../../utils/versions");
16
16
  const utils_1 = require("./implementation/utils");
17
+ const format_1 = require("./implementation/format");
17
18
  async function initHandler(options) {
18
19
  // strip the 'init' command itself so we don't forward it
19
20
  const args = process.argv.slice(3).join(' ');
@@ -23,11 +24,13 @@ async function initHandler(options) {
23
24
  }
24
25
  if (options.useDotNxInstallation === true) {
25
26
  setupDotNxInstallation(version);
27
+ await (0, format_1.formatInitWrites)(process.cwd());
26
28
  }
27
29
  else if ((0, fs_1.existsSync)('package.json')) {
28
30
  const packageJson = (0, fileutils_1.readJsonFile)('package.json');
29
31
  if ((0, fs_1.existsSync)('angular.json')) {
30
32
  await (0, angular_1.addNxToAngularCliRepo)(options);
33
+ await (0, format_1.formatInitWrites)(process.cwd());
31
34
  (0, utils_1.printFinalMessage)({
32
35
  learnMoreLink: 'https://nx.dev/recipes/angular/migration/angular',
33
36
  });
@@ -35,6 +38,7 @@ async function initHandler(options) {
35
38
  }
36
39
  else if (isNestCLI(packageJson)) {
37
40
  await (0, add_nx_to_nest_1.addNxToNest)(options, packageJson);
41
+ await (0, format_1.formatInitWrites)(process.cwd());
38
42
  (0, utils_1.printFinalMessage)({
39
43
  learnMoreLink: 'https://nx.dev/recipes/adopting-nx/adding-to-monorepo',
40
44
  });
@@ -42,37 +46,30 @@ async function initHandler(options) {
42
46
  }
43
47
  else if ((0, utils_1.isMonorepo)(packageJson)) {
44
48
  await (0, add_nx_to_monorepo_1.addNxToMonorepo)({ ...options, legacy: true });
49
+ await (0, format_1.formatInitWrites)(process.cwd());
45
50
  (0, utils_1.printFinalMessage)({
46
51
  learnMoreLink: 'https://nx.dev/recipes/adopting-nx/adding-to-monorepo',
47
52
  });
48
53
  }
49
54
  else {
50
55
  await (0, add_nx_to_npm_repo_1.addNxToNpmRepo)({ ...options, legacy: true });
56
+ await (0, format_1.formatInitWrites)(process.cwd());
51
57
  (0, utils_1.printFinalMessage)({
52
58
  learnMoreLink: 'https://nx.dev/recipes/adopting-nx/adding-to-existing-project',
53
59
  });
54
60
  }
55
61
  }
56
62
  else {
57
- const useDotNxFolder = await (0, enquirer_1.prompt)([
58
- {
59
- name: 'useDotNxFolder',
60
- type: 'autocomplete',
61
- message: 'Where should your workspace be created?',
62
- choices: [
63
- {
64
- name: 'In a new folder under this directory',
65
- value: 'false',
66
- },
67
- {
68
- name: 'In this directory',
69
- value: 'true',
70
- },
71
- ],
72
- },
73
- ]).then((r) => r.useDotNxFolder === 'true');
63
+ const useDotNxFolder = (await (0, prompt_helpers_1.selectPrompt)({
64
+ message: 'Where should your workspace be created?',
65
+ choices: [
66
+ { value: 'false', label: 'In a new folder under this directory' },
67
+ { value: 'true', label: 'In this directory' },
68
+ ],
69
+ })) === 'true';
74
70
  if (useDotNxFolder) {
75
71
  setupDotNxInstallation(version);
72
+ await (0, format_1.formatInitWrites)(process.cwd());
76
73
  }
77
74
  else {
78
75
  (0, child_process_1.execSync)(`npx --yes create-nx-workspace@${version} ${args}`, {
@@ -5,12 +5,13 @@ exports.getPluginReason = getPluginReason;
5
5
  exports.detectPlugins = detectPlugins;
6
6
  const fs_1 = require("fs");
7
7
  const path_1 = require("path");
8
- const enquirer_1 = require("enquirer");
8
+ const prompt_helpers_1 = require("../../utils/prompt-helpers");
9
9
  const semver_1 = require("semver");
10
10
  const nx_json_1 = require("../../config/nx-json");
11
11
  const fileutils_1 = require("../../utils/fileutils");
12
12
  const get_package_name_from_import_path_1 = require("../../utils/get-package-name-from-import-path");
13
13
  const output_1 = require("../../utils/output");
14
+ const package_json_1 = require("../../utils/package-json");
14
15
  const package_manager_1 = require("../../utils/package-manager");
15
16
  const versions_1 = require("../../utils/versions");
16
17
  const workspace_context_1 = require("../../utils/workspace-context");
@@ -19,6 +20,7 @@ const configure_plugins_1 = require("./configure-plugins");
19
20
  const ai_agent_prompts_1 = require("./ai-agent-prompts");
20
21
  const set_up_ai_agents_1 = require("../../ai/set-up-ai-agents/set-up-ai-agents");
21
22
  const tree_1 = require("../../generators/tree");
23
+ const format_1 = require("./implementation/format");
22
24
  const add_nx_to_monorepo_1 = require("./implementation/add-nx-to-monorepo");
23
25
  const add_nx_to_npm_repo_1 = require("./implementation/add-nx-to-npm-repo");
24
26
  const add_nx_to_turborepo_1 = require("./implementation/add-nx-to-turborepo");
@@ -26,14 +28,12 @@ const angular_1 = require("./implementation/angular");
26
28
  const add_nx_scripts_1 = require("./implementation/dot-nx/add-nx-scripts");
27
29
  const utils_1 = require("./implementation/utils");
28
30
  const provenance_1 = require("../../utils/provenance");
29
- const devkit_internals_1 = require("../../devkit-internals");
30
31
  const handle_import_1 = require("../../utils/handle-import");
31
32
  const native_1 = require("../../native");
32
33
  const detect_ai_agent_1 = require("../../ai/detect-ai-agent");
33
34
  const ab_testing_1 = require("../../utils/ab-testing");
34
35
  const analytics_prompt_1 = require("../../utils/analytics-prompt");
35
36
  const is_ci_1 = require("../../utils/is-ci");
36
- const package_manager_2 = require("../../utils/package-manager");
37
37
  const ai_output_1 = require("./utils/ai-output");
38
38
  async function initHandler(options, inner = false) {
39
39
  // Use environment variable to force local execution
@@ -43,7 +43,7 @@ async function initHandler(options, inner = false) {
43
43
  let cleanup;
44
44
  try {
45
45
  await (0, provenance_1.ensurePackageHasProvenance)('nx', 'latest');
46
- const packageInstallResults = (0, devkit_internals_1.installPackageToTmp)('nx', 'latest', (0, package_manager_2.detectPackageManager)(process.cwd()));
46
+ const packageInstallResults = (0, package_json_1.installPackageToTmp)('nx', 'latest', (0, package_manager_1.detectPackageManager)(process.cwd()));
47
47
  cleanup = packageInstallResults.cleanup;
48
48
  let modulePath = require.resolve('nx/src/command-line/init/init-v2.js', {
49
49
  paths: [packageInstallResults.tempDir],
@@ -95,7 +95,7 @@ async function initHandlerImpl(options) {
95
95
  const baseMeta = {
96
96
  nodeVersion: process.versions.node,
97
97
  os: process.platform,
98
- packageManager: (0, package_manager_2.detectPackageManager)(),
98
+ packageManager: (0, package_manager_1.detectPackageManager)(),
99
99
  aiAgent: (0, native_1.isAiAgent)(),
100
100
  isCI: (0, is_ci_1.isCI)(),
101
101
  };
@@ -149,6 +149,7 @@ async function runInit(options, baseMeta) {
149
149
  ...options,
150
150
  integrated: !!options.integrated,
151
151
  });
152
+ await (0, format_1.formatInitWrites)(process.cwd());
152
153
  (0, utils_1.printFinalMessage)({
153
154
  learnMoreLink: 'https://nx.dev/technologies/angular/migration/angular',
154
155
  });
@@ -162,21 +163,17 @@ async function runInit(options, baseMeta) {
162
163
  options.interactive &&
163
164
  !aiMode &&
164
165
  process.stdin.isTTY) {
165
- const setupMode = await (0, enquirer_1.prompt)([
166
- {
167
- type: 'select',
168
- name: 'setupMode',
169
- message: 'How would you like to set up Nx in this directory?',
170
- choices: [
171
- {
172
- name: '.nx installation (recommended for non-JavaScript projects)',
173
- },
174
- {
175
- name: 'package.json installation (recommended for JavaScript/TypeScript projects)',
176
- },
177
- ],
178
- },
179
- ]).then((r) => r.setupMode);
166
+ const setupMode = await (0, prompt_helpers_1.selectPrompt)({
167
+ message: 'How would you like to set up Nx in this directory?',
168
+ choices: [
169
+ {
170
+ value: '.nx installation (recommended for non-JavaScript projects)',
171
+ },
172
+ {
173
+ value: 'package.json installation (recommended for JavaScript/TypeScript projects)',
174
+ },
175
+ ],
176
+ });
180
177
  if (setupMode.startsWith('package.json')) {
181
178
  // Create a minimal package.json so the JS/TS workflow takes over
182
179
  const workspaceName = (0, path_1.basename)(process.cwd());
@@ -185,6 +182,7 @@ async function runInit(options, baseMeta) {
185
182
  version: '0.0.0',
186
183
  private: true,
187
184
  });
185
+ (0, format_1.recordInitWrite)('package.json');
188
186
  }
189
187
  else {
190
188
  options.useDotNxInstallation = true;
@@ -199,14 +197,10 @@ async function runInit(options, baseMeta) {
199
197
  // AI mode defaults to minimum setup, humans can choose
200
198
  let guided = !aiMode; // Default to minimum (false) for AI, guided (true) for humans
201
199
  if (options.interactive && !(_isTurborepo || _isNonJs)) {
202
- const setupType = await (0, enquirer_1.prompt)([
203
- {
204
- type: 'select',
205
- name: 'setupPreference',
206
- message: 'Would you like a minimum or guided setup?',
207
- choices: [{ name: 'Minimum' }, { name: 'Guided' }],
208
- },
209
- ]).then((r) => r.setupPreference);
200
+ const setupType = await (0, prompt_helpers_1.selectPrompt)({
201
+ message: 'Would you like a minimum or guided setup?',
202
+ choices: [{ value: 'Minimum' }, { value: 'Guided' }],
203
+ });
210
204
  guided = setupType === 'Guided';
211
205
  }
212
206
  /**
@@ -222,6 +216,7 @@ async function runInit(options, baseMeta) {
222
216
  await (0, add_nx_to_turborepo_1.addNxToTurborepo)({
223
217
  interactive: options.interactive,
224
218
  });
219
+ await (0, format_1.formatInitWrites)(process.cwd());
225
220
  (0, utils_1.printFinalMessage)({
226
221
  learnMoreLink: 'https://nx.dev/recipes/adopting-nx/from-turborepo',
227
222
  });
@@ -296,6 +291,9 @@ async function runInit(options, baseMeta) {
296
291
  reason: getPluginReason(name),
297
292
  }));
298
293
  (0, ai_output_1.logProgress)('detecting', `Detected ${detectedPluginNames.length} plugin(s): ${detectedPluginNames.join(', ')}`);
294
+ // This path exits without reaching the drain below, and `nx.json` has
295
+ // already been written by now.
296
+ await (0, format_1.formatInitWrites)(repoRoot);
299
297
  (0, ai_output_1.writeAiOutput)((0, ai_output_1.buildNeedsInputResult)(detectedPlugins));
300
298
  process.exit(0);
301
299
  }
@@ -368,12 +366,16 @@ async function runInit(options, baseMeta) {
368
366
  analyticsPrompt,
369
367
  nodeVersion: process.versions.node,
370
368
  os: process.platform,
371
- packageManager: (0, package_manager_2.detectPackageManager)(),
369
+ packageManager: (0, package_manager_1.detectPackageManager)(),
372
370
  aiAgent: aiMode,
373
371
  isCI: (0, is_ci_1.isCI)(),
374
372
  pluginsInstalled: pluginsToInstall.join(','),
375
373
  },
376
374
  });
375
+ // Before the AI record, not after: the formatters write to stdout
376
+ // (`--list-different`, oxfmt's summary), which would otherwise land after the
377
+ // NDJSON result and corrupt the tail an agent parses.
378
+ await (0, format_1.formatInitWrites)(repoRoot);
377
379
  // Output success result for AI agents
378
380
  if (aiMode) {
379
381
  (0, ai_output_1.writeAiOutput)((0, ai_output_1.buildSuccessResult)({
@@ -401,6 +403,7 @@ async function runInit(options, baseMeta) {
401
403
  function getPluginReason(plugin) {
402
404
  const reasonMap = {
403
405
  '@nx/eslint': 'eslint detected in dependencies',
406
+ '@nx/oxlint': 'oxlint detected in dependencies',
404
407
  '@nx/storybook': 'storybook detected in dependencies',
405
408
  '@nx/vite': 'vite detected in dependencies',
406
409
  '@nx/vitest': 'vitest detected in dependencies',
@@ -448,6 +451,7 @@ function parsePluginsFlag(value) {
448
451
  const npmPackageToPluginMap = {
449
452
  // Generic JS tools
450
453
  eslint: '@nx/eslint',
454
+ oxlint: '@nx/oxlint',
451
455
  storybook: '@nx/storybook',
452
456
  // Bundlers
453
457
  vite: '@nx/vite',
@@ -574,39 +578,18 @@ async function detectPlugins(nxJson, packageJson, interactive, includeAngularCli
574
578
  `Add these Nx plugins to integrate with the tools used in your workspace.`,
575
579
  ],
576
580
  });
577
- const pluginsToInstall = await (0, enquirer_1.prompt)([
578
- {
579
- name: 'plugins',
580
- type: 'multiselect',
581
- message: `Which plugins would you like to add? Press <Space> to select and <Enter> to submit.`,
582
- choices: plugins.map((p) => ({ name: p, value: p })),
583
- /**
584
- * limit is missing from the interface but it limits the amount of options shown
585
- */
586
- limit: process.stdout.rows - 4, // 4 leaves room for the header above, the prompt and some whitespace
587
- },
588
- ]).then((r) => r.plugins);
581
+ const pluginsToInstall = await (0, prompt_helpers_1.multiselectPrompt)({
582
+ message: `Which plugins would you like to add? Press <Space> to select and <Enter> to submit.`,
583
+ choices: plugins,
584
+ });
589
585
  if (pluginsToInstall?.length === 0)
590
586
  return {
591
587
  plugins: [],
592
588
  updatePackageScripts: false,
593
589
  };
594
590
  const updatePackageScripts = (0, fs_1.existsSync)('package.json') &&
595
- (await (0, enquirer_1.prompt)([
596
- {
597
- name: 'updatePackageScripts',
598
- type: 'autocomplete',
599
- message: `Do you want to start using Nx in your package.json scripts?`,
600
- choices: [
601
- {
602
- name: 'Yes',
603
- },
604
- {
605
- name: 'No',
606
- },
607
- ],
608
- initial: 0,
609
- },
610
- ]).then((r) => r.updatePackageScripts === 'Yes'));
591
+ (await (0, prompt_helpers_1.confirmationPrompt)({
592
+ message: `Do you want to start using Nx in your package.json scripts?`,
593
+ }));
611
594
  return { plugins: pluginsToInstall, updatePackageScripts };
612
595
  }
@@ -4,7 +4,7 @@ exports.AGENT_DEFINITIONS = exports.opencodeDefinition = exports.codexDefinition
4
4
  exports.getAgentDefinition = getAgentDefinition;
5
5
  const os_1 = require("os");
6
6
  const path_1 = require("path");
7
- const handoff_1 = require("./handoff");
7
+ const types_1 = require("./types");
8
8
  // --- Claude Code ---------------------------------------------------------
9
9
  function claudeCodeWellKnownPaths() {
10
10
  if (process.platform === 'win32') {
@@ -13,21 +13,48 @@ function claudeCodeWellKnownPaths() {
13
13
  }
14
14
  return [(0, path_1.join)((0, os_1.homedir)(), '.claude', 'local', 'claude')];
15
15
  }
16
- // Pre-authorizes the handoff write: Claude Code's default permission mode
17
- // asks before file writes it has no allow rule for, so without this each step
18
- // ends with an approval prompt for nx's own handoff scratch. Prefix-less
19
- // patterns resolve against the session cwd (pinned to the workspace root
20
- // below); `Edit` covers corrections to an already-written handoff.
21
- const CLAUDE_CODE_HANDOFF_ALLOWED_TOOLS = `Write(${handoff_1.MIGRATE_RUNS_RELATIVE_DIR}/**),Edit(${handoff_1.MIGRATE_RUNS_RELATIVE_DIR}/**)`;
16
+ /**
17
+ * The run directory names Nx will interpolate into a permission rule. A rule
18
+ * is a gitignore pattern, which reads `*?[]\` as syntax, and `--allowedTools`
19
+ * splits its value on commas and spaces, so a name carrying any of those
20
+ * would change what the rule authorizes rather than what it names. Run
21
+ * directory names derive from a migration's own version string, which nothing
22
+ * upstream constrains to this alphabet. The leading character rejects `.`
23
+ * and `..`.
24
+ */
25
+ const RULE_SAFE_RUN_DIR_NAME = /^[A-Za-z0-9][A-Za-z0-9._+-]*$/;
26
+ /**
27
+ * Pre-authorizes the handoff write. Claude Code's default permission mode
28
+ * asks before a file write it has no allow rule for, so without this every
29
+ * step ends on an approval prompt for Nx's own handoff scratch.
30
+ *
31
+ * The rule reaches one run's handoffs and nothing else. Its own run
32
+ * directory also holds state Nx wrote and reads back, and the sibling
33
+ * directories belong to other runs, including an orchestrated run whose
34
+ * handoffs decide how its steps settle. `Edit` is the only tool name file
35
+ * rules are matched against, and it covers creating the file as well as
36
+ * correcting one already written. Prefix-less patterns resolve against the
37
+ * session cwd, pinned to the workspace root below.
38
+ *
39
+ * Returns null for a name it cannot express, which costs the approval prompt
40
+ * this exists to avoid. That beats widening the rule, and nothing narrower is
41
+ * available: Claude Code has no escape for a literal path.
42
+ */
43
+ function claudeCodeHandoffAllowedTools(runDirName) {
44
+ if (!RULE_SAFE_RUN_DIR_NAME.test(runDirName)) {
45
+ return null;
46
+ }
47
+ return `Edit(${types_1.MIGRATE_RUNS_RELATIVE_DIR}/${runDirName}/${types_1.HANDOFFS_DIR_NAME}/**)`;
48
+ }
22
49
  function claudeCodeBuildInteractive(ctx) {
50
+ const allowedTools = claudeCodeHandoffAllowedTools(ctx.runDirName);
23
51
  return {
24
52
  // `--allowedTools` is variadic (space/comma separated): a positional
25
53
  // placed right after its value gets swallowed as another rule. The rules
26
54
  // must stay in one comma-joined element with a non-variadic flag
27
55
  // (`--system-prompt`) between them and the user prompt.
28
56
  args: [
29
- '--allowedTools',
30
- CLAUDE_CODE_HANDOFF_ALLOWED_TOOLS,
57
+ ...(allowedTools ? ['--allowedTools', allowedTools] : []),
31
58
  '--system-prompt',
32
59
  ctx.systemContext,
33
60
  ctx.userPrompt,
@@ -1,33 +1,30 @@
1
- export declare function isHandoffGitignoreMigration(m: {
2
- package: string;
3
- name: string;
4
- }): boolean;
5
1
  /**
6
- * Under `--agentic`, the runner writes per-run scratch under
7
- * `.nx/migrate-runs/<run-id>/`. The v23 migration
2
+ * Both the agentic runner and the orchestrator write per-run scratch under
3
+ * `.nx/migrate-runs/<run-id>/`: handoff files in both cases, plus the durable
4
+ * run state and its plan snapshots for the orchestrator. The v23 migration
8
5
  * `23-0-0-add-migrate-runs-to-git-ignore` adds `.nx/migrate-runs` to
9
- * `.gitignore`; without intervention it would run in its declared slot
10
- * (typically late), so earlier per-migration commits would absorb the
11
- * scratch into the user-visible diff.
6
+ * `.gitignore`; in its declared slot (typically late) earlier per-migration
7
+ * commits would absorb the scratch into the user-visible diff.
12
8
  *
13
9
  * Two paths cover the leak, with no overlap:
14
10
  *
15
- * 1. HOIST — handled by the sort comparator in `executeMigrations`. When
16
- * the v23 migration is in the queue, it sorts to position 0 and runs
17
- * first via the normal migration runner (with its own log line and
18
- * commit). Fully traceable in `git log`.
11
+ * 1. HOIST: `sortMigrations`, which `executeMigrations` applies, sorts the
12
+ * v23 migration to position 0 when it is in the queue, so it runs first
13
+ * through the normal runner with its own log line and commit. A
14
+ * single-migration worker run needs no hoisting: the requested migration
15
+ * is the entire queue.
19
16
  *
20
- * 2. INLINE FALLBACK — this function. When the migration is NOT in the
21
- * queue AND the highest target version is < v23 (intra-pre-v23
22
- * `--agentic` run), the migration won't run at all. Apply its body
23
- * inline against an `FsTree` and commit it as a standalone preflight
24
- * commit (or leave in the working tree under `--no-create-commits`).
17
+ * 2. INLINE FALLBACK, this function. When the migration is NOT in the queue
18
+ * AND the highest target version is < v23 (intra-pre-v23 `--agentic`
19
+ * run) it will never run, so apply its body inline against an `FsTree`
20
+ * and commit it as a standalone preflight commit (or leave it in the
21
+ * working tree under `--no-create-commits`).
25
22
  *
26
- * When the migration is not in the queue AND target >= v23, the user is
27
- * past v23 already. They had the entry historically; if it's gone, that's
28
- * a conscious removal we respect.
23
+ * Not in the queue AND target >= v23 means the user is already past v23. They
24
+ * had the entry historically; if it is gone, that is a conscious removal we
25
+ * respect.
29
26
  */
30
- export declare function applyAgenticHandoffGitignoreFallback({ migrations, installedNxVersion, effectiveCreateCommits, commitPrefix, root, }: {
27
+ export declare function applyAgenticHandoffGitignoreFallback({ migrations, installedNxVersion, effectiveCreateCommits, commitPrefix, root, applyWhenPlanned, commitStandalone, }: {
31
28
  migrations: ReadonlyArray<{
32
29
  package: string;
33
30
  name: string;
@@ -43,4 +40,22 @@ export declare function applyAgenticHandoffGitignoreFallback({ migrations, insta
43
40
  effectiveCreateCommits: boolean;
44
41
  commitPrefix: string;
45
42
  root: string;
43
+ /**
44
+ * Apply the entry even when the hoisted migration is in the plan. The
45
+ * classic loop can defer to that migration because its run scratch appears
46
+ * only after migration 1 has run; the orchestrator creates its run dir at
47
+ * init, before any migration, so it needs the entry immediately. A planned
48
+ * migration also means the missing entry is not a conscious removal, so the
49
+ * v23 cutoff does not apply.
50
+ */
51
+ applyWhenPlanned?: boolean;
52
+ /**
53
+ * Commit the applied entry as its own preflight commit (the default). The
54
+ * orchestrator suppresses this: it applies the fallback before its init
55
+ * checkpoint so the checkpoint's `git add -A` cannot sweep in older
56
+ * scratch, and in that ordering a standalone commit here would carry the
57
+ * user's pre-existing changes along with the entry. The checkpoint that
58
+ * follows captures both instead.
59
+ */
60
+ commitStandalone?: boolean;
46
61
  }): Promise<void>;