From b188d90ebf2bdf2fdb959641ca7921fb7d9cba78 Mon Sep 17 00:00:00 2001 From: Makisuo Date: Thu, 14 May 2026 02:30:55 +0200 Subject: [PATCH] fix(dev): use portless's documented turborepo pattern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit PR #39 set root \`dev: portless\` which caused portless to register all 6 apps upfront, then spawned turbo which ran each app's framework command. With portless 0.13, this double-registers when run from root: \`bun run dev\` printed the URL list then died with "alerting.localhost is already registered by a running process". Switching to the README's turborepo pattern (the inverse): - Root \`dev\` = \`turbo dev --ui=tui\` (restored to pre-migration). - Each app's \`dev\` = \`portless\`; \`dev:app\` = the framework command. - Each app's package.json gets a \`portless\` key: { "name": "", "script": "dev:app" } - portless.json deleted (per-package keys make it redundant). Each per-package portless invocation registers itself, runs dev:app through the proxy. No collisions; turbo just coordinates. Bonus: \`bun --filter=@maple/web dev:app\` is now a clean no-portless escape hatch (raw ports, no proxy). Smoke-tested with two parallel apps (web + landing) — both registered cleanly, HTTPS through the proxy returned HTTP/2 200. Co-Authored-By: Claude Opus 4.7 (1M context) --- CLAUDE.md | 6 +++++- apps/alerting/package.json | 4 +++- apps/api/package.json | 4 +++- apps/chat-agent/package.json | 4 +++- apps/ingest/package.json | 4 +++- apps/landing/package.json | 4 +++- apps/web/package.json | 4 +++- package.json | 2 +- portless.json | 10 ---------- 9 files changed, 24 insertions(+), 18 deletions(-) delete mode 100644 portless.json diff --git a/CLAUDE.md b/CLAUDE.md index 1b5a5017d9..501466ba45 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -10,9 +10,13 @@ Maple is an OpenTelemetry observability platform built with TanStack Start (Reac ```bash # Development -bun dev # Run all apps via portless on https://[.].localhost +bun dev # Run all apps via turbo; each app's `dev` script invokes portless + # URLs: https://[.].localhost bun typecheck # TypeScript type checking +# Skip portless for a single app (raw ports, no proxy) +bun --filter=@maple/web dev:app + # First-time setup (once per machine): install portless's local CA into your system trust store npx portless trust diff --git a/apps/alerting/package.json b/apps/alerting/package.json index 8ec197c6e0..9d2d12cb5a 100644 --- a/apps/alerting/package.json +++ b/apps/alerting/package.json @@ -2,8 +2,10 @@ "name": "@maple/alerting", "private": true, "type": "module", + "portless": { "name": "alerting", "script": "dev:app" }, "scripts": { - "dev": "bun run ../../scripts/portless-wrangler.ts --env-file ../../.env.local --persist-to ../api/.wrangler/state --test-scheduled --port ${PORT:-8788} --inspector-port=9231", + "dev": "portless", + "dev:app": "bun run ../../scripts/portless-wrangler.ts --env-file ../../.env.local --persist-to ../api/.wrangler/state --test-scheduled --port ${PORT:-8788} --inspector-port=9231", "deploy": "wrangler deploy", "test": "echo 'No tests yet'", "typecheck": "tsc --noEmit" diff --git a/apps/api/package.json b/apps/api/package.json index 322ae62cb6..fa3212e798 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -2,6 +2,7 @@ "name": "@maple/api", "private": true, "type": "module", + "portless": { "name": "api", "script": "dev:app" }, "exports": { ".": "./src/index.ts", "./agent": "./src/agent.ts", @@ -9,7 +10,8 @@ }, "scripts": { "db:generate": "bun run --cwd ../../packages/db db:generate", - "dev": "bun run ../../scripts/portless-wrangler.ts --env-file ../../.env.local --port ${PORT:-3472} --inspector-port=$((${PORT:-3472} + 10000))", + "dev": "portless", + "dev:app": "bun run ../../scripts/portless-wrangler.ts --env-file ../../.env.local --port ${PORT:-3472} --inspector-port=$((${PORT:-3472} + 10000))", "test": "vitest run", "typecheck": "tsc --noEmit", "typecheck:test": "tsc --noEmit -p tsconfig.test.json", diff --git a/apps/chat-agent/package.json b/apps/chat-agent/package.json index 29efe75114..b3243e6588 100644 --- a/apps/chat-agent/package.json +++ b/apps/chat-agent/package.json @@ -2,8 +2,10 @@ "name": "@maple/chat-agent", "private": true, "type": "module", + "portless": { "name": "chat-agent", "script": "dev:app" }, "scripts": { - "dev": "bun run ../../scripts/portless-wrangler.ts --env-file ../../.env.local --port ${PORT:-8787} --inspector-port=9230", + "dev": "portless", + "dev:app": "bun run ../../scripts/portless-wrangler.ts --env-file ../../.env.local --port ${PORT:-8787} --inspector-port=9230", "typecheck": "tsc --noEmit" }, "dependencies": { diff --git a/apps/ingest/package.json b/apps/ingest/package.json index 3386c2acbe..aebbe7880c 100644 --- a/apps/ingest/package.json +++ b/apps/ingest/package.json @@ -1,8 +1,10 @@ { "name": "@maple/ingest", "private": true, + "portless": { "name": "ingest", "script": "dev:app" }, "scripts": { - "dev": "set -a && source ../../.env.local && set +a && INGEST_PORT=${PORT:-3473} cargo run", + "dev": "portless", + "dev:app": "set -a && source ../../.env.local && set +a && INGEST_PORT=${PORT:-3473} cargo run", "start": "cargo run --release", "build": "cargo build --release", "test": "cargo test", diff --git a/apps/landing/package.json b/apps/landing/package.json index 3489e5620e..b632d92acb 100644 --- a/apps/landing/package.json +++ b/apps/landing/package.json @@ -2,8 +2,10 @@ "name": "@maple/landing", "version": "0.0.1", "type": "module", + "portless": { "name": "landing", "script": "dev:app" }, "scripts": { - "dev": "astro dev --port ${PORT:-3391} --host ${HOST:-127.0.0.1}", + "dev": "portless", + "dev:app": "astro dev --port ${PORT:-3391} --host ${HOST:-127.0.0.1}", "build": "astro build", "preview": "astro preview", "astro": "astro" diff --git a/apps/web/package.json b/apps/web/package.json index f3dca4555a..814f0b9985 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -2,8 +2,10 @@ "name": "@maple/web", "private": true, "type": "module", + "portless": { "name": "web", "script": "dev:app" }, "scripts": { - "dev": "vite dev --port ${PORT:-3471} --host ${HOST:-127.0.0.1}", + "dev": "portless", + "dev:app": "vite dev --port ${PORT:-3471} --host ${HOST:-127.0.0.1}", "build": "vite build", "preview": "vite preview", "test": "vitest run --passWithNoTests", diff --git a/package.json b/package.json index 1c7283a98e..e6e059079c 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ ], "scripts": { "build": "turbo build", - "dev": "portless", + "dev": "turbo dev --ui=tui", "dev:alerting": "bun --filter=@maple/alerting dev", "format": "oxfmt && oxlint --ignore-pattern '.context/**' --fix", "alchemy:build-deps": "turbo build --filter=@maple-dev/effect-sdk", diff --git a/portless.json b/portless.json deleted file mode 100644 index ffb32c73d4..0000000000 --- a/portless.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "apps": { - "apps/web": { "name": "web" }, - "apps/api": { "name": "api" }, - "apps/ingest": { "name": "ingest" }, - "apps/landing": { "name": "landing" }, - "apps/chat-agent": { "name": "chat-agent" }, - "apps/alerting": { "name": "alerting" } - } -}