Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/fix-console-interceptor-2900.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/core": patch
---

Fix: ConsoleInterceptor now delegates to original console methods to preserve log chain when other interceptors (like Sentry) are present. (#2900)
5 changes: 5 additions & 0 deletions .changeset/fix-docker-hub-rate-limit-2911.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/cli-v3": patch
---

Fix: Native build server failed with Docker Hub rate limits. Added support for checking checking `DOCKER_USERNAME` and `DOCKER_PASSWORD` in environment variables and logging into Docker Hub before building. (#2911)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix duplicated word in changelog.

There’s a typo (“checking checking”) in the user-facing release note.

✏️ Proposed fix
-Fix: Native build server failed with Docker Hub rate limits. Added support for checking checking `DOCKER_USERNAME` and `DOCKER_PASSWORD` in environment variables and logging into Docker Hub before building. (`#2911`)
+Fix: Native build server failed with Docker Hub rate limits. Added support for checking `DOCKER_USERNAME` and `DOCKER_PASSWORD` in environment variables and logging into Docker Hub before building. (`#2911`)
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Fix: Native build server failed with Docker Hub rate limits. Added support for checking checking `DOCKER_USERNAME` and `DOCKER_PASSWORD` in environment variables and logging into Docker Hub before building. (#2911)
Fix: Native build server failed with Docker Hub rate limits. Added support for checking `DOCKER_USERNAME` and `DOCKER_PASSWORD` in environment variables and logging into Docker Hub before building. (`#2911`)
🤖 Prompt for AI Agents
In @.changeset/fix-docker-hub-rate-limit-2911.md at line 5, The changelog line
contains a duplicated word "checking checking" in the sentence about environment
variables; edit the text to remove the duplicate so it reads "checking
`DOCKER_USERNAME` and `DOCKER_PASSWORD` in environment variables and logging
into Docker Hub before building" (search for the string "checking checking
`DOCKER_USERNAME`" to locate and fix it).

5 changes: 5 additions & 0 deletions .changeset/fix-github-install-node-version-2913.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@trigger.dev/cli-v3": patch
---

Fix: Ignore engine checks during deployment install phase to prevent failure on build server when Node version mismatch exists. (#2913)
86 changes: 36 additions & 50 deletions packages/cli-v3/src/commands/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) {
}

if (!options.skipUpdateCheck) {
await updateTriggerPackages(dir, { ...options }, true, true);
await updateTriggerPackages(dir, { ...options, ignoreEngines: true }, true, true);
}

const cwd = process.cwd();
Expand Down Expand Up @@ -489,9 +489,8 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) {
const version = deployment.version;

const rawDeploymentLink = `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project}/deployments/${deployment.shortCode}`;
const rawTestLink = `${authorization.dashboardUrl}/projects/v3/${
resolvedConfig.project
}/test?environment=${options.env === "prod" ? "prod" : "stg"}`;
const rawTestLink = `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project
}/test?environment=${options.env === "prod" ? "prod" : "stg"}`;

const deploymentLink = cliLink("View deployment", rawDeploymentLink);
const testLink = cliLink("Test tasks", rawTestLink);
Expand Down Expand Up @@ -708,8 +707,7 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) {
}
} else {
outro(
`Version ${version} deployed with ${taskCount} detected task${taskCount === 1 ? "" : "s"} ${
isLinksSupported ? `| ${deploymentLink} | ${testLink}` : ""
`Version ${version} deployed with ${taskCount} detected task${taskCount === 1 ? "" : "s"} ${isLinksSupported ? `| ${deploymentLink} | ${testLink}` : ""
}`
);

Expand All @@ -733,18 +731,16 @@ async function _deployCommand(dir: string, options: DeployCommandOptions) {
TRIGGER_VERSION: version,
TRIGGER_DEPLOYMENT_SHORT_CODE: deployment.shortCode,
TRIGGER_DEPLOYMENT_URL: `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project}/deployments/${deployment.shortCode}`,
TRIGGER_TEST_URL: `${authorization.dashboardUrl}/projects/v3/${
resolvedConfig.project
}/test?environment=${options.env === "prod" ? "prod" : "stg"}`,
TRIGGER_TEST_URL: `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project
}/test?environment=${options.env === "prod" ? "prod" : "stg"}`,
},
outputs: {
deploymentVersion: version,
workerVersion: version,
deploymentShortCode: deployment.shortCode,
deploymentUrl: `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project}/deployments/${deployment.shortCode}`,
testUrl: `${authorization.dashboardUrl}/projects/v3/${
resolvedConfig.project
}/test?environment=${options.env === "prod" ? "prod" : "stg"}`,
testUrl: `${authorization.dashboardUrl}/projects/v3/${resolvedConfig.project
}/test?environment=${options.env === "prod" ? "prod" : "stg"}`,
needsPromotion: options.skipPromotion ? "true" : "false",
},
});
Expand Down Expand Up @@ -787,8 +783,7 @@ async function failDeploy(
checkLogsForErrors(logs);

outro(
`${chalkError(`${prefix}:`)} ${
error.message
`${chalkError(`${prefix}:`)} ${error.message
}. Full build logs have been saved to ${logPath}`
);

