chore(tooling): port upstream infra/tooling audit fixes

Ports the kept-file portions of the upstream infra audit-fix subset onto
the clean-slate template branch (auth-only shape; workspaces feature never
existed here, so its package.json edit is skipped):

- resolve the root playwright config in pnpm test:visual (S8)
- prune dead VERCEL_ENV from turbo.json globalEnv (S9)
- drop the duplicate chromium install in the storybook CI job (S10)
- wire scripts/**/*.test.mjs under a dedicated vitest runner
  (vitest.scripts.config.mjs + pnpm test:scripts + CI validate step);
  convert node:test imports to vitest keeping node:assert
- ignore *.tsbuildinfo repo-wide and untrack the committed build state
- align every @trpc/* range on ^11.18.0 so the workspace resolves to a
  single version (peer-warning-free install)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016j8z4VHjedXDTjEDNg7qHK
This commit is contained in:
2026-07-13 06:04:36 +02:00
parent dda9af93ad
commit 4e4cd5fa7c
32 changed files with 304 additions and 114 deletions

View File

@@ -65,6 +65,10 @@ jobs:
- run: pnpm typecheck
- run: pnpm lint
- run: pnpm conformance
# scripts/ is not a workspace package, so `pnpm test` (turbo) never
# reaches its test files — they get their own vitest run.
- name: Root scripts test suite
run: pnpm test:scripts
- name: Compliance manifest drift check
run: |
pnpm compliance:emit-all --check || {
@@ -156,7 +160,5 @@ jobs:
- name: Build Storybook
run: pnpm --filter @repo/storybook build:storybook
- run: pnpm test:stories
- name: Install Playwright browsers
run: pnpm exec playwright install chromium --with-deps
- name: Visual regression
run: pnpm test:visual

3
.gitignore vendored
View File

@@ -10,6 +10,9 @@ node_modules
# Turbo
.turbo
# TypeScript incremental build state
*.tsbuildinfo
# Build outputs
dist
build

File diff suppressed because one or more lines are too long

View File

@@ -22,7 +22,7 @@
"@sentry/nextjs": "^10.51.0",
"@tailwindcss/postcss": "^4.3.0",
"@tanstack/react-query": "^5.96.2",
"@trpc/server": "^11.17.0",
"@trpc/server": "^11.18.0",
"inversify": "^6.2.0",
"next": "^15.3.0",
"payload": "^3.14.0",

File diff suppressed because one or more lines are too long

View File

@@ -13,8 +13,9 @@
"test": "turbo run test",
"test:coverage": "turbo run test -- --coverage",
"test:e2e": "turbo run test:e2e",
"test:scripts": "vitest run --config vitest.scripts.config.mjs",
"test:stories": "turbo run test:stories",
"test:visual": "pnpm --filter @repo/storybook exec concurrently -k -s first -n 'SB,VRT' -c 'magenta,blue' 'pnpm --filter @repo/storybook exec http-server storybook-static --port 6006 --silent' 'pnpm --filter @repo/storybook exec wait-on tcp:6006 && pnpm exec playwright test'",
"test:visual": "pnpm --filter @repo/storybook exec concurrently -k -s first -n 'SB,VRT' -c 'magenta,blue' 'pnpm --filter @repo/storybook exec http-server storybook-static --port 6006 --silent' 'pnpm --filter @repo/storybook exec wait-on tcp:6006 && pnpm exec playwright test --config ../../playwright.config.ts'",
"typecheck": "turbo run typecheck",
"conformance": "node scripts/conformance.mjs",
"coverage:diff": "node scripts/coverage/diff.mjs",
@@ -46,6 +47,7 @@
"prettier": "^3.5.0",
"turbo": "^2.4.0",
"typescript": "^5.8.0",
"vitest": "^3.2.7",
"zod": "^3.25.0"
},
"lint-staged": {

View File

@@ -21,7 +21,7 @@
},
"dependencies": {
"@repo/core-shared": "workspace:*",
"@trpc/server": "^11.0.0",
"@trpc/server": "^11.18.0",
"inversify": "^6.2.0",
"payload": "^3.14.0",
"reflect-metadata": "^0.2.2",

View File

@@ -17,7 +17,7 @@
"@repo/core-consent": "workspace:*",
"@repo/core-dsr": "workspace:*",
"@repo/core-shared": "workspace:*",
"@trpc/server": "^11.0.0"
"@trpc/server": "^11.18.0"
},
"devDependencies": {
"@repo/core-eslint": "workspace:*",

View File

@@ -18,7 +18,7 @@
},
"dependencies": {
"@repo/core-shared": "workspace:*",
"@trpc/server": "^11.0.0",
"@trpc/server": "^11.18.0",
"zod": "^3.23.0"
},
"peerDependencies": {

View File

@@ -16,7 +16,7 @@
},
"dependencies": {
"@repo/core-shared": "workspace:*",
"@trpc/server": "^11.0.0",
"@trpc/server": "^11.18.0",
"zod": "^3.24.0"
},
"peerDependencies": {

View File

@@ -15,7 +15,7 @@
},
"dependencies": {
"@repo/core-shared": "workspace:*",
"@trpc/server": "^11.0.0",
"@trpc/server": "^11.18.0",
"payload": "^3.0.0",
"zod": "^3.24.0"
},

View File

@@ -47,7 +47,7 @@
"@opentelemetry/semantic-conventions": "^1.27.0",
"@sentry/nextjs": "^10.51.0",
"@sentry/opentelemetry": "^10.51.0",
"@trpc/server": "^11.0.0",
"@trpc/server": "^11.18.0",
"payload": "^3.14.0",
"superjson": "^2.2.1",
"zod": "^3.24.0"

View File

@@ -29,7 +29,7 @@
"@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^14.5.0",
"@trpc/client": "^11.0.0",
"@trpc/client": "^11.18.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"superjson": "^2.2.0",
@@ -37,7 +37,7 @@
"zod": "^3.23.0"
},
"peerDependencies": {
"@trpc/server": "^11.0.0",
"@trpc/server": "^11.18.0",
"payload": "^3.0.0"
},
"peerDependenciesMeta": {

View File

@@ -17,9 +17,9 @@
"dependencies": {
"@repo/core-api": "workspace:*",
"@tanstack/react-query": "^5.66.0",
"@trpc/client": "^11.17.0",
"@trpc/server": "^11.17.0",
"@trpc/tanstack-react-query": "^11.17.0",
"@trpc/client": "^11.18.0",
"@trpc/server": "^11.18.0",
"@trpc/tanstack-react-query": "^11.18.0",
"react": "^19.0.0",
"superjson": "^2.2.1"
},

286
pnpm-lock.yaml generated
View File

@@ -18,7 +18,7 @@ importers:
version: 8.7.1
"@stryker-mutator/vitest-runner":
specifier: ^8.7.0
version: 8.7.1(@stryker-mutator/core@8.7.1)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
version: 8.7.1(@stryker-mutator/core@8.7.1)(vitest@3.2.7(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
"@turbo/gen":
specifier: ^2.4.0
version: 2.9.10(@types/node@22.19.17)
@@ -49,6 +49,9 @@ importers:
typescript:
specifier: ^5.8.0
version: 5.9.3
vitest:
specifier: ^3.2.7
version: 3.2.7(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
zod:
specifier: ^3.25.0
version: 3.25.76
@@ -198,8 +201,8 @@ importers:
specifier: ^5.96.2
version: 5.96.2(react@19.2.4)
"@trpc/server":
specifier: ^11.17.0
version: 11.17.0(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(typescript@5.9.3)
inversify:
specifier: ^6.2.0
version: 6.2.2(reflect-metadata@0.2.2)
@@ -274,8 +277,8 @@ importers:
specifier: workspace:*
version: link:../core-shared
"@trpc/server":
specifier: ^11.0.0
version: 11.16.0(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(typescript@5.9.3)
inversify:
specifier: ^6.2.0
version: 6.2.2(reflect-metadata@0.2.2)
@@ -360,8 +363,8 @@ importers:
specifier: workspace:*
version: link:../core-shared
"@trpc/server":
specifier: ^11.0.0
version: 11.16.0(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(typescript@5.9.3)
devDependencies:
"@repo/core-eslint":
specifier: workspace:*
@@ -388,8 +391,8 @@ importers:
specifier: workspace:*
version: link:../core-shared
"@trpc/server":
specifier: ^11.0.0
version: 11.16.0(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(typescript@5.9.3)
zod:
specifier: ^3.23.0
version: 3.25.76
@@ -474,8 +477,8 @@ importers:
specifier: workspace:*
version: link:../core-shared
"@trpc/server":
specifier: ^11.0.0
version: 11.16.0(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(typescript@5.9.3)
zod:
specifier: ^3.24.0
version: 3.25.76
@@ -520,8 +523,8 @@ importers:
specifier: workspace:*
version: link:../core-shared
"@trpc/server":
specifier: ^11.0.0
version: 11.16.0(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(typescript@5.9.3)
payload:
specifier: ^3.0.0
version: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
@@ -630,8 +633,8 @@ importers:
specifier: ^10.51.0
version: 10.52.0(@opentelemetry/api@1.9.1)(@opentelemetry/core@2.7.1(@opentelemetry/api@1.9.1))(@opentelemetry/sdk-trace-base@1.30.1(@opentelemetry/api@1.9.1))(@opentelemetry/semantic-conventions@1.40.0)
"@trpc/server":
specifier: ^11.0.0
version: 11.16.0(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(typescript@5.9.3)
payload:
specifier: ^3.14.0
version: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
@@ -694,11 +697,11 @@ importers:
specifier: ^14.5.0
version: 14.6.1(@testing-library/dom@10.4.1)
"@trpc/client":
specifier: ^11.0.0
version: 11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server":
specifier: ^11.0.0
version: 11.16.0(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(typescript@5.9.3)
payload:
specifier: ^3.0.0
version: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
@@ -752,14 +755,14 @@ importers:
specifier: ^5.66.0
version: 5.96.2(react@19.2.4)
"@trpc/client":
specifier: ^11.17.0
version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server":
specifier: ^11.17.0
version: 11.17.0(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(typescript@5.9.3)
"@trpc/tanstack-react-query":
specifier: ^11.17.0
version: 11.17.0(@tanstack/react-query@5.96.2(react@19.2.4))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.4)(typescript@5.9.3)
specifier: ^11.18.0
version: 11.18.0(@tanstack/react-query@5.96.2(react@19.2.4))(@trpc/client@11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.18.0(typescript@5.9.3))(react@19.2.4)(typescript@5.9.3)
react:
specifier: ^19.0.0
version: 19.2.4
@@ -1676,14 +1679,14 @@ packages:
{
integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==,
}
deprecated: "Merged into tsx: https://tsx.is"
deprecated: "Merged into tsx: https://tsx.hirok.io"
"@esbuild-kit/esm-loader@2.6.5":
resolution:
{
integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==,
}
deprecated: "Merged into tsx: https://tsx.is"
deprecated: "Merged into tsx: https://tsx.hirok.io"
"@esbuild/aix-ppc64@0.25.12":
resolution:
@@ -6404,54 +6407,35 @@ packages:
integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==,
}
"@trpc/client@11.16.0":
"@trpc/client@11.18.0":
resolution:
{
integrity: sha512-TxIzm7OoK3baKZ0XCbuMUbI3GhgjcbKHIc4nWVKaRpCRnbSh0T31BT6fTPYwtnA/Nur8pBCGqC2B4J5hEPiPFQ==,
integrity: sha512-wOqeg3Fvl25V1ZisQhUD3K8G60ZJDlSGJNSyeXrLH24xAo5w6GSR2Kzb1cSNY9Y+IQ2YZvYGZstBU+V/ulo/ow==,
}
hasBin: true
peerDependencies:
"@trpc/server": 11.16.0
"@trpc/server": 11.18.0
typescript: ">=5.7.2"
"@trpc/client@11.17.0":
"@trpc/server@11.18.0":
resolution:
{
integrity: sha512-KpJBFrbKTDeVCFv/3ckL1XBBH5Yssn8hethI/rUy7GIpTj+VzjtPjykDqJpzobuVOz+d26cXCSu1t4I6MYI5Zg==,
}
hasBin: true
peerDependencies:
"@trpc/server": 11.17.0
typescript: ">=5.7.2"
"@trpc/server@11.16.0":
resolution:
{
integrity: sha512-XgGuUMddrUTd04+za/WE5GFuZ1/YU9XQG0t3VL5WOIu2JspkOlq6k4RYEiqS6HSJt+S0RXaPdIoE2anIP/BBRQ==,
integrity: sha512-JAvXOuNTxgXjIDfQaOvDq1j66LMNfDJUH1IU7Slfn8EvRv2EkH6ehu3A7zpYhjO0syHHiYg77v2lG2JFJgvw7Q==,
}
hasBin: true
peerDependencies:
typescript: ">=5.7.2"
"@trpc/server@11.17.0":
"@trpc/tanstack-react-query@11.18.0":
resolution:
{
integrity: sha512-jbAOUe0PpUTCYqziyu+8vYXZdDXPudZgnEhWCQ2NjKnVEjfE93RqHTt1oycZJv/HNf51YlRXfEEwSIAbb161rw==,
}
hasBin: true
peerDependencies:
typescript: ">=5.7.2"
"@trpc/tanstack-react-query@11.17.0":
resolution:
{
integrity: sha512-OFxjvCgisP0yaCj7lgP6qPaFwJvJDgnrAUxH3cNIPPR89TpYbndn5vsdKNkc7EnvER9b6wq9Yz8aCcPcOBpDXg==,
integrity: sha512-dm5xIlN0SEzJAbQ34EHdb1Kgd/zWZ63ZMviQEw3WCWCIPz8MjLKAhquncPcn+YxFUJa+Qi4qatdGFymmM4HmAQ==,
}
hasBin: true
peerDependencies:
"@tanstack/react-query": ^5.80.3
"@trpc/client": 11.17.0
"@trpc/server": 11.17.0
"@trpc/client": 11.18.0
"@trpc/server": 11.18.0
react: ">=18.2.0"
typescript: ">=5.7.2"
@@ -6957,6 +6941,12 @@ packages:
integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==,
}
"@vitest/expect@3.2.7":
resolution:
{
integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==,
}
"@vitest/mocker@3.2.4":
resolution:
{
@@ -6971,36 +6961,80 @@ packages:
vite:
optional: true
"@vitest/mocker@3.2.7":
resolution:
{
integrity: sha512-Trr0hYO9CM3Wj6ksWHRhK9IZpIY6wTMO5u/MqXurMxT57sWBaOPEtP3Oq60ihZuh5JsiagKfz95OcxdEP6dBrA==,
}
peerDependencies:
msw: ^2.4.9
vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0
peerDependenciesMeta:
msw:
optional: true
vite:
optional: true
"@vitest/pretty-format@3.2.4":
resolution:
{
integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==,
}
"@vitest/pretty-format@3.2.7":
resolution:
{
integrity: sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==,
}
"@vitest/runner@3.2.4":
resolution:
{
integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==,
}
"@vitest/runner@3.2.7":
resolution:
{
integrity: sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==,
}
"@vitest/snapshot@3.2.4":
resolution:
{
integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==,
}
"@vitest/snapshot@3.2.7":
resolution:
{
integrity: sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==,
}
"@vitest/spy@3.2.4":
resolution:
{
integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==,
}
"@vitest/spy@3.2.7":
resolution:
{
integrity: sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==,
}
"@vitest/utils@3.2.4":
resolution:
{
integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==,
}
"@vitest/utils@3.2.7":
resolution:
{
integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==,
}
"@webassemblyjs/ast@1.14.1":
resolution:
{
@@ -13641,6 +13675,37 @@ packages:
jsdom:
optional: true
vitest@3.2.7:
resolution:
{
integrity: sha512-KrxIJ62Fd89gfysR4WotlgZABiz2dqFPgqGzX7s+CwsqLFomRH7777ZcrOD6+WVAh7khPQP41A+BKbpcJFrdEg==,
}
engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 }
hasBin: true
peerDependencies:
"@edge-runtime/vm": "*"
"@types/debug": ^4.1.12
"@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0
"@vitest/browser": 3.2.7
"@vitest/ui": 3.2.7
happy-dom: "*"
jsdom: "*"
peerDependenciesMeta:
"@edge-runtime/vm":
optional: true
"@types/debug":
optional: true
"@types/node":
optional: true
"@vitest/browser":
optional: true
"@vitest/ui":
optional: true
happy-dom:
optional: true
jsdom:
optional: true
w3c-xmlserializer@5.0.0:
resolution:
{
@@ -17855,13 +17920,13 @@ snapshots:
"@stryker-mutator/util@8.7.1": {}
"@stryker-mutator/vitest-runner@8.7.1(@stryker-mutator/core@8.7.1)(vitest@3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))":
"@stryker-mutator/vitest-runner@8.7.1(@stryker-mutator/core@8.7.1)(vitest@3.2.7(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))":
dependencies:
"@stryker-mutator/api": 8.7.1
"@stryker-mutator/core": 8.7.1
"@stryker-mutator/util": 8.7.1
tslib: 2.7.0
vitest: 3.2.4(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
vitest: 3.2.7(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
"@swc/core-darwin-arm64@1.15.33":
optional: true
@@ -18121,29 +18186,20 @@ snapshots:
"@tokenizer/token@0.3.0": {}
"@trpc/client@11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3)":
"@trpc/client@11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3)":
dependencies:
"@trpc/server": 11.16.0(typescript@5.9.3)
"@trpc/server": 11.18.0(typescript@5.9.3)
typescript: 5.9.3
"@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3)":
dependencies:
"@trpc/server": 11.17.0(typescript@5.9.3)
typescript: 5.9.3
"@trpc/server@11.16.0(typescript@5.9.3)":
"@trpc/server@11.18.0(typescript@5.9.3)":
dependencies:
typescript: 5.9.3
"@trpc/server@11.17.0(typescript@5.9.3)":
dependencies:
typescript: 5.9.3
"@trpc/tanstack-react-query@11.17.0(@tanstack/react-query@5.96.2(react@19.2.4))(@trpc/client@11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.17.0(typescript@5.9.3))(react@19.2.4)(typescript@5.9.3)":
"@trpc/tanstack-react-query@11.18.0(@tanstack/react-query@5.96.2(react@19.2.4))(@trpc/client@11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3))(@trpc/server@11.18.0(typescript@5.9.3))(react@19.2.4)(typescript@5.9.3)":
dependencies:
"@tanstack/react-query": 5.96.2(react@19.2.4)
"@trpc/client": 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server": 11.17.0(typescript@5.9.3)
"@trpc/client": 11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server": 11.18.0(typescript@5.9.3)
react: 19.2.4
typescript: 5.9.3
@@ -18516,6 +18572,14 @@ snapshots:
chai: 5.3.3
tinyrainbow: 2.0.0
"@vitest/expect@3.2.7":
dependencies:
"@types/chai": 5.2.3
"@vitest/spy": 3.2.7
"@vitest/utils": 3.2.7
chai: 5.3.3
tinyrainbow: 2.0.0
"@vitest/mocker@3.2.4(vite@6.4.2(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))":
dependencies:
"@vitest/spy": 3.2.4
@@ -18524,40 +18588,66 @@ snapshots:
optionalDependencies:
vite: 6.4.2(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
"@vitest/mocker@3.2.4(vite@6.4.2(@types/node@25.5.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))":
"@vitest/mocker@3.2.7(vite@6.4.2(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))":
dependencies:
"@vitest/spy": 3.2.4
"@vitest/spy": 3.2.7
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
vite: 6.4.2(@types/node@25.5.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
vite: 6.4.2(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
"@vitest/pretty-format@3.2.4":
dependencies:
tinyrainbow: 2.0.0
"@vitest/pretty-format@3.2.7":
dependencies:
tinyrainbow: 2.0.0
"@vitest/runner@3.2.4":
dependencies:
"@vitest/utils": 3.2.4
pathe: 2.0.3
strip-literal: 3.1.0
"@vitest/runner@3.2.7":
dependencies:
"@vitest/utils": 3.2.7
pathe: 2.0.3
strip-literal: 3.1.0
"@vitest/snapshot@3.2.4":
dependencies:
"@vitest/pretty-format": 3.2.4
magic-string: 0.30.21
pathe: 2.0.3
"@vitest/snapshot@3.2.7":
dependencies:
"@vitest/pretty-format": 3.2.7
magic-string: 0.30.21
pathe: 2.0.3
"@vitest/spy@3.2.4":
dependencies:
tinyspy: 4.0.4
"@vitest/spy@3.2.7":
dependencies:
tinyspy: 4.0.4
"@vitest/utils@3.2.4":
dependencies:
"@vitest/pretty-format": 3.2.4
loupe: 3.2.1
tinyrainbow: 2.0.0
"@vitest/utils@3.2.7":
dependencies:
"@vitest/pretty-format": 3.2.7
loupe: 3.2.1
tinyrainbow: 2.0.0
"@webassemblyjs/ast@1.14.1":
dependencies:
"@webassemblyjs/helper-numbers": 1.13.2
@@ -22947,7 +23037,7 @@ snapshots:
dependencies:
"@types/chai": 5.2.3
"@vitest/expect": 3.2.4
"@vitest/mocker": 3.2.4(vite@6.4.2(@types/node@25.5.2)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
"@vitest/mocker": 3.2.4(vite@6.4.2(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
"@vitest/pretty-format": 3.2.4
"@vitest/runner": 3.2.4
"@vitest/snapshot": 3.2.4
@@ -22987,6 +23077,50 @@ snapshots:
- tsx
- yaml
vitest@3.2.7(@types/debug@4.1.13)(@types/node@22.19.17)(happy-dom@20.8.9)(jiti@2.7.0)(jsdom@25.0.1)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0):
dependencies:
"@types/chai": 5.2.3
"@vitest/expect": 3.2.7
"@vitest/mocker": 3.2.7(vite@6.4.2(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0))
"@vitest/pretty-format": 3.2.7
"@vitest/runner": 3.2.7
"@vitest/snapshot": 3.2.7
"@vitest/spy": 3.2.7
"@vitest/utils": 3.2.7
chai: 5.3.3
debug: 4.4.3
expect-type: 1.3.0
magic-string: 0.30.21
pathe: 2.0.3
picomatch: 4.0.4
std-env: 3.10.0
tinybench: 2.9.0
tinyexec: 0.3.2
tinyglobby: 0.2.15
tinypool: 1.1.1
tinyrainbow: 2.0.0
vite: 6.4.2(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
vite-node: 3.2.4(@types/node@22.19.17)(jiti@2.7.0)(lightningcss@1.32.0)(sass@1.99.0)(terser@5.46.2)(tsx@4.21.0)(yaml@2.9.0)
why-is-node-running: 2.3.0
optionalDependencies:
"@types/debug": 4.1.13
"@types/node": 22.19.17
happy-dom: 20.8.9
jsdom: 25.0.1
transitivePeerDependencies:
- jiti
- less
- lightningcss
- msw
- sass
- sass-embedded
- stylus
- sugarss
- supports-color
- terser
- tsx
- yaml
w3c-xmlserializer@5.0.0:
dependencies:
xml-name-validator: 5.0.0

View File

@@ -1,4 +1,6 @@
import { test, describe } from "node:test";
// Runs under vitest (pnpm test:scripts picks up scripts/**/*.test.mjs);
// node:assert keeps the original assertion style.
import { test, describe } from "vitest";
import assert from "node:assert/strict";
import fs from "node:fs";
import os from "node:os";

