nx 23.2.0-beta.7 → 23.2.0-beta.9
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.
- package/dist/bin/init-local.js +3 -5
- package/dist/release/changelog-renderer/index.js +4 -5
- package/dist/src/adapter/ngcli-adapter.js +60 -1
- package/dist/src/ai/set-up-ai-agents/set-up-ai-agents.js +2 -2
- package/dist/src/command-line/completion/command-object.js +7 -12
- package/dist/src/command-line/configure-ai-agents/configure-ai-agents.js +17 -23
- package/dist/src/command-line/format/format.js +84 -101
- package/dist/src/command-line/generate/generate.js +35 -35
- package/dist/src/command-line/import/import.js +30 -40
- package/dist/src/command-line/init/ai-agent-prompts.js +5 -11
- package/dist/src/command-line/init/command-object.js +4 -2
- package/dist/src/command-line/init/configure-plugins.js +4 -1
- package/dist/src/command-line/init/implementation/add-nx-to-monorepo.js +12 -32
- package/dist/src/command-line/init/implementation/add-nx-to-nest.js +17 -21
- package/dist/src/command-line/init/implementation/add-nx-to-npm-repo.js +8 -21
- package/dist/src/command-line/init/implementation/add-nx-to-turborepo.js +3 -17
- package/dist/src/command-line/init/implementation/angular/index.js +10 -15
- package/dist/src/command-line/init/implementation/angular/legacy-angular-versions.js +2 -0
- package/dist/src/command-line/init/implementation/angular/standalone-workspace.js +8 -2
- package/dist/src/command-line/init/implementation/check-compatible-with-plugins.js +2 -0
- package/dist/src/command-line/init/implementation/dot-nx/add-nx-scripts.js +5 -0
- package/dist/src/command-line/init/implementation/format.d.ts +18 -0
- package/dist/src/command-line/init/implementation/format.js +114 -0
- package/dist/src/command-line/init/implementation/utils.js +8 -0
- package/dist/src/command-line/init/init-v1.js +15 -18
- package/dist/src/command-line/init/init-v2.js +37 -56
- package/dist/src/command-line/migrate/agentic/definitions.js +35 -8
- package/dist/src/command-line/migrate/agentic/handoff-gitignore.d.ts +22 -3
- package/dist/src/command-line/migrate/agentic/handoff-gitignore.js +13 -10
- package/dist/src/command-line/migrate/agentic/handoff.d.ts +3 -1
- package/dist/src/command-line/migrate/agentic/handoff.js +4 -2
- package/dist/src/command-line/migrate/agentic/run-step.js +1 -0
- package/dist/src/command-line/migrate/agentic/runner.js +24 -24
- package/dist/src/command-line/migrate/agentic/select.js +20 -30
- package/dist/src/command-line/migrate/agentic/types.d.ts +19 -3
- package/dist/src/command-line/migrate/agentic/types.js +13 -4
- package/dist/src/command-line/migrate/command-object.d.ts +3 -0
- package/dist/src/command-line/migrate/command-object.js +13 -0
- package/dist/src/command-line/migrate/execute-migration.d.ts +14 -0
- package/dist/src/command-line/migrate/execute-migration.js +30 -9
- package/dist/src/command-line/migrate/migrate-analytics.d.ts +28 -0
- package/dist/src/command-line/migrate/migrate-analytics.js +51 -1
- package/dist/src/command-line/migrate/migrate-commits.d.ts +8 -2
- package/dist/src/command-line/migrate/migrate-commits.js +66 -19
- package/dist/src/command-line/migrate/migrate-config.d.ts +4 -2
- package/dist/src/command-line/migrate/migrate-config.js +12 -4
- package/dist/src/command-line/migrate/migrate.d.ts +13 -2
- package/dist/src/command-line/migrate/migrate.js +243 -80
- package/dist/src/command-line/migrate/multi-major.js +7 -10
- package/dist/src/command-line/migrate/resolve-package-version.js +4 -8
- package/dist/src/command-line/migrate/run/agent-output.d.ts +20 -0
- package/dist/src/command-line/migrate/run/agent-output.js +65 -0
- package/dist/src/command-line/migrate/run/index.d.ts +7 -0
- package/dist/src/command-line/migrate/run/index.js +19 -1
- package/dist/src/command-line/migrate/run/orchestrator.d.ts +20 -0
- package/dist/src/command-line/migrate/run/orchestrator.js +1200 -0
- package/dist/src/command-line/migrate/run/run-id.d.ts +16 -0
- package/dist/src/command-line/migrate/run/run-id.js +56 -0
- package/dist/src/command-line/migrate/run/run-state.d.ts +157 -0
- package/dist/src/command-line/migrate/run/run-state.js +438 -0
- package/dist/src/command-line/migrate/run/state-lock.d.ts +25 -0
- package/dist/src/command-line/migrate/run/state-lock.js +76 -0
- package/dist/src/command-line/migrate/run/state-machine.d.ts +84 -0
- package/dist/src/command-line/migrate/run/state-machine.js +315 -0
- package/dist/src/command-line/migrate/run/util.d.ts +58 -0
- package/dist/src/command-line/migrate/run/util.js +139 -7
- package/dist/src/command-line/migrate/run/worker.d.ts +1 -0
- package/dist/src/command-line/migrate/run/worker.js +308 -45
- package/dist/src/command-line/migrate/safe-prompt.d.ts +14 -26
- package/dist/src/command-line/migrate/safe-prompt.js +32 -43
- package/dist/src/command-line/migrate/step-actions.d.ts +5 -0
- package/dist/src/command-line/migrate/step-actions.js +12 -0
- package/dist/src/command-line/migrate/text.d.ts +18 -0
- package/dist/src/command-line/migrate/text.js +26 -0
- package/dist/src/command-line/migrate/version-skew-guard.d.ts +6 -4
- package/dist/src/command-line/migrate/version-skew-guard.js +34 -14
- package/dist/src/command-line/nx-cloud/connect/connect-to-nx-cloud.js +16 -20
- package/dist/src/command-line/release/changelog.js +6 -17
- package/dist/src/command-line/release/plan.js +15 -28
- package/dist/src/command-line/release/release.js +6 -17
- package/dist/src/command-line/release/utils/remote-release-clients/github.js +16 -22
- package/dist/src/command-line/release/utils/remote-release-clients/gitlab.js +13 -22
- package/dist/src/command-line/release/utils/resolve-semver-specifier.js +19 -41
- package/dist/src/command-line/release/version/resolve-current-version.js +7 -10
- package/dist/src/command-line/release/version.js +2 -2
- package/dist/src/core/graph/main.js +1 -1
- package/dist/src/daemon/client/client.js +11 -2
- package/dist/src/devkit-internals.d.ts +7 -2
- package/dist/src/devkit-internals.js +22 -6
- package/dist/src/generators/internal-utils/{format-changed-files-with-prettier-if-available.d.ts → format-changed-files.d.ts} +6 -6
- package/dist/src/generators/internal-utils/format-changed-files.js +163 -0
- package/dist/src/generators/testing-utils/create-tree-with-empty-workspace.d.ts +15 -0
- package/dist/src/generators/testing-utils/create-tree-with-empty-workspace.js +21 -3
- package/dist/src/migrations/update-15-0-0/prefix-outputs.js +2 -2
- package/dist/src/migrations/update-16-0-0/remove-nrwl-cli.js +2 -2
- package/dist/src/migrations/update-16-0-0/update-depends-on-to-tokens.js +2 -2
- package/dist/src/migrations/update-16-0-0/update-nx-cloud-runner.js +2 -2
- package/dist/src/migrations/update-16-2-0/remove-run-commands-output-path.js +2 -2
- package/dist/src/migrations/update-17-0-0/rm-default-collection-npm-scope.js +2 -2
- package/dist/src/migrations/update-17-0-0/use-minimal-config-for-tasks-runner-options.js +2 -2
- package/dist/src/migrations/update-17-2-0/move-default-base.js +2 -2
- package/dist/src/migrations/update-18-0-0/disable-crystal-for-existing-workspaces.js +2 -2
- package/dist/src/migrations/update-19-2-4/set-project-name.js +2 -2
- package/dist/src/migrations/update-20-0-0/move-use-daemon-process.js +2 -2
- package/dist/src/migrations/update-20-0-1/use-legacy-cache.js +2 -2
- package/dist/src/migrations/update-21-0-0/release-changelog-config-changes.js +2 -2
- package/dist/src/migrations/update-21-0-0/release-version-config-changes.js +2 -2
- package/dist/src/migrations/update-21-0-0/remove-custom-tasks-runner.js +2 -2
- package/dist/src/migrations/update-21-0-0/remove-legacy-cache.js +2 -2
- package/dist/src/migrations/update-22-0-0/consolidate-release-tag-config.js +2 -2
- package/dist/src/migrations/update-22-0-0/release-version-config-changes.js +2 -2
- package/dist/src/migrations/update-22-2-0/add-self-healing-to-gitignore.js +2 -2
- package/dist/src/migrations/update-22-6-0/add-claude-settings-local-to-git-ignore.js +2 -2
- package/dist/src/migrations/update-22-6-0/add-claude-worktrees-to-git-ignore.js +2 -2
- package/dist/src/migrations/update-22-7-0/add-polygraph-to-git-ignore.js +2 -2
- package/dist/src/migrations/update-23-0-0/add-migrate-runs-to-git-ignore.js +2 -2
- package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.d.ts +12 -0
- package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.js +250 -0
- package/dist/src/migrations/update-23-2-0/set-cache-on-executor-target-defaults.md +50 -0
- package/dist/src/native/nx.wasm32-wasi.debug.wasm +0 -0
- package/dist/src/native/nx.wasm32-wasi.wasm +0 -0
- package/dist/src/nx-cloud/generators/connect-to-nx-cloud/connect-to-nx-cloud.js +3 -3
- package/dist/src/plugins/js/lock-file/bun-parser.js +43 -10
- package/dist/src/project-graph/utils/project-configuration/target-normalization.js +128 -2
- package/dist/src/tasks-runner/run-command.js +17 -32
- package/dist/src/tasks-runner/task-env.js +5 -2
- package/dist/src/tasks-runner/utils.js +2 -6
- package/dist/src/utils/analytics-prompt.js +4 -7
- package/dist/src/utils/chunkify.d.ts +7 -1
- package/dist/src/utils/chunkify.js +10 -3
- package/dist/src/utils/exit-codes.d.ts +9 -0
- package/dist/src/utils/exit-codes.js +19 -0
- package/dist/src/utils/fileutils.d.ts +5 -0
- package/dist/src/utils/fileutils.js +7 -2
- package/dist/src/utils/formatters/index.d.ts +13 -0
- package/dist/src/utils/formatters/index.js +74 -0
- package/dist/src/utils/formatters/oxfmt.d.ts +32 -0
- package/dist/src/utils/formatters/oxfmt.js +764 -0
- package/dist/src/utils/formatters/prettier.d.ts +26 -0
- package/dist/src/utils/formatters/prettier.js +201 -0
- package/dist/src/utils/formatters/shared.d.ts +5 -0
- package/dist/src/utils/formatters/shared.js +8 -0
- package/dist/src/utils/git-utils.d.ts +33 -2
- package/dist/src/utils/git-utils.js +156 -8
- package/dist/src/utils/ignore.d.ts +47 -5
- package/dist/src/utils/ignore.js +93 -11
- package/dist/src/utils/long-running-target.d.ts +10 -0
- package/dist/src/utils/long-running-target.js +19 -0
- package/dist/src/utils/min-release-age/behavior/bun.js +7 -11
- package/dist/src/utils/min-release-age/behavior/npm.js +5 -2
- package/dist/src/utils/min-release-age/packument.js +1 -1
- package/dist/src/utils/nx-console-prompt.js +3 -6
- package/dist/src/utils/package-manager-config/bunfig.d.ts +14 -0
- package/dist/src/utils/package-manager-config/bunfig.js +49 -0
- package/dist/src/utils/package-manager-config/npmrc.d.ts +23 -0
- package/dist/src/utils/package-manager-config/npmrc.js +124 -0
- package/dist/src/utils/package-manager-config/pnpm-config.d.ts +17 -0
- package/dist/src/utils/package-manager-config/pnpm-config.js +60 -0
- package/dist/src/utils/package-manager.d.ts +21 -2
- package/dist/src/utils/package-manager.js +244 -47
- package/dist/src/utils/params.d.ts +7 -1
- package/dist/src/utils/params.js +64 -6
- package/dist/src/utils/prompt-helpers.d.ts +53 -0
- package/dist/src/utils/prompt-helpers.js +111 -0
- package/dist/src/utils/provenance.js +6 -14
- package/dist/src/utils/registry-config/bun.d.ts +2 -0
- package/dist/src/utils/registry-config/bun.js +257 -0
- package/dist/src/utils/registry-config/index.d.ts +13 -0
- package/dist/src/utils/registry-config/index.js +102 -0
- package/dist/src/utils/registry-config/pnpm.d.ts +2 -0
- package/dist/src/utils/registry-config/pnpm.js +1551 -0
- package/dist/src/utils/registry-config/utils.d.ts +195 -0
- package/dist/src/utils/registry-config/utils.js +496 -0
- package/dist/src/utils/registry-config/yarn-berry.d.ts +2 -0
- package/dist/src/utils/registry-config/yarn-berry.js +612 -0
- package/dist/src/utils/registry-config/yarn-classic.d.ts +2 -0
- package/dist/src/utils/registry-config/yarn-classic.js +1001 -0
- package/dist/src/utils/safe-spawn.d.ts +24 -0
- package/dist/src/utils/safe-spawn.js +104 -0
- package/dist/src/utils/write-formatted-json-file.d.ts +3 -2
- package/dist/src/utils/write-formatted-json-file.js +5 -4
- package/migrations.json +6 -0
- package/package.json +17 -13
- package/dist/src/generators/internal-utils/format-changed-files-with-prettier-if-available.js +0 -88
- package/dist/src/utils/is-using-prettier.d.ts +0 -3
- package/dist/src/utils/is-using-prettier.js +0 -62
- package/dist/src/utils/min-release-age/npmrc.d.ts +0 -15
- 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
|
|
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,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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,7 +5,7 @@ exports.getPluginReason = getPluginReason;
|
|
|
5
5
|
exports.detectPlugins = detectPlugins;
|
|
6
6
|
const fs_1 = require("fs");
|
|
7
7
|
const path_1 = require("path");
|
|
8
|
-
const
|
|
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");
|
|
@@ -20,6 +20,7 @@ const configure_plugins_1 = require("./configure-plugins");
|
|
|
20
20
|
const ai_agent_prompts_1 = require("./ai-agent-prompts");
|
|
21
21
|
const set_up_ai_agents_1 = require("../../ai/set-up-ai-agents/set-up-ai-agents");
|
|
22
22
|
const tree_1 = require("../../generators/tree");
|
|
23
|
+
const format_1 = require("./implementation/format");
|
|
23
24
|
const add_nx_to_monorepo_1 = require("./implementation/add-nx-to-monorepo");
|
|
24
25
|
const add_nx_to_npm_repo_1 = require("./implementation/add-nx-to-npm-repo");
|
|
25
26
|
const add_nx_to_turborepo_1 = require("./implementation/add-nx-to-turborepo");
|
|
@@ -33,7 +34,6 @@ 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, package_json_1.installPackageToTmp)('nx', 'latest', (0,
|
|
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,
|
|
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,
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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,
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
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,
|
|
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)({
|
|
@@ -576,39 +578,18 @@ async function detectPlugins(nxJson, packageJson, interactive, includeAngularCli
|
|
|
576
578
|
`Add these Nx plugins to integrate with the tools used in your workspace.`,
|
|
577
579
|
],
|
|
578
580
|
});
|
|
579
|
-
const pluginsToInstall = await (0,
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
message: `Which plugins would you like to add? Press <Space> to select and <Enter> to submit.`,
|
|
584
|
-
choices: plugins.map((p) => ({ name: p, value: p })),
|
|
585
|
-
/**
|
|
586
|
-
* limit is missing from the interface but it limits the amount of options shown
|
|
587
|
-
*/
|
|
588
|
-
limit: process.stdout.rows - 4, // 4 leaves room for the header above, the prompt and some whitespace
|
|
589
|
-
},
|
|
590
|
-
]).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
|
+
});
|
|
591
585
|
if (pluginsToInstall?.length === 0)
|
|
592
586
|
return {
|
|
593
587
|
plugins: [],
|
|
594
588
|
updatePackageScripts: false,
|
|
595
589
|
};
|
|
596
590
|
const updatePackageScripts = (0, fs_1.existsSync)('package.json') &&
|
|
597
|
-
(await (0,
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
type: 'autocomplete',
|
|
601
|
-
message: `Do you want to start using Nx in your package.json scripts?`,
|
|
602
|
-
choices: [
|
|
603
|
-
{
|
|
604
|
-
name: 'Yes',
|
|
605
|
-
},
|
|
606
|
-
{
|
|
607
|
-
name: 'No',
|
|
608
|
-
},
|
|
609
|
-
],
|
|
610
|
-
initial: 0,
|
|
611
|
-
},
|
|
612
|
-
]).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
|
+
}));
|
|
613
594
|
return { plugins: pluginsToInstall, updatePackageScripts };
|
|
614
595
|
}
|
|
@@ -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
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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,6 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* `.nx/migrate-runs/<run-id
|
|
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
|
|
4
5
|
* `23-0-0-add-migrate-runs-to-git-ignore` adds `.nx/migrate-runs` to
|
|
5
6
|
* `.gitignore`; in its declared slot (typically late) earlier per-migration
|
|
6
7
|
* commits would absorb the scratch into the user-visible diff.
|
|
@@ -23,7 +24,7 @@
|
|
|
23
24
|
* had the entry historically; if it is gone, that is a conscious removal we
|
|
24
25
|
* respect.
|
|
25
26
|
*/
|
|
26
|
-
export declare function applyAgenticHandoffGitignoreFallback({ migrations, installedNxVersion, effectiveCreateCommits, commitPrefix, root, }: {
|
|
27
|
+
export declare function applyAgenticHandoffGitignoreFallback({ migrations, installedNxVersion, effectiveCreateCommits, commitPrefix, root, applyWhenPlanned, commitStandalone, }: {
|
|
27
28
|
migrations: ReadonlyArray<{
|
|
28
29
|
package: string;
|
|
29
30
|
name: string;
|
|
@@ -39,4 +40,22 @@ export declare function applyAgenticHandoffGitignoreFallback({ migrations, insta
|
|
|
39
40
|
effectiveCreateCommits: boolean;
|
|
40
41
|
commitPrefix: string;
|
|
41
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;
|
|
42
61
|
}): Promise<void>;
|
|
@@ -10,8 +10,9 @@ const git_utils_1 = require("../../../utils/git-utils");
|
|
|
10
10
|
const logger_1 = require("../../../utils/logger");
|
|
11
11
|
const types_1 = require("./types");
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
14
|
-
* `.nx/migrate-runs/<run-id
|
|
13
|
+
* Both the agentic runner and the orchestrator write per-run scratch under
|
|
14
|
+
* `.nx/migrate-runs/<run-id>/`: handoff files in both cases, plus the durable
|
|
15
|
+
* run state and its plan snapshots for the orchestrator. The v23 migration
|
|
15
16
|
* `23-0-0-add-migrate-runs-to-git-ignore` adds `.nx/migrate-runs` to
|
|
16
17
|
* `.gitignore`; in its declared slot (typically late) earlier per-migration
|
|
17
18
|
* commits would absorb the scratch into the user-visible diff.
|
|
@@ -34,13 +35,15 @@ const types_1 = require("./types");
|
|
|
34
35
|
* had the entry historically; if it is gone, that is a conscious removal we
|
|
35
36
|
* respect.
|
|
36
37
|
*/
|
|
37
|
-
async function applyAgenticHandoffGitignoreFallback({ migrations, installedNxVersion, effectiveCreateCommits, commitPrefix, root, }) {
|
|
38
|
+
async function applyAgenticHandoffGitignoreFallback({ migrations, installedNxVersion, effectiveCreateCommits, commitPrefix, root, applyWhenPlanned = false, commitStandalone = true, }) {
|
|
38
39
|
if (migrations.some(types_1.isHandoffGitignoreMigration)) {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
if (!applyWhenPlanned) {
|
|
41
|
+
// The queue runs it itself: hoisted to the front by the sort comparator
|
|
42
|
+
// in a full run, or as the single requested migration in a worker run.
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
42
45
|
}
|
|
43
|
-
if ((0, semver_1.major)(installedNxVersion) >= 23) {
|
|
46
|
+
else if ((0, semver_1.major)(installedNxVersion) >= 23) {
|
|
44
47
|
// User is past v23. Respect their `.gitignore` state — if the entry
|
|
45
48
|
// is missing, that's a conscious removal.
|
|
46
49
|
return;
|
|
@@ -54,13 +57,13 @@ async function applyAgenticHandoffGitignoreFallback({ migrations, installedNxVer
|
|
|
54
57
|
return;
|
|
55
58
|
}
|
|
56
59
|
(0, tree_1.flushChanges)(root, changes);
|
|
57
|
-
logger_1.logger.info(pc.dim(`- Added .
|
|
58
|
-
if (!effectiveCreateCommits)
|
|
60
|
+
logger_1.logger.info(pc.dim(`- Added ${types_1.MIGRATE_RUNS_RELATIVE_DIR} to .gitignore so this run's scratch state is ignored.`));
|
|
61
|
+
if (!effectiveCreateCommits || !commitStandalone)
|
|
59
62
|
return;
|
|
60
63
|
if (!(0, git_utils_1.hasUncommittedChanges)(root))
|
|
61
64
|
return;
|
|
62
65
|
try {
|
|
63
|
-
const sha = (0, git_utils_1.tryCommitChanges)(`${commitPrefix}add .
|
|
66
|
+
const sha = (0, git_utils_1.tryCommitChanges)(`${commitPrefix}add ${types_1.MIGRATE_RUNS_RELATIVE_DIR} to .gitignore`, root, [types_1.MIGRATE_RUNS_RELATIVE_DIR]);
|
|
64
67
|
if (sha) {
|
|
65
68
|
logger_1.logger.info(pc.dim(` Commit: ${sha}`));
|
|
66
69
|
}
|
|
@@ -20,7 +20,9 @@ export declare function mkdirSafely(dir: string, purpose: string): void;
|
|
|
20
20
|
*/
|
|
21
21
|
export declare function initRunDir(workspaceRoot: string, runId: string): string;
|
|
22
22
|
/**
|
|
23
|
-
* Absolute path of the handoff file for a migration step within a run
|
|
23
|
+
* Absolute path of the handoff file for a migration step within a run, under
|
|
24
|
+
* the run directory's `handoffs/` subtree: the pre-authorized write scope
|
|
25
|
+
* stops there, so a handoff placed anywhere else costs an approval prompt.
|
|
24
26
|
* The package's scope (if any) becomes a real subdirectory so the package name
|
|
25
27
|
* stays readable; two packages can ship a migration with the same name without
|
|
26
28
|
* colliding because they land in different package subdirectories. Each
|
|
@@ -72,14 +72,16 @@ function sanitizeSegment(value) {
|
|
|
72
72
|
return sanitized || '_';
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
|
-
* Absolute path of the handoff file for a migration step within a run
|
|
75
|
+
* Absolute path of the handoff file for a migration step within a run, under
|
|
76
|
+
* the run directory's `handoffs/` subtree: the pre-authorized write scope
|
|
77
|
+
* stops there, so a handoff placed anywhere else costs an approval prompt.
|
|
76
78
|
* The package's scope (if any) becomes a real subdirectory so the package name
|
|
77
79
|
* stays readable; two packages can ship a migration with the same name without
|
|
78
80
|
* colliding because they land in different package subdirectories. Each
|
|
79
81
|
* segment is sanitized so the path is always writable on every platform.
|
|
80
82
|
*/
|
|
81
83
|
function stepHandoffPath(runDir, migration) {
|
|
82
|
-
return (0, path_1.join)(runDir, ...migration.package.split('/').map(sanitizeSegment), `${sanitizeSegment(migration.name)}.json`);
|
|
84
|
+
return (0, path_1.join)(runDir, types_1.HANDOFFS_DIR_NAME, ...migration.package.split('/').map(sanitizeSegment), `${sanitizeSegment(migration.name)}.json`);
|
|
83
85
|
}
|
|
84
86
|
/**
|
|
85
87
|
* Reads and validates a handoff file written by an agent. Returns a tagged
|