From 42730884d7febad8f9cb702bc4edce8632e8436f Mon Sep 17 00:00:00 2001 From: Lee Dogeon Date: Tue, 3 Feb 2026 21:41:21 +0900 Subject: [PATCH 1/2] Add mise check task for workspace: protocol validation The pnpm workspace: protocol requires a version specifier (*, ^, or ~). Using "workspace:" without a specifier is invalid but pnpm doesn't report a clear error, which can cause issues with tools like moonrepo. This adds a check:manifest:workspace-protocol task that detects invalid patterns and fails the CI check if found. Co-Authored-By: Claude Opus 4.5 --- mise.toml | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/mise.toml b/mise.toml index 6a0f634d..2091c470 100644 --- a/mise.toml +++ b/mise.toml @@ -46,6 +46,7 @@ depends = [ "check:types", "check:md", "check-versions", + "check:manifest:workspace-protocol", ] [tasks."check:fmt"] @@ -75,6 +76,42 @@ else fi ''' +[tasks."check:manifest:workspace-protocol"] +description = "Check for invalid workspace: specifiers without version (*, ^, ~)" +run = ''' +found=0 +for file in $(find . -name 'package.json' -not -path '*/node_modules/*'); do + invalid=$(jq -r ' + [ + (.dependencies // {}), + (.devDependencies // {}), + (.peerDependencies // {}), + (.optionalDependencies // {}) + ] + | add + | to_entries[] + | select(.value == "workspace:") + | " \(.key)" + ' "$file" 2>/dev/null) + if [ -n "$invalid" ]; then + if [ "$found" -eq 0 ]; then + echo "Error: Found invalid workspace: specifiers (missing *, ^, or ~):" + echo "" + fi + echo "$file:" + echo "$invalid" + found=1 + fi +done + +if [ "$found" -eq 1 ]; then + echo "" + echo "Valid formats: workspace:*, workspace:^, workspace:~" + exit 1 +fi +echo "All workspace: specifiers are valid" +''' + [tasks.fmt] description = "Format the codebase" run = "deno fmt && hongdown --write" From acd74056e16bf3d8c2830cbd58571d2cc8d0569b Mon Sep 17 00:00:00 2001 From: Lee Dogeon Date: Tue, 3 Feb 2026 21:34:31 +0900 Subject: [PATCH 2/2] Correct workspace protocol --- docs/package.json | 38 +++++------ examples/cloudflare-workers/package.json | 4 +- examples/elysia/package.json | 2 +- examples/express/package.json | 6 +- examples/fastify/package.json | 6 +- examples/koa/package.json | 6 +- examples/next-integration/package.json | 6 +- examples/next14-app-router/package.json | 4 +- examples/next15-app-router/package.json | 4 +- examples/sveltekit-sample/package.json | 6 +- packages/fastify/package.json | 2 +- pnpm-lock.yaml | 84 ++++++++++++------------ 12 files changed, 84 insertions(+), 84 deletions(-) diff --git a/docs/package.json b/docs/package.json index 335f9f5d..11e2f850 100644 --- a/docs/package.json +++ b/docs/package.json @@ -3,25 +3,25 @@ "@braintree/sanitize-url": "^7.1.1", "@cloudflare/workers-types": "catalog:", "@deno/kv": "^0.8.4", - "@fedify/amqp": "workspace:", - "@fedify/cfworkers": "workspace:", - "@fedify/express": "workspace:", - "@fedify/fastify": "workspace:", - "@fedify/fedify": "workspace:", - "@fedify/h3": "workspace:", - "@fedify/hono": "workspace:", - "@fedify/koa": "workspace:", - "@fedify/lint": "workspace:", - "@fedify/nestjs": "workspace:", - "@fedify/next": "workspace:", - "@fedify/postgres": "workspace:", - "@fedify/redis": "workspace:", - "@fedify/sqlite": "workspace:", - "@fedify/sveltekit": "workspace:", - "@fedify/testing": "workspace:", - "@fedify/vocab": "workspace:", - "@fedify/vocab-runtime": "workspace:", - "@fedify/relay": "workspace:", + "@fedify/amqp": "workspace:^", + "@fedify/cfworkers": "workspace:^", + "@fedify/express": "workspace:^", + "@fedify/fastify": "workspace:^", + "@fedify/fedify": "workspace:^", + "@fedify/h3": "workspace:^", + "@fedify/hono": "workspace:^", + "@fedify/koa": "workspace:^", + "@fedify/lint": "workspace:^", + "@fedify/nestjs": "workspace:^", + "@fedify/next": "workspace:^", + "@fedify/postgres": "workspace:^", + "@fedify/redis": "workspace:^", + "@fedify/sqlite": "workspace:^", + "@fedify/sveltekit": "workspace:^", + "@fedify/testing": "workspace:^", + "@fedify/vocab": "workspace:^", + "@fedify/vocab-runtime": "workspace:^", + "@fedify/relay": "workspace:^", "@hono/node-server": "^1.13.7", "@js-temporal/polyfill": "catalog:", "@logtape/file": "catalog:", diff --git a/examples/cloudflare-workers/package.json b/examples/cloudflare-workers/package.json index 3e0297c1..186b9f52 100644 --- a/examples/cloudflare-workers/package.json +++ b/examples/cloudflare-workers/package.json @@ -14,7 +14,7 @@ "wrangler": "^4.18.0" }, "dependencies": { - "@fedify/fedify": "workspace:", - "@fedify/vocab": "workspace:" + "@fedify/fedify": "workspace:^", + "@fedify/vocab": "workspace:^" } } diff --git a/examples/elysia/package.json b/examples/elysia/package.json index 99f747c8..4fbd625d 100644 --- a/examples/elysia/package.json +++ b/examples/elysia/package.json @@ -32,7 +32,7 @@ "dependencies": { "@fedify/elysia": "workspace:*", "@fedify/fedify": "workspace:*", - "@fedify/vocab": "workspace:", + "@fedify/vocab": "workspace:^", "elysia": "catalog:" } } diff --git a/examples/express/package.json b/examples/express/package.json index 12a6751a..54f5b0f0 100644 --- a/examples/express/package.json +++ b/examples/express/package.json @@ -30,9 +30,9 @@ "typescript": "^5.5.4" }, "dependencies": { - "@fedify/express": "workspace:", - "@fedify/fedify": "workspace:", - "@fedify/vocab": "workspace:", + "@fedify/express": "workspace:^", + "@fedify/fedify": "workspace:^", + "@fedify/vocab": "workspace:^", "@logtape/logtape": "catalog:", "express": "catalog:" } diff --git a/examples/fastify/package.json b/examples/fastify/package.json index a52d0d6a..7a1712ce 100644 --- a/examples/fastify/package.json +++ b/examples/fastify/package.json @@ -8,9 +8,9 @@ "dev": "tsx watch index.ts" }, "dependencies": { - "@fedify/fastify": "workspace:", - "@fedify/fedify": "workspace:", - "@fedify/vocab": "workspace:", + "@fedify/fastify": "workspace:^", + "@fedify/fedify": "workspace:^", + "@fedify/vocab": "workspace:^", "fastify": "catalog:" }, "devDependencies": { diff --git a/examples/koa/package.json b/examples/koa/package.json index 35729ee8..13cae8d7 100644 --- a/examples/koa/package.json +++ b/examples/koa/package.json @@ -30,9 +30,9 @@ "typescript": "^5.5.4" }, "dependencies": { - "@fedify/koa": "workspace:", - "@fedify/fedify": "workspace:", - "@fedify/vocab": "workspace:", + "@fedify/koa": "workspace:^", + "@fedify/fedify": "workspace:^", + "@fedify/vocab": "workspace:^", "@logtape/logtape": "catalog:", "koa": "catalog:" } diff --git a/examples/next-integration/package.json b/examples/next-integration/package.json index 21e22fd7..0a4899ba 100644 --- a/examples/next-integration/package.json +++ b/examples/next-integration/package.json @@ -9,9 +9,9 @@ "lint": "eslint" }, "dependencies": { - "@fedify/fedify": "workspace:", - "@fedify/next": "workspace:", - "@fedify/vocab": "workspace:", + "@fedify/fedify": "workspace:^", + "@fedify/next": "workspace:^", + "@fedify/vocab": "workspace:^", "next": "15.5.0", "react": "19.1.0", "react-dom": "19.1.0", diff --git a/examples/next14-app-router/package.json b/examples/next14-app-router/package.json index d0ea3a38..db7bf290 100644 --- a/examples/next14-app-router/package.json +++ b/examples/next14-app-router/package.json @@ -10,8 +10,8 @@ "test": "true" }, "dependencies": { - "@fedify/fedify": "workspace:", - "@fedify/vocab": "workspace:", + "@fedify/fedify": "workspace:^", + "@fedify/vocab": "workspace:^", "@logtape/logtape": "catalog:", "next": "^14.0.0", "react": "19.0.0-rc-7771d3a7-20240827", diff --git a/examples/next15-app-router/package.json b/examples/next15-app-router/package.json index 7e21dd35..18a082ee 100644 --- a/examples/next15-app-router/package.json +++ b/examples/next15-app-router/package.json @@ -10,8 +10,8 @@ "test": "true" }, "dependencies": { - "@fedify/fedify": "workspace:", - "@fedify/vocab": "workspace:", + "@fedify/fedify": "workspace:^", + "@fedify/vocab": "workspace:^", "next": "15.3.1", "react": "^19.0.0", "react-dom": "^19.0.0", diff --git a/examples/sveltekit-sample/package.json b/examples/sveltekit-sample/package.json index fbe56d23..55ad19d1 100644 --- a/examples/sveltekit-sample/package.json +++ b/examples/sveltekit-sample/package.json @@ -20,9 +20,9 @@ "lint": "prettier --check . && eslint ." }, "dependencies": { - "@fedify/fedify": "workspace:", - "@fedify/sveltekit": "workspace:", - "@fedify/vocab": "workspace:", + "@fedify/fedify": "workspace:^", + "@fedify/sveltekit": "workspace:^", + "@fedify/vocab": "workspace:^", "x-forwarded-fetch": "^0.2.0" }, "devDependencies": { diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 0e566a76..dba385a7 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -47,7 +47,7 @@ "fastify-plugin": "catalog:" }, "peerDependencies": { - "@fedify/fedify": "workspace:", + "@fedify/fedify": "workspace:^", "fastify": "catalog:" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7c84413a..ed5090f3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -140,61 +140,61 @@ importers: specifier: ^0.8.4 version: 0.8.4 '@fedify/amqp': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/amqp '@fedify/cfworkers': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/cfworkers '@fedify/express': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/express '@fedify/fastify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/fastify '@fedify/fedify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/fedify '@fedify/h3': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/h3 '@fedify/hono': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/hono '@fedify/koa': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/koa '@fedify/lint': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/lint '@fedify/nestjs': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/nestjs '@fedify/next': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/next '@fedify/postgres': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/postgres '@fedify/redis': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/redis '@fedify/relay': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/relay '@fedify/sqlite': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/sqlite '@fedify/sveltekit': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/sveltekit '@fedify/testing': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/testing '@fedify/vocab': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/vocab '@fedify/vocab-runtime': - specifier: 'workspace:' + specifier: workspace:^ version: link:../packages/vocab-runtime '@hono/node-server': specifier: ^1.13.7 @@ -317,10 +317,10 @@ importers: examples/cloudflare-workers: dependencies: '@fedify/fedify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/fedify '@fedify/vocab': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/vocab devDependencies: typescript: @@ -339,7 +339,7 @@ importers: specifier: workspace:* version: link:../../packages/fedify '@fedify/vocab': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/vocab elysia: specifier: 'catalog:' @@ -352,13 +352,13 @@ importers: examples/express: dependencies: '@fedify/express': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/express '@fedify/fedify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/fedify '@fedify/vocab': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/vocab '@logtape/logtape': specifier: 'catalog:' @@ -383,13 +383,13 @@ importers: examples/fastify: dependencies: '@fedify/fastify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/fastify '@fedify/fedify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/fedify '@fedify/vocab': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/vocab fastify: specifier: 'catalog:' @@ -405,13 +405,13 @@ importers: examples/koa: dependencies: '@fedify/fedify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/fedify '@fedify/koa': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/koa '@fedify/vocab': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/vocab '@logtape/logtape': specifier: 'catalog:' @@ -436,13 +436,13 @@ importers: examples/next-integration: dependencies: '@fedify/fedify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/fedify '@fedify/next': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/next '@fedify/vocab': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/vocab next: specifier: 15.5.0 @@ -488,10 +488,10 @@ importers: examples/next14-app-router: dependencies: '@fedify/fedify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/fedify '@fedify/vocab': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/vocab '@logtape/logtape': specifier: 'catalog:' @@ -537,10 +537,10 @@ importers: examples/next15-app-router: dependencies: '@fedify/fedify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/fedify '@fedify/vocab': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/vocab next: specifier: 15.3.1 @@ -586,13 +586,13 @@ importers: examples/sveltekit-sample: dependencies: '@fedify/fedify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/fedify '@fedify/sveltekit': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/sveltekit '@fedify/vocab': - specifier: 'workspace:' + specifier: workspace:^ version: link:../../packages/vocab x-forwarded-fetch: specifier: ^0.2.0 @@ -877,7 +877,7 @@ importers: packages/fastify: dependencies: '@fedify/fedify': - specifier: 'workspace:' + specifier: workspace:^ version: link:../fedify fastify: specifier: 'catalog:'