From ba519a8b781941310200c73d7da9cc6b24a7f3ad Mon Sep 17 00:00:00 2001 From: Randall Stillwell Date: Mon, 27 Apr 2026 12:57:27 -0500 Subject: [PATCH] fix(web): import @tasks/ai via workspace alias instead of relative path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two AI components were importing from ../../../../packages/ai/src using relative paths that escape the workspace root. This worked locally because all packages are siblings on disk, but failed in Docker where Dockerfile.web only copies apps/web, packages/database, and packages/shared into the build context — packages/ai never made it in. Changes: - Add @tasks/ai as a workspace dependency in apps/web/package.json - Switch both imports (command-palette.tsx, ai-block.tsx) to "@tasks/ai" - Add @tasks/ai to transpilePackages in next.config.ts and the docker variant - Copy packages/ai into the Docker build context (Dockerfile.web) - Refresh pnpm-lock.yaml for the new workspace edge Verified locally: web builds compile cleanly past the previously failing "Module not found" errors. (Local final step hits an unrelated ENOSPC on the dev disk; Coolify's volume has plenty of headroom.) Made-with: Cursor --- apps/web/components/ai/command-palette.tsx | 2 +- apps/web/components/editor/extensions/ai-block.tsx | 2 +- apps/web/next.config.ts | 2 +- apps/web/package.json | 1 + docker/Dockerfile.web | 1 + docker/next.config.docker.ts | 2 +- pnpm-lock.yaml | 3 +++ 7 files changed, 9 insertions(+), 4 deletions(-) diff --git a/apps/web/components/ai/command-palette.tsx b/apps/web/components/ai/command-palette.tsx index 5d8d8b2..1f85319 100644 --- a/apps/web/components/ai/command-palette.tsx +++ b/apps/web/components/ai/command-palette.tsx @@ -29,7 +29,7 @@ import { createOpenAIClient, GENERAL_SYSTEM_PROMPT, selectOpenAIModel, -} from "../../../../packages/ai/src"; +} from "@tasks/ai"; const RECENT_KEY = "tasks-command-palette-recent-v1"; diff --git a/apps/web/components/editor/extensions/ai-block.tsx b/apps/web/components/editor/extensions/ai-block.tsx index 61f5bef..24fd9f9 100644 --- a/apps/web/components/editor/extensions/ai-block.tsx +++ b/apps/web/components/editor/extensions/ai-block.tsx @@ -34,7 +34,7 @@ import { selectOpenAIModel, summarize, translate, -} from "../../../../../packages/ai/src"; +} from "@tasks/ai"; type AiStatus = "idle" | "loading" | "done" | "error"; diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index 98c6944..987b307 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -3,7 +3,7 @@ import path from "path"; const nextConfig: NextConfig = { output: "standalone", - transpilePackages: ["@tasks/database", "@tasks/shared"], + transpilePackages: ["@tasks/ai", "@tasks/database", "@tasks/shared"], outputFileTracingRoot: path.join(__dirname, "../.."), experimental: { serverActions: { diff --git a/apps/web/package.json b/apps/web/package.json index 6c7421e..09fa1a6 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -29,6 +29,7 @@ "@radix-ui/react-tabs": "^1.1.3", "@radix-ui/react-tooltip": "^1.1.8", "@tanstack/react-query": "^5.62.0", + "@tasks/ai": "workspace:*", "@tasks/database": "workspace:*", "@tasks/shared": "workspace:*", "@tiptap/extension-code-block": "^3.20.5", diff --git a/docker/Dockerfile.web b/docker/Dockerfile.web index e8d5799..5053889 100644 --- a/docker/Dockerfile.web +++ b/docker/Dockerfile.web @@ -20,6 +20,7 @@ COPY packages/ai/package.json ./packages/ai/ RUN pnpm install --frozen-lockfile COPY apps/web ./apps/web +COPY packages/ai ./packages/ai COPY packages/database ./packages/database COPY packages/shared ./packages/shared COPY docker/next.config.docker.ts ./apps/web/next.config.ts diff --git a/docker/next.config.docker.ts b/docker/next.config.docker.ts index 957f6cc..11e5e74 100644 --- a/docker/next.config.docker.ts +++ b/docker/next.config.docker.ts @@ -7,7 +7,7 @@ import path from "path"; */ const nextConfig: NextConfig = { output: "standalone", - transpilePackages: ["@tasks/database", "@tasks/shared"], + transpilePackages: ["@tasks/ai", "@tasks/database", "@tasks/shared"], outputFileTracingRoot: path.join(__dirname, "../.."), experimental: { serverActions: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e214f0..1f2907e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,6 +136,9 @@ importers: '@tanstack/react-query': specifier: ^5.62.0 version: 5.95.2(react@19.2.4) + '@tasks/ai': + specifier: workspace:* + version: link:../../packages/ai '@tasks/database': specifier: workspace:* version: link:../../packages/database