Expand Down Expand Up @@ -1088,9 +1083,8 @@ async function handleNativeBuildServerDeploy({
const deployment = initializeDeploymentResult.data;

const rawDeploymentLink = `${dashboardUrl}/projects/v3/${config.project}/deployments/${deployment.shortCode}`;
const rawTestLink = `${dashboardUrl}/projects/v3/${config.project}/test?environment=${
options.env === "prod" ? "prod" : "stg"
}`;
const rawTestLink = `${dashboardUrl}/projects/v3/${config.project}/test?environment=${options.env === "prod" ? "prod" : "stg"
}`;

const exposedDeploymentLink = isLinksSupported
? cliLink(chalk.bold(rawDeploymentLink), rawDeploymentLink)
Expand Down Expand Up @@ -1156,8 +1150,7 @@ async function handleNativeBuildServerDeploy({
log.warn(`Failed streaming build logs, open the deployment in the dashboard to view the logs`);

outro(
`Version ${deployment.version} is being deployed ${
isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
`Version ${deployment.version} is being deployed ${isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
}`
);

Expand Down Expand Up @@ -1204,10 +1197,10 @@ async function handleNativeBuildServerDeploy({
level === "error"
? chalk.bold(chalkError(message))
: level === "warn"
? chalkWarning(message)
: level === "debug"
? chalkGrey(message)
: message;
? chalkWarning(message)
: level === "debug"
? chalkGrey(message)
: message;

// We use console.log here instead of clack's logger as the current version does not support changing the line spacing.
// And the logs look verbose with the default spacing.
Expand Down Expand Up @@ -1240,8 +1233,7 @@ async function handleNativeBuildServerDeploy({
log.error("Failed dequeueing build, please try again shortly");

throw new OutroCommandError(
`Version ${deployment.version} ${
isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
`Version ${deployment.version} ${isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
}`
);
}
Expand All @@ -1256,8 +1248,7 @@ async function handleNativeBuildServerDeploy({
}

throw new OutroCommandError(
`Version ${deployment.version} ${
isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
`Version ${deployment.version} ${isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
}`
);
}
Expand All @@ -1283,13 +1274,12 @@ async function handleNativeBuildServerDeploy({
}

outro(
`Version ${deployment.version} was deployed ${
isLinksSupported
? `| ${cliLink("Test tasks", rawTestLink)} | ${cliLink(
"View deployment",
rawDeploymentLink
)}`
: ""
`Version ${deployment.version} was deployed ${isLinksSupported
? `| ${cliLink("Test tasks", rawTestLink)} | ${cliLink(
"View deployment",
rawDeploymentLink
)}`
: ""
}`
);
return process.exit(0);
Expand All @@ -1303,14 +1293,13 @@ async function handleNativeBuildServerDeploy({
chalk.bold(
chalkError(
"Deployment failed" +
(finalDeploymentEvent.message ? `: ${finalDeploymentEvent.message}` : "")
(finalDeploymentEvent.message ? `: ${finalDeploymentEvent.message}` : "")
)
)
);

throw new OutroCommandError(
`Version ${deployment.version} deployment failed ${
isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
`Version ${deployment.version} deployment failed ${isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
}`
);
}
Expand All @@ -1323,14 +1312,13 @@ async function handleNativeBuildServerDeploy({
chalk.bold(
chalkError(
"Deployment timed out" +
(finalDeploymentEvent.message ? `: ${finalDeploymentEvent.message}` : "")
(finalDeploymentEvent.message ? `: ${finalDeploymentEvent.message}` : "")
)
)
);

throw new OutroCommandError(
`Version ${deployment.version} deployment timed out ${
isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
`Version ${deployment.version} deployment timed out ${isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
}`
);
}
Expand All @@ -1343,14 +1331,13 @@ async function handleNativeBuildServerDeploy({
chalk.bold(
chalkError(
"Deployment was canceled" +
(finalDeploymentEvent.message ? `: ${finalDeploymentEvent.message}` : "")
(finalDeploymentEvent.message ? `: ${finalDeploymentEvent.message}` : "")
)
)
);

throw new OutroCommandError(
`Version ${deployment.version} deployment canceled ${
isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
`Version ${deployment.version} deployment canceled ${isLinksSupported ? `| ${cliLink("View deployment", rawDeploymentLink)}` : ""
}`
);
}
Expand All @@ -1369,13 +1356,12 @@ async function handleNativeBuildServerDeploy({
}

outro(
`Version ${deployment.version} ${
isLinksSupported
? `| ${cliLink("Test tasks", rawTestLink)} | ${cliLink(
"View deployment",
rawDeploymentLink
)}`
: ""
`Version ${deployment.version} ${isLinksSupported
? `| ${cliLink("Test tasks", rawTestLink)} | ${cliLink(
"View deployment",
rawDeploymentLink
)}`
: ""
}`
);
return process.exit(0);
Expand Down
113 changes: 113 additions & 0 deletions packages/cli-v3/src/commands/update.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@

import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { updateTriggerPackages } from "./update.js";
import * as nypm from "nypm";
import * as pkgTypes from "pkg-types";
import * as fs from "node:fs/promises";
import * as clack from "@clack/prompts";
import path from "node:path";

// Mock dependencies
vi.mock("nypm");
vi.mock("pkg-types");
vi.mock("node:fs/promises");
vi.mock("@clack/prompts");
vi.mock("std-env", () => ({
hasTTY: true,
isCI: false,
}));
vi.mock("../utilities/initialBanner.js", () => ({
updateCheck: vi.fn().mockResolvedValue(undefined),
printStandloneInitialBanner: vi.fn(),
}));
vi.mock("../version.js", () => ({
VERSION: "3.0.0",
}));
vi.mock("../cli/common.js", () => ({
CommonCommandOptions: { pick: () => ({}) },
}));
vi.mock("../utilities/cliOutput.js", () => ({
chalkError: vi.fn(),
prettyError: vi.fn(),
prettyWarning: vi.fn(),
}));
vi.mock("../utilities/fileSystem.js", () => ({
removeFile: vi.fn(),
writeJSONFilePreserveOrder: vi.fn(),
}));
vi.mock("../utilities/logger.js", () => ({
logger: {
debug: vi.fn(),
log: vi.fn(),
table: vi.fn(),
},
}));
vi.mock("../utilities/windows.js", () => ({
spinner: () => ({
start: vi.fn(),
message: vi.fn(),
stop: vi.fn(),
}),
}));

describe("updateTriggerPackages", () => {
beforeEach(() => {
vi.resetAllMocks();

// Default mocks
vi.mocked(fs.writeFile).mockResolvedValue(undefined);
vi.mocked(fs.rm).mockResolvedValue(undefined);
vi.mocked(pkgTypes.readPackageJSON).mockResolvedValue({
dependencies: {
"@trigger.dev/sdk": "2.0.0", // Mismatch
},
});
vi.mocked(pkgTypes.resolvePackageJSON).mockResolvedValue("/path/to/package.json");
vi.mocked(clack.confirm).mockResolvedValue(true); // User confirms update
vi.mocked(nypm.installDependencies).mockResolvedValue(undefined);
});

afterEach(() => {
vi.clearAllMocks();
});

it("should pass --no-engine-strict for npm when ignoreEngines is true", async () => {
vi.mocked(nypm.detectPackageManager).mockResolvedValue({ name: "npm", command: "npm", version: "1.0.0" } as any);

await updateTriggerPackages(".", { ignoreEngines: true } as any, true, true);

expect(nypm.installDependencies).toHaveBeenCalledWith(expect.objectContaining({
args: ["--no-engine-strict"],
}));
});

it("should pass --config.engine-strict=false for pnpm when ignoreEngines is true", async () => {
vi.mocked(nypm.detectPackageManager).mockResolvedValue({ name: "pnpm", command: "pnpm", version: "1.0.0" } as any);

await updateTriggerPackages(".", { ignoreEngines: true } as any, true, true);

expect(nypm.installDependencies).toHaveBeenCalledWith(expect.objectContaining({
args: ["--config.engine-strict=false"],
}));
});

it("should pass --ignore-engines for yarn when ignoreEngines is true", async () => {
vi.mocked(nypm.detectPackageManager).mockResolvedValue({ name: "yarn", command: "yarn", version: "1.0.0" } as any);

await updateTriggerPackages(".", { ignoreEngines: true } as any, true, true);

expect(nypm.installDependencies).toHaveBeenCalledWith(expect.objectContaining({
args: ["--ignore-engines"],
}));
});

it("should NOT pass engine flags if ignoreEngines is false (default)", async () => {
vi.mocked(nypm.detectPackageManager).mockResolvedValue({ name: "npm", command: "npm", version: "1.0.0" } as any);

await updateTriggerPackages(".", { ignoreEngines: false } as any, true, true);

expect(nypm.installDependencies).toHaveBeenCalledWith(expect.objectContaining({
args: [],
}));
});
Comment on lines +1 to +112
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Mocks in this test conflict with repo testing policy.

This suite relies on extensive vi.mock usage; the repo standard is to avoid mocks and use testcontainers/integration-style helpers instead. Please rework these tests to align with the no-mocks policy.

As per coding guidelines: Use vitest exclusively for testing and never mock anything - use testcontainers instead.

🤖 Prompt for AI Agents
In `@packages/cli-v3/src/commands/update.test.ts` around lines 1 - 112, The tests
for updateTriggerPackages currently violate the repo policy by using many
vi.mock calls (see vi.mock of "nypm", "pkg-types", "node:fs/promises",
"@clack/prompts", etc.) — replace these unit-style mocks with integration-style
setup: remove all vi.mock and vi.mocked usage and instead spin up real test
fixtures (or testcontainers) that provide a real package.json on disk, a real
package manager environment or a minimal harness to simulate npm/pnpm/yarn
behavior, and real filesystem operations; keep the same assertions against
updateTriggerPackages(...) but exercise the function against real files and
processes (use helper utilities for creating temp project dirs, writing
package.json, and controlling ENV to select package manager) so tests comply
with the no-mocks requirement while still verifying args passed to
nypm.installDependencies indirectly via the integration harness.

});
22 changes: 19 additions & 3 deletions packages/cli-v3/src/commands/update.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import * as semver from "semver";
export const UpdateCommandOptions = CommonCommandOptions.pick({
logLevel: true,
skipTelemetry: true,
ignoreEngines: true,

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔴 Missing ignoreEngines field in CommonCommandOptions causes feature to never work

The ignoreEngines feature added in this PR will never work because ignoreEngines is not defined in CommonCommandOptions schema.

Click to expand

Problem

In update.ts, the code tries to pick ignoreEngines from CommonCommandOptions:

export const UpdateCommandOptions = CommonCommandOptions.pick({
  logLevel: true,
  skipTelemetry: true,
  ignoreEngines: true,  // This key doesn't exist!
});

However, CommonCommandOptions in common.ts:12-17 only defines:

export const CommonCommandOptions = z.object({
  apiUrl: z.string().optional(),
  logLevel: z.enum([...]).default("log"),
  skipTelemetry: z.boolean().default(false),
  profile: z.string().default(...),
});

Impact

When using Zod's .pick() with a non-existent key, it silently ignores it. The resulting UpdateCommandOptions schema won't include ignoreEngines, so options.ignoreEngines at line 263 will always be undefined. This means the engine-ignore flags (--no-engine-strict, --config.engine-strict=false, --ignore-engines) will never be passed to package managers, completely defeating the purpose of the feature.

Recommendation: Add ignoreEngines: z.boolean().default(false) to CommonCommandOptions in packages/cli-v3/src/cli/common.ts.

Open in Devin Review

Was this helpful? React with 👍 or 👎 to provide feedback.

});

export type UpdateCommandOptions = z.infer<typeof UpdateCommandOptions>;
Expand Down Expand Up @@ -257,11 +258,26 @@ export async function updateTriggerPackages(
`Installing new package versions${packageManager ? ` with ${packageManager.name}` : ""}`
);

await installDependencies({ cwd: projectPath, silent: true });
const installArgs: string[] = [];

if (options.ignoreEngines && packageManager) {
switch (packageManager.name) {
case "npm":
installArgs.push("--no-engine-strict");
break;
case "pnpm":
installArgs.push("--config.engine-strict=false");
break;
case "yarn":
installArgs.push("--ignore-engines");
break;
}
}

await installDependencies({ cwd: projectPath, silent: true, args: installArgs });
} catch (error) {
installSpinner.stop(
`Failed to install new package versions${
packageManager ? ` with ${packageManager.name}` : ""
`Failed to install new package versions${packageManager ? ` with ${packageManager.name}` : ""
}`
);
Comment on lines +261 to 282
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🌐 Web query:

npm --no-engine-strict flag documentation

💡 Result:

--no-engine-strict isn’t documented as its own npm flag. What npm documents is the engine-strict config (boolean) and the generic rule that any config can be set on the command line with --option-name value. (docs.npmjs.com)

So, instead of --no-engine-strict, use the documented form:

npm install --engine-strict=false

And to enable it:

npm install --engine-strict
# (equivalent to --engine-strict=true)

What it does: when engine-strict is true, npm refuses to install packages whose engines don’t match your current Node.js version; it can be overridden with --force. (docs.npmjs.com)

References
[1] npm Docs – config (CLI flags + engine-strict) (docs.npmjs.com)

Citations:


🌐 Web query:

pnpm --config.engine-strict=false flag documentation

💡 Result:

engine-strict is a pnpm setting (from .npmrc / pnpm settings), not a dedicated pnpm install option. The documented way to pass it inline on the command line is via --config.<key>=<value>:

pnpm install --config.engine-strict=false
# (or pnpm add ... --config.engine-strict=false)

This --config. mechanism is documented in pnpm’s CLI docs (“force the unknown option with --config.”). [1]

The setting itself is documented as engine-strict (default false) in pnpm’s Settings / .npmrc docs, and you can also set it persistently via:

# .npmrc
engine-strict=false
``` [2]

**Sources:** [1] [2]

---

🌐 Web query:

`yarn --ignore-engines flag v1 v2 Berry documentation`

💡 Result:

- **Yarn v1 (Classic)** supports `--ignore-engines` (skips the `engines` compatibility check). It’s documented on the Classic `yarn install` page under “`yarn install --ignore-engines`”. [1]

- **Yarn v2+ (Berry / modern Yarn)**: the current `yarn install` docs **do not list** a `--ignore-engines` option. [2] Relatedly, Berry has an open feature request to “return / restore” the old Yarn 1.x-style `engines` check behavior (“Just restore old behavior from 1.x”). [3]

**Sources:**  
[1] Yarn Classic `yarn install` docs (includes `--ignore-engines`) ([classic.yarnpkg.com](https://classic.yarnpkg.com/en/docs/cli/install?utm_source=openai))  
[2] Yarn (Berry) `yarn install` docs (options list; no `--ignore-engines`) ([yarnpkg.com](https://yarnpkg.com/cli/install?utm_source=openai))  
[3] Berry issue: “[Feature] Return ‘engines’ check” (`#1177`) ([github.com](https://github.com/yarnpkg/berry/issues/1177))

Citations:

- 1: https://classic.yarnpkg.com/en/docs/cli/install?utm_source=openai
- 2: https://yarnpkg.com/cli/install?utm_source=openai
- 3: https://github.com/yarnpkg/berry/issues/1177

---

🏁 Script executed:

```shell
# Check if there's any version pinning or nypm configuration in the project
cd packages/cli-v3 && find . -name "package.json" -type f | head -5 | xargs cat | grep -E "(nypm|npm|pnpm|yarn)" | head -20

Repository: triggerdotdev/trigger.dev

Length of output: 661


🏁 Script executed:

# Look for nypm usage and version info
rg "nypm" packages/cli-v3/src/commands/update.ts -B 5 -A 5

Repository: triggerdotdev/trigger.dev

Length of output: 592


🏁 Script executed:

# Check the full context of how packageManager is obtained
rg "packageManager" packages/cli-v3/src/commands/update.ts -B 10 -A 10 | head -50

Repository: triggerdotdev/trigger.dev

Length of output: 1481


Fix npm and Yarn engine-strict flags; they are incorrect for the current versions.

  • npm: --no-engine-strict is not a valid flag. Use --engine-strict=false instead.
  • pnpm: --config.engine-strict=false is correct.
  • yarn: --ignore-engines is not supported in Yarn Berry (v2+). The project uses Yarn 4.2.2, which does not have this option. Consider either using --force as an alternative or noting that engine enforcement cannot be bypassed in modern Yarn.
🤖 Prompt for AI Agents
In `@packages/cli-v3/src/commands/update.ts` around lines 261 - 282, The engine
flag handling in the update flow is wrong: when options.ignoreEngines is set and
packageManager.name is checked inside the switch (see installArgs,
packageManager.name), replace the npm and yarn flags—use "--engine-strict=false"
for npm instead of "--no-engine-strict", keep pnpm as
"--config.engine-strict=false", and for yarn (modern Berry v2+) do not push
"--ignore-engines"; instead either push "--force" if you want to bypass
enforcement or skip adding a flag and document that modern Yarn cannot be
bypassed; ensure installDependencies call still receives installArgs and that
installSpinner error messaging remains unchanged.


Expand Down
Loading