diff --git a/packages/cli-v3/src/deploy/bundleArchive.test.ts b/packages/cli-v3/src/deploy/bundleArchive.test.ts index dc6a0af36..ca63c0501 100644 --- a/packages/cli-v3/src/deploy/bundleArchive.test.ts +++ b/packages/cli-v3/src/deploy/bundleArchive.test.ts @@ -60,11 +60,23 @@ describe("createBundleArchive", () => { expect(skill).toBe("# skill"); }); - it("excludes node_modules and .DS_Store but nothing else", async () => { + it("excludes only .DS_Store — node_modules paths must survive", async () => { await writeFile(join(bundleDir, "build.json"), "{}"); await writeFile(join(bundleDir, ".DS_Store"), "junk"); - await mkdir(join(bundleDir, "node_modules", "leftover"), { recursive: true }); - await writeFile(join(bundleDir, "node_modules", "leftover", "index.js"), "x"); + // The bundler emits controller entry points at paths mirroring the CLI's + // install location — under npx that contains a node_modules segment. Those + // files are load-bearing (the Containerfile's indexer stage runs them). + const controllerDir = join( + bundleDir, + ".npm", + "_npx", + "abc123", + "node_modules", + "trigger.dev", + "dist" + ); + await mkdir(controllerDir, { recursive: true }); + await writeFile(join(controllerDir, "managed-index-controller.mjs"), "x"); // dist-like names must NOT be excluded — the bundle IS build output await mkdir(join(bundleDir, "dist"), { recursive: true }); await writeFile(join(bundleDir, "dist", "chunk.mjs"), "x"); @@ -77,7 +89,22 @@ describe("createBundleArchive", () => { await tar.extract({ file: archivePath, cwd: extractDir }); const rootEntries = (await readdir(extractDir)).sort(); - expect(rootEntries).toEqual(["build.json", "dist"].sort()); + expect(rootEntries).toEqual(["build.json", "dist", ".npm"].sort()); + + const controller = await readFile( + join( + extractDir, + ".npm", + "_npx", + "abc123", + "node_modules", + "trigger.dev", + "dist", + "managed-index-controller.mjs" + ), + "utf-8" + ); + expect(controller).toBe("x"); }); it("throws when the bundle dir is empty", async () => { diff --git a/packages/cli-v3/src/deploy/bundleArchive.ts b/packages/cli-v3/src/deploy/bundleArchive.ts index ffb00c2ae..d71998dc8 100644 --- a/packages/cli-v3/src/deploy/bundleArchive.ts +++ b/packages/cli-v3/src/deploy/bundleArchive.ts @@ -5,8 +5,10 @@ import { logger } from "../utilities/logger.js"; // The bundle dir is generated build output (bundled JS, synthesized package.json, // build.json, Containerfile, .trigger/skills). Unlike the source-context archiver, // it must NOT apply the usual build-output ignores (dist, build, .trigger) — those -// would strip the bundle itself. Only genuinely unwanted entries are excluded. -const BUNDLE_IGNORES = ["**/node_modules", "**/.DS_Store"]; +// would strip the bundle itself. node_modules must NOT be excluded either: the +// bundler emits the controller entry points at paths mirroring the CLI's install +// location, which contains a node_modules segment when the CLI runs via npx. +const BUNDLE_IGNORES = ["**/.DS_Store"]; /** * Archives a pre-built bundle directory (the buildWorker destination) so its