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

Reconciles the upstream audit-fix PR's infra changes onto the Veect
control-plane fork (kept-file portions only; deleted demo features
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; fix the
  work-tree fixtures to mirror the docs/work/epics/ layout
- 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-12 23:40:07 +02:00
parent 882c47b014
commit 8b114351a8
33 changed files with 305 additions and 115 deletions

View File

@@ -65,6 +65,10 @@ jobs:
- run: pnpm typecheck - run: pnpm typecheck
- run: pnpm lint - run: pnpm lint
- run: pnpm conformance - 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 - name: Compliance manifest drift check
run: | run: |
pnpm compliance:emit-all --check || { pnpm compliance:emit-all --check || {
@@ -156,7 +160,5 @@ jobs:
- name: Build Storybook - name: Build Storybook
run: pnpm --filter @repo/storybook build:storybook run: pnpm --filter @repo/storybook build:storybook
- run: pnpm test:stories - run: pnpm test:stories
- name: Install Playwright browsers
run: pnpm exec playwright install chromium --with-deps
- name: Visual regression - name: Visual regression
run: pnpm test:visual run: pnpm test:visual

3
.gitignore vendored
View File

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

File diff suppressed because one or more lines are too long

View File

@@ -24,7 +24,7 @@
"@sentry/nextjs": "^10.51.0", "@sentry/nextjs": "^10.51.0",
"@tailwindcss/postcss": "^4.3.0", "@tailwindcss/postcss": "^4.3.0",
"@tanstack/react-query": "^5.96.2", "@tanstack/react-query": "^5.96.2",
"@trpc/server": "^11.17.0", "@trpc/server": "^11.18.0",
"inversify": "^6.2.0", "inversify": "^6.2.0",
"next": "^15.3.0", "next": "^15.3.0",
"payload": "^3.14.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": "turbo run test",
"test:coverage": "turbo run test -- --coverage", "test:coverage": "turbo run test -- --coverage",
"test:e2e": "turbo run test:e2e", "test:e2e": "turbo run test:e2e",
"test:scripts": "vitest run --config vitest.scripts.config.mjs",
"test:stories": "turbo run test:stories", "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", "typecheck": "turbo run typecheck",
"conformance": "node scripts/conformance.mjs", "conformance": "node scripts/conformance.mjs",
"coverage:diff": "node scripts/coverage/diff.mjs", "coverage:diff": "node scripts/coverage/diff.mjs",
@@ -46,6 +47,7 @@
"prettier": "^3.5.0", "prettier": "^3.5.0",
"turbo": "^2.4.0", "turbo": "^2.4.0",
"typescript": "^5.8.0", "typescript": "^5.8.0",
"vitest": "^3.2.7",
"zod": "^3.25.0" "zod": "^3.25.0"
}, },
"lint-staged": { "lint-staged": {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

286
pnpm-lock.yaml generated
View File

@@ -18,7 +18,7 @@ importers:
version: 8.7.1 version: 8.7.1
"@stryker-mutator/vitest-runner": "@stryker-mutator/vitest-runner":
specifier: ^8.7.0 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": "@turbo/gen":
specifier: ^2.4.0 specifier: ^2.4.0
version: 2.9.10(@types/node@22.19.17) version: 2.9.10(@types/node@22.19.17)
@@ -49,6 +49,9 @@ importers:
typescript: typescript:
specifier: ^5.8.0 specifier: ^5.8.0
version: 5.9.3 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: zod:
specifier: ^3.25.0 specifier: ^3.25.0
version: 3.25.76 version: 3.25.76
@@ -244,8 +247,8 @@ importers:
specifier: ^5.96.2 specifier: ^5.96.2
version: 5.96.2(react@19.2.4) version: 5.96.2(react@19.2.4)
"@trpc/server": "@trpc/server":
specifier: ^11.17.0 specifier: ^11.18.0
version: 11.17.0(typescript@5.9.3) version: 11.18.0(typescript@5.9.3)
inversify: inversify:
specifier: ^6.2.0 specifier: ^6.2.0
version: 6.2.2(reflect-metadata@0.2.2) version: 6.2.2(reflect-metadata@0.2.2)
@@ -320,8 +323,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../core-shared version: link:../core-shared
"@trpc/server": "@trpc/server":
specifier: ^11.0.0 specifier: ^11.18.0
version: 11.16.0(typescript@5.9.3) version: 11.18.0(typescript@5.9.3)
inversify: inversify:
specifier: ^6.2.0 specifier: ^6.2.0
version: 6.2.2(reflect-metadata@0.2.2) version: 6.2.2(reflect-metadata@0.2.2)
@@ -409,8 +412,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../workspaces version: link:../workspaces
"@trpc/server": "@trpc/server":
specifier: ^11.0.0 specifier: ^11.18.0
version: 11.16.0(typescript@5.9.3) version: 11.18.0(typescript@5.9.3)
devDependencies: devDependencies:
"@repo/core-eslint": "@repo/core-eslint":
specifier: workspace:* specifier: workspace:*
@@ -437,8 +440,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../core-shared version: link:../core-shared
"@trpc/server": "@trpc/server":
specifier: ^11.0.0 specifier: ^11.18.0
version: 11.16.0(typescript@5.9.3) version: 11.18.0(typescript@5.9.3)
zod: zod:
specifier: ^3.23.0 specifier: ^3.23.0
version: 3.25.76 version: 3.25.76
@@ -526,8 +529,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../core-shared version: link:../core-shared
"@trpc/server": "@trpc/server":
specifier: ^11.0.0 specifier: ^11.18.0
version: 11.16.0(typescript@5.9.3) version: 11.18.0(typescript@5.9.3)
zod: zod:
specifier: ^3.24.0 specifier: ^3.24.0
version: 3.25.76 version: 3.25.76
@@ -572,8 +575,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../core-shared version: link:../core-shared
"@trpc/server": "@trpc/server":
specifier: ^11.0.0 specifier: ^11.18.0
version: 11.16.0(typescript@5.9.3) version: 11.18.0(typescript@5.9.3)
payload: payload:
specifier: ^3.0.0 specifier: ^3.0.0
version: 3.81.0(graphql@16.13.2)(typescript@5.9.3) version: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
@@ -778,8 +781,8 @@ importers:
specifier: ^10.51.0 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) 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": "@trpc/server":
specifier: ^11.0.0 specifier: ^11.18.0
version: 11.16.0(typescript@5.9.3) version: 11.18.0(typescript@5.9.3)
payload: payload:
specifier: ^3.14.0 specifier: ^3.14.0
version: 3.81.0(graphql@16.13.2)(typescript@5.9.3) version: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
@@ -842,11 +845,11 @@ importers:
specifier: ^14.5.0 specifier: ^14.5.0
version: 14.6.1(@testing-library/dom@10.4.1) version: 14.6.1(@testing-library/dom@10.4.1)
"@trpc/client": "@trpc/client":
specifier: ^11.0.0 specifier: ^11.18.0
version: 11.16.0(@trpc/server@11.16.0(typescript@5.9.3))(typescript@5.9.3) version: 11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server": "@trpc/server":
specifier: ^11.0.0 specifier: ^11.18.0
version: 11.16.0(typescript@5.9.3) version: 11.18.0(typescript@5.9.3)
payload: payload:
specifier: ^3.0.0 specifier: ^3.0.0
version: 3.81.0(graphql@16.13.2)(typescript@5.9.3) version: 3.81.0(graphql@16.13.2)(typescript@5.9.3)
@@ -900,14 +903,14 @@ importers:
specifier: ^5.66.0 specifier: ^5.66.0
version: 5.96.2(react@19.2.4) version: 5.96.2(react@19.2.4)
"@trpc/client": "@trpc/client":
specifier: ^11.17.0 specifier: ^11.18.0
version: 11.17.0(@trpc/server@11.17.0(typescript@5.9.3))(typescript@5.9.3) version: 11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server": "@trpc/server":
specifier: ^11.17.0 specifier: ^11.18.0
version: 11.17.0(typescript@5.9.3) version: 11.18.0(typescript@5.9.3)
"@trpc/tanstack-react-query": "@trpc/tanstack-react-query":
specifier: ^11.17.0 specifier: ^11.18.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) 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: react:
specifier: ^19.0.0 specifier: ^19.0.0
version: 19.2.4 version: 19.2.4
@@ -1077,8 +1080,8 @@ importers:
specifier: workspace:* specifier: workspace:*
version: link:../core-shared version: link:../core-shared
"@trpc/server": "@trpc/server":
specifier: ^11.0.0 specifier: ^11.18.0
version: 11.16.0(typescript@5.9.3) version: 11.18.0(typescript@5.9.3)
inversify: inversify:
specifier: ^6.2.0 specifier: ^6.2.0
version: 6.2.2(reflect-metadata@0.2.2) version: 6.2.2(reflect-metadata@0.2.2)
@@ -6662,54 +6665,35 @@ packages:
integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==, integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==,
} }
"@trpc/client@11.16.0": "@trpc/client@11.18.0":
resolution: resolution:
{ {
integrity: sha512-TxIzm7OoK3baKZ0XCbuMUbI3GhgjcbKHIc4nWVKaRpCRnbSh0T31BT6fTPYwtnA/Nur8pBCGqC2B4J5hEPiPFQ==, integrity: sha512-wOqeg3Fvl25V1ZisQhUD3K8G60ZJDlSGJNSyeXrLH24xAo5w6GSR2Kzb1cSNY9Y+IQ2YZvYGZstBU+V/ulo/ow==,
} }
hasBin: true hasBin: true
peerDependencies: peerDependencies:
"@trpc/server": 11.16.0 "@trpc/server": 11.18.0
typescript: ">=5.7.2" typescript: ">=5.7.2"
"@trpc/client@11.17.0": "@trpc/server@11.18.0":
resolution: resolution:
{ {
integrity: sha512-KpJBFrbKTDeVCFv/3ckL1XBBH5Yssn8hethI/rUy7GIpTj+VzjtPjykDqJpzobuVOz+d26cXCSu1t4I6MYI5Zg==, integrity: sha512-JAvXOuNTxgXjIDfQaOvDq1j66LMNfDJUH1IU7Slfn8EvRv2EkH6ehu3A7zpYhjO0syHHiYg77v2lG2JFJgvw7Q==,
}
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==,
} }
hasBin: true hasBin: true
peerDependencies: peerDependencies:
typescript: ">=5.7.2" typescript: ">=5.7.2"
"@trpc/server@11.17.0": "@trpc/tanstack-react-query@11.18.0":
resolution: resolution:
{ {
integrity: sha512-jbAOUe0PpUTCYqziyu+8vYXZdDXPudZgnEhWCQ2NjKnVEjfE93RqHTt1oycZJv/HNf51YlRXfEEwSIAbb161rw==, integrity: sha512-dm5xIlN0SEzJAbQ34EHdb1Kgd/zWZ63ZMviQEw3WCWCIPz8MjLKAhquncPcn+YxFUJa+Qi4qatdGFymmM4HmAQ==,
}
hasBin: true
peerDependencies:
typescript: ">=5.7.2"
"@trpc/tanstack-react-query@11.17.0":
resolution:
{
integrity: sha512-OFxjvCgisP0yaCj7lgP6qPaFwJvJDgnrAUxH3cNIPPR89TpYbndn5vsdKNkc7EnvER9b6wq9Yz8aCcPcOBpDXg==,
} }
hasBin: true hasBin: true
peerDependencies: peerDependencies:
"@tanstack/react-query": ^5.80.3 "@tanstack/react-query": ^5.80.3
"@trpc/client": 11.17.0 "@trpc/client": 11.18.0
"@trpc/server": 11.17.0 "@trpc/server": 11.18.0
react: ">=18.2.0" react: ">=18.2.0"
typescript: ">=5.7.2" typescript: ">=5.7.2"
@@ -7257,6 +7241,12 @@ packages:
integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==, integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==,
} }
"@vitest/expect@3.2.7":
resolution:
{
integrity: sha512-E8eBXaKibuvH2pSZErOjdVb5vF4PbKYcrnluBTYxEk1l/VhhwZg1kZQsdtjq+CsF5CFydf2Rdkz7jDHKSisi3w==,
}
"@vitest/mocker@3.2.4": "@vitest/mocker@3.2.4":
resolution: resolution:
{ {
@@ -7271,36 +7261,80 @@ packages:
vite: vite:
optional: true 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": "@vitest/pretty-format@3.2.4":
resolution: resolution:
{ {
integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==, integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==,
} }
"@vitest/pretty-format@3.2.7":
resolution:
{
integrity: sha512-KUHlwqVu0sRlhCdyPdQ/wBoTfRahjUky1MubOmYw9fWfIZy1gNoHpuaaQBPAaMaVYdQYHJLurzj8ECCj5OwTqA==,
}
"@vitest/runner@3.2.4": "@vitest/runner@3.2.4":
resolution: resolution:
{ {
integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==, integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==,
} }
"@vitest/runner@3.2.7":
resolution:
{
integrity: sha512-sB9y4ovltoQP+WaUPwmSxO9WIg9Ig694Di5PalVPsYHklAdE027mehpWF2SQSVq+k6sFgaivbTjTJwZLSHbedA==,
}
"@vitest/snapshot@3.2.4": "@vitest/snapshot@3.2.4":
resolution: resolution:
{ {
integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==, integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==,
} }
"@vitest/snapshot@3.2.7":
resolution:
{
integrity: sha512-7C+MwShwtBSI5Buwoyg3s/iY1eHL9PKAf+O1wVh/TdnjXUtkoL/9YQtre90i4MtNXM6edP1wJ2zOBpfCyhIS7g==,
}
"@vitest/spy@3.2.4": "@vitest/spy@3.2.4":
resolution: resolution:
{ {
integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==, integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==,
} }
"@vitest/spy@3.2.7":
resolution:
{
integrity: sha512-Q2eQGI6d2L/hBtZ0qNuKcAGid68XK6cv1xsoaIma6PaJhHPoqcEJhYpXZ/5myCMqkNgtP6UKuBhbc0nHKnrkuQ==,
}
"@vitest/utils@3.2.4": "@vitest/utils@3.2.4":
resolution: resolution:
{ {
integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==, integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==,
} }
"@vitest/utils@3.2.7":
resolution:
{
integrity: sha512-x6BDOd7dyo3PFLY3I9/HJ25X/6OurhGXk2/B9gOZNPF7XDVjeBK4k01lQE5uvDpbuheErh91qYuE1E2OEjK3Rw==,
}
"@webassemblyjs/ast@1.14.1": "@webassemblyjs/ast@1.14.1":
resolution: resolution:
{ {
@@ -14131,6 +14165,37 @@ packages:
jsdom: jsdom:
optional: true 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: w3c-xmlserializer@5.0.0:
resolution: resolution:
{ {
@@ -18408,13 +18473,13 @@ snapshots:
"@stryker-mutator/util@8.7.1": {} "@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: dependencies:
"@stryker-mutator/api": 8.7.1 "@stryker-mutator/api": 8.7.1
"@stryker-mutator/core": 8.7.1 "@stryker-mutator/core": 8.7.1
"@stryker-mutator/util": 8.7.1 "@stryker-mutator/util": 8.7.1
tslib: 2.7.0 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": "@swc/core-darwin-arm64@1.15.33":
optional: true optional: true
@@ -18674,29 +18739,20 @@ snapshots:
"@tokenizer/token@0.3.0": {} "@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: dependencies:
"@trpc/server": 11.16.0(typescript@5.9.3) "@trpc/server": 11.18.0(typescript@5.9.3)
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)": "@trpc/server@11.18.0(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)":
dependencies: dependencies:
typescript: 5.9.3 typescript: 5.9.3
"@trpc/server@11.17.0(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:
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)":
dependencies: dependencies:
"@tanstack/react-query": 5.96.2(react@19.2.4) "@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/client": 11.18.0(@trpc/server@11.18.0(typescript@5.9.3))(typescript@5.9.3)
"@trpc/server": 11.17.0(typescript@5.9.3) "@trpc/server": 11.18.0(typescript@5.9.3)
react: 19.2.4 react: 19.2.4
typescript: 5.9.3 typescript: 5.9.3
@@ -19094,6 +19150,14 @@ snapshots:
chai: 5.3.3 chai: 5.3.3
tinyrainbow: 2.0.0 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))": "@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: dependencies:
"@vitest/spy": 3.2.4 "@vitest/spy": 3.2.4
@@ -19102,40 +19166,66 @@ snapshots:
optionalDependencies: 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) 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: dependencies:
"@vitest/spy": 3.2.4 "@vitest/spy": 3.2.7
estree-walker: 3.0.3 estree-walker: 3.0.3
magic-string: 0.30.21 magic-string: 0.30.21
optionalDependencies: 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": "@vitest/pretty-format@3.2.4":
dependencies: dependencies:
tinyrainbow: 2.0.0 tinyrainbow: 2.0.0
"@vitest/pretty-format@3.2.7":
dependencies:
tinyrainbow: 2.0.0
"@vitest/runner@3.2.4": "@vitest/runner@3.2.4":
dependencies: dependencies:
"@vitest/utils": 3.2.4 "@vitest/utils": 3.2.4
pathe: 2.0.3 pathe: 2.0.3
strip-literal: 3.1.0 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": "@vitest/snapshot@3.2.4":
dependencies: dependencies:
"@vitest/pretty-format": 3.2.4 "@vitest/pretty-format": 3.2.4
magic-string: 0.30.21 magic-string: 0.30.21
pathe: 2.0.3 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": "@vitest/spy@3.2.4":
dependencies: dependencies:
tinyspy: 4.0.4 tinyspy: 4.0.4
"@vitest/spy@3.2.7":
dependencies:
tinyspy: 4.0.4
"@vitest/utils@3.2.4": "@vitest/utils@3.2.4":
dependencies: dependencies:
"@vitest/pretty-format": 3.2.4 "@vitest/pretty-format": 3.2.4
loupe: 3.2.1 loupe: 3.2.1
tinyrainbow: 2.0.0 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": "@webassemblyjs/ast@1.14.1":
dependencies: dependencies:
"@webassemblyjs/helper-numbers": 1.13.2 "@webassemblyjs/helper-numbers": 1.13.2
@@ -23682,7 +23772,7 @@ snapshots:
dependencies: dependencies:
"@types/chai": 5.2.3 "@types/chai": 5.2.3
"@vitest/expect": 3.2.4 "@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/pretty-format": 3.2.4
"@vitest/runner": 3.2.4 "@vitest/runner": 3.2.4
"@vitest/snapshot": 3.2.4 "@vitest/snapshot": 3.2.4
@@ -23722,6 +23812,50 @@ snapshots:
- tsx - tsx
- yaml - 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: w3c-xmlserializer@5.0.0:
dependencies: dependencies:
xml-name-validator: 5.0.0 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 assert from "node:assert/strict";
import fs from "node:fs"; import fs from "node:fs";
import os from "node:os"; 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 assert from "node:assert/strict";
import fs from "node:fs"; import fs from "node:fs";
import os from "node:os"; 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 assert from "node:assert/strict";
import fs from "node:fs"; import fs from "node:fs";
import os from "node:os"; 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 assert from "node:assert/strict";
import fs from "node:fs"; import fs from "node:fs";
import path from "node:path"; 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 assert from "node:assert/strict";
import fs from "node:fs"; import fs from "node:fs";
import path from "node:path"; 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 assert from "node:assert/strict";
import fs from "node:fs"; import fs from "node:fs";
import path from "node:path"; 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 assert from "node:assert/strict";
import fs from "node:fs"; import fs from "node:fs";
import os from "node:os"; 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 assert from "node:assert/strict";
import fs from "node:fs"; import fs from "node:fs";
import os from "node:os"; 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 assert from "node:assert/strict";
import fs from "node:fs"; import fs from "node:fs";
import os from "node:os"; import os from "node:os";

View File

@@ -52,8 +52,10 @@ describe("pnpm work cli", () => {
expect(out.length).toBeGreaterThan(0); 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"); 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 assert from "node:assert/strict";
import fs from "node:fs"; import fs from "node:fs";
import path from "node:path"; import path from "node:path";

View File

@@ -12,7 +12,8 @@ import {
function makeWorkTree({ epics }) { function makeWorkTree({ epics }) {
const root = fs.mkdtempSync(path.join(os.tmpdir(), "dispatch-")); const root = fs.mkdtempSync(path.join(os.tmpdir(), "dispatch-"));
for (const [epicId, epicData] of Object.entries(epics)) { 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.mkdirSync(epicDir, { recursive: true });
fs.writeFileSync( fs.writeFileSync(
path.join(epicDir, "_epic.md"), 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 assert from "node:assert/strict";
import fs from "node:fs"; import fs from "node:fs";
import path from "node:path"; import path from "node:path";

View File

@@ -12,7 +12,8 @@ import {
function makeWorkTree({ epics }) { function makeWorkTree({ epics }) {
const root = fs.mkdtempSync(path.join(os.tmpdir(), "work-state-")); const root = fs.mkdtempSync(path.join(os.tmpdir(), "work-state-"));
for (const [epicId, epicData] of Object.entries(epics)) { 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.mkdirSync(epicDir, { recursive: true });
fs.writeFileSync( fs.writeFileSync(
path.join(epicDir, "_epic.md"), path.join(epicDir, "_epic.md"),
@@ -85,6 +86,7 @@ describe("buildState", () => {
epic1: { epic1: {
status: "in-progress", status: "in-progress",
title: "epic1", title: "epic1",
prd: null,
stories: { stories: {
story1: { story1: {
status: "done", status: "done",
@@ -127,7 +129,7 @@ describe("buildState", () => {
it("parses depends-on and blocks frontmatter arrays", () => { it("parses depends-on and blocks frontmatter arrays", () => {
const root = fs.mkdtempSync(path.join(os.tmpdir(), "work-dep-")); 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.mkdirSync(epicDir, { recursive: true });
fs.writeFileSync( fs.writeFileSync(
path.join(epicDir, "_epic.md"), 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", () => { describe("state-sync-guard smoke", () => {
it("exits 0 when run against the repo's current state (since main is in sync)", () => { 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. // Run the guard; if main's _state.json drifts, execSync throws (non-zero
const result = execSync(`node "${GUARD}"`, { encoding: "utf8" }); // exit) and this test fails with the guard's output.
// No assertion on output; the exit code is 0 if we got here without throwing. expect(() =>
expect(true).toBe(true); execSync(`node "${GUARD}"`, { encoding: "utf8" }),
).not.toThrow();
}); });
}); });

View File

@@ -18,7 +18,6 @@
"SENTRY_ENVIRONMENT", "SENTRY_ENVIRONMENT",
"VERCEL_GIT_COMMIT_SHA", "VERCEL_GIT_COMMIT_SHA",
"NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA", "NEXT_PUBLIC_VERCEL_GIT_COMMIT_SHA",
"VERCEL_ENV",
"AUDIT_PSEUDONYM_SALT", "AUDIT_PSEUDONYM_SALT",
"VEECT_SECRET" "VEECT_SECRET"
], ],

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,
},
});