View File

@@ -1,4 +1,6 @@
import { test, describe } from "node:test";
// Runs under vitest (pnpm test:scripts picks up scripts/**/*.test.mjs);
// node:assert keeps the original assertion style.
import { test, describe } from "vitest";
import assert from "node:assert/strict";
import fs from "node:fs";
import os from "node:os";

View File

@@ -1,4 +1,6 @@
import { test, describe } from "node:test";
// Runs under vitest (pnpm test:scripts picks up scripts/**/*.test.mjs);
// node:assert keeps the original assertion style.
import { test, describe } from "vitest";
import assert from "node:assert/strict";
import fs from "node:fs";
import os from "node:os";

View File

@@ -1,4 +1,6 @@
import { test, describe } from "node:test";
// Runs under vitest (pnpm test:scripts picks up scripts/**/*.test.mjs);
// node:assert keeps the original assertion style.
import { test, describe } from "vitest";
import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";

View File

@@ -1,4 +1,6 @@
import { test, describe } from "node:test";
// Runs under vitest (pnpm test:scripts picks up scripts/**/*.test.mjs);
// node:assert keeps the original assertion style.
import { test, describe } from "vitest";
import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";

View File

@@ -1,4 +1,6 @@
import { test, describe } from "node:test";
// Runs under vitest (pnpm test:scripts picks up scripts/**/*.test.mjs);
// node:assert keeps the original assertion style.
import { test, describe } from "vitest";
import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";

View File

@@ -1,4 +1,6 @@
import { test, describe } from "node:test";
// Runs under vitest (pnpm test:scripts picks up scripts/**/*.test.mjs);
// node:assert keeps the original assertion style.
import { test, describe } from "vitest";
import assert from "node:assert/strict";
import fs from "node:fs";
import os from "node:os";

View File

@@ -1,4 +1,6 @@
import { test, describe } from "node:test";
// Runs under vitest (pnpm test:scripts picks up scripts/**/*.test.mjs);
// node:assert keeps the original assertion style.
import { test, describe } from "vitest";
import assert from "node:assert/strict";
import fs from "node:fs";
import os from "node:os";

View File

@@ -1,4 +1,6 @@
import { test, describe } from "node:test";
// Runs under vitest (pnpm test:scripts picks up scripts/**/*.test.mjs);
// node:assert keeps the original assertion style.
import { test, describe } from "vitest";
import assert from "node:assert/strict";
import fs from "node:fs";
import os from "node:os";

View File

@@ -52,8 +52,10 @@ describe("pnpm work cli", () => {
expect(out.length).toBeGreaterThan(0);
});
it("dispatch prints a plan", () => {
it("dispatch prints a plan or reports nothing is ready", () => {
// Runs against the real docs/work tree, so the outcome depends on
// whether a ready task exists — both branches are valid CLI output.
const out = run("dispatch");
expect(out).toContain("Dispatch plan");
expect(out).toMatch(/Dispatch plan|No ready task to dispatch/);
});
});

View File

@@ -1,4 +1,6 @@
import { test, describe } from "node:test";
// Runs under vitest (pnpm test:scripts picks up scripts/**/*.test.mjs);
// node:assert keeps the original assertion style.
import { test, describe } from "vitest";
import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";

View File

@@ -12,7 +12,8 @@ import {
function makeWorkTree({ epics }) {
const root = fs.mkdtempSync(path.join(os.tmpdir(), "dispatch-"));
for (const [epicId, epicData] of Object.entries(epics)) {
const epicDir = path.join(root, epicId);
// findNextTask/buildState walk <workRoot>/epics/ — mirror docs/work.
const epicDir = path.join(root, "epics", epicId);
fs.mkdirSync(epicDir, { recursive: true });
fs.writeFileSync(
path.join(epicDir, "_epic.md"),

View File

@@ -1,4 +1,6 @@
import { test, describe } from "node:test";
// Runs under vitest (pnpm test:scripts picks up scripts/**/*.test.mjs);
// node:assert keeps the original assertion style.
import { test, describe } from "vitest";
import assert from "node:assert/strict";
import fs from "node:fs";
import path from "node:path";

View File

@@ -12,7 +12,8 @@ import {
function makeWorkTree({ epics }) {
const root = fs.mkdtempSync(path.join(os.tmpdir(), "work-state-"));
for (const [epicId, epicData] of Object.entries(epics)) {
const epicDir = path.join(root, epicId);
// buildState walks <workRoot>/epics/ — mirror the real docs/work layout.
const epicDir = path.join(root, "epics", epicId);
fs.mkdirSync(epicDir, { recursive: true });
fs.writeFileSync(
path.join(epicDir, "_epic.md"),
@@ -85,6 +86,7 @@ describe("buildState", () => {
epic1: {
status: "in-progress",
title: "epic1",
prd: null,
stories: {
story1: {
status: "done",
@@ -127,7 +129,7 @@ describe("buildState", () => {
it("parses depends-on and blocks frontmatter arrays", () => {
const root = fs.mkdtempSync(path.join(os.tmpdir(), "work-dep-"));
const epicDir = path.join(root, "epic1");
const epicDir = path.join(root, "epics", "epic1");
fs.mkdirSync(epicDir, { recursive: true });
fs.writeFileSync(
path.join(epicDir, "_epic.md"),

View File

@@ -8,9 +8,10 @@ const GUARD = path.join(__dirname, "state-sync-guard.mjs");
describe("state-sync-guard smoke", () => {
it("exits 0 when run against the repo's current state (since main is in sync)", () => {
// Run the guard; if main's _state.json drifts, this test will fail and tell us.
execSync(`node "${GUARD}"`, { encoding: "utf8" });
// No assertion on output; the exit code is 0 if we got here without throwing.
expect(true).toBe(true);
// Run the guard; if main's _state.json drifts, execSync throws (non-zero
// exit) and this test fails with the guard's output.
expect(() =>
execSync(`node "${GUARD}"`, { encoding: "utf8" }),
).not.toThrow();
});
});

View File

@@ -18,7 +18,6 @@
"SENTRY_ENVIRONMENT",
"VERCEL_GIT_COMMIT_SHA",
"NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA",
"VERCEL_ENV",
"AUDIT_PSEUDONYM_SALT"
],
"boundaries": {

24
vitest.scripts.config.mjs Normal file
View File

@@ -0,0 +1,24 @@
import { defineConfig } from "vitest/config";
/**
* Runner for the root scripts/ test suite (pnpm test:scripts).
*
* scripts/ is not a workspace package, so `turbo run test` never reaches
* these files — this dedicated config wires them to a runner. The suite
* runs in CI's validate job alongside the other root-level gates.
*
* Named vitest.scripts.config.mjs (not vitest.config.*) on purpose so a
* bare `vitest` invocation at the repo root does not auto-discover it.
*/
export default defineConfig({
test: {
environment: "node",
include: ["scripts/**/*.test.mjs"],
clearMocks: true,
restoreMocks: true,
// Several suites exec child node processes (work CLI, conformance
// fixtures) — keep a generous per-test ceiling.
testTimeout: 60_000,
hookTimeout: 60_000,
},
});