pcbjam/web/turbo.json

30 lines
565 B
JSON
Raw Normal View History

{
"$schema": "https://turbo.build/schema.json",
"globalEnv": [
"PORT",
tool-switch: create the missing counterpart file instead of silently no-opping Tools → "Switch to PCB Editor" in a project with no .kicad_pcb (e.g. created from a lone schematic) did nothing: the nav hook found no file for the target tool and returned false. Now a session that can persist (ToolPage passes the new createFile prop) writes the templated counterpart via createProjectFileIfMissing — no download fallback, and it re-checks existence so a collaborator's file is never clobbered — then navigates to it, matching native KiCad (pcbnew opens a new board at the derived path). Sessions that can't persist (read-only viewers, scratch/local-folder) keep the logged no-op. Also latch the quit dispatcher off before every deliberate tool-switch navigation (markDeliberateNavigation): the wx port's UnloadCallback runs on BEFOREUNLOAD and closes the top frame the moment the navigation starts, so the quit hook history.back()'d over the in-flight navigation — the pagehide latch is too late (it only fires at commit time). e2e: new tests/web/tool-switch-missing-file.spec.ts reproduces the flow via a browser-local (IDB) project created from the home page; playwright-web config gains VITE_LOCAL_PROJECTS=idb and derives STANDALONE_PORT/CORS_ORIGIN from WEB_APP_URL (runs the suite past a squatted :3048); both vars declared in web/turbo.json globalEnv (turbo strict-env strips undeclared vars). Includes the previously-uncommitted tool-switch spec repairs (URL grammar + z-30 boot-overlay wait). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 13:56:27 +02:00
"STANDALONE_PORT",
"PROJECT_DIR",
"CORS_ORIGIN",
"WASM_SRC_DIR",
"VITE_API_BASE_URL",
tool-switch: create the missing counterpart file instead of silently no-opping Tools → "Switch to PCB Editor" in a project with no .kicad_pcb (e.g. created from a lone schematic) did nothing: the nav hook found no file for the target tool and returned false. Now a session that can persist (ToolPage passes the new createFile prop) writes the templated counterpart via createProjectFileIfMissing — no download fallback, and it re-checks existence so a collaborator's file is never clobbered — then navigates to it, matching native KiCad (pcbnew opens a new board at the derived path). Sessions that can't persist (read-only viewers, scratch/local-folder) keep the logged no-op. Also latch the quit dispatcher off before every deliberate tool-switch navigation (markDeliberateNavigation): the wx port's UnloadCallback runs on BEFOREUNLOAD and closes the top frame the moment the navigation starts, so the quit hook history.back()'d over the in-flight navigation — the pagehide latch is too late (it only fires at commit time). e2e: new tests/web/tool-switch-missing-file.spec.ts reproduces the flow via a browser-local (IDB) project created from the home page; playwright-web config gains VITE_LOCAL_PROJECTS=idb and derives STANDALONE_PORT/CORS_ORIGIN from WEB_APP_URL (runs the suite past a squatted :3048); both vars declared in web/turbo.json globalEnv (turbo strict-env strips undeclared vars). Includes the previously-uncommitted tool-switch spec repairs (URL grammar + z-30 boot-overlay wait). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-16 13:56:27 +02:00
"VITE_LOCAL_PROJECTS",
e2e/CI: dual-engine suites, per-engine screenshots, SwiftShader retired, prod web suite, CI-coverage gate Squash of experiment/ff-big-modules vs main. Big-module routing removed: native-EH shrank kicad_editor below SpiderMonkey's x86-64 code budget (runs 29355049705/29356152413 green on stock Firefox), so BIG_MODULE_SPECS routing and the baseline-only-JIT crutch are gone — kicad-firefox and kicad-chromium both run the full suite, with the module compiled the way real users' browsers compile it. Per-engine screenshots end to end: stableShot/shotPath write test-results/<engine>/<name>.png; baselines move to baseline-screenshots/{chromium,firefox}/ and the whole tools/screenshots pipeline (compare/promote/manifest/spec-map/changelog/Discord) keys on <engine>/<name>. Previously Firefox and Chromium renders of one spec overwrote each other and Firefox renders were never actually gated. Seeded from CI run 29421380806 (92 new firefox baselines, +24 chromium web-suite shots); manifest generated from the baseline tree. One merged playwright.config.ts (kicad/asyncify/coroutine/perf as projects); ~25 dead npm scripts dropped. The web suite is gated in CI for the first time ever (4 rotted specs fixed, 5 broken lib-bridge specs triaged as fixme in docs/features/web-e2e-rot/); cheap lint step after npm ci; last 26 blind-sleep violations fixed. SwiftShader retired: CI Chromium renders WebGL on ANGLE → Mesa llvmpipe (--use-gl=angle --use-angle=gl --ignore-gpu-blocklist; the blocklist flag is mandatory — llvmpipe is blocklisted and WebGL is silently unavailable without it) in BOTH configs. Under WORKERS=4 congestion SwiftShader transiently failed the first post-board-load draw and the recovery cascade ended in a silent permanent Cairo fallback — that engine flip was the "~1.2% changedRatio both directions" occ-export baseline flake. Validated 160/160 across two 80-repeat rigs; full analysis in docs/features/wx-parity-bugs/occ-export-context-eviction.md. Chromium baselines shift slightly on llvmpipe — promote once from the first green run. Deflakes the new coverage exposed: presence baselines settle before capture; presence fixtures declare current file formats; perf gets its own outputDir so CI evidence survives; occ-export settles the board paint before the export dialog; menu-item waits (waitForRenderedByLabel before clickMenuItem) in 4 specs + the TESTING.md rule. Web suite runs the PROD build, in parallel: webServer becomes backend `start` + the standalone's e2e:preview (build-preview.mjs: link-wasm → stash the public/wasm symlink aside during vite build, build-demo.mjs's move — then vite preview as the persistent server). The wasm middleware serves /wasm/* in preview and emits COOP/COEP/CORP itself (a pthread worker script's own response must carry COEP or Chrome kills it with ERR_BLOCKED_BY_RESPONSE). VITE_* flags bake at build time; VITE_ALLOW_USER_OVERRIDE joins turbo globalEnv. fullyParallel + default workers: 5.2m → 1.4m. Determinism fixes the parallel run exposed: shared-page specs become serial groups; locks.spec grabs alice's exact item via the new kicadCollabTestSelectByUuid hook (cross-tab "first footprint" order is not a ysync invariant); quit specs poll page.url() (quit supersedes its own navigation — NS_BINDING_ABORTED on Firefox). Suite: 51 passed / 12 skipped / 0 failed in 1.6m. CI-coverage gate (lint:ci-coverage): every tests/**/*.spec.ts must be reachable from the npm scripts the workflows invoke — scraped from .github/workflows/, resolved through package.json, coverage asked from playwright --list itself. Rules: uncovered-spec + orphan-project (with a documented LOCAL_ONLY_PROJECTS allowlist). Gating next to lint:determinism; 138 spec files / 13 projects accounted for. Product fixes kept from the investigations (reachable on real GPUs too): wx 7799fd1be5 — paint flags clear before dispatch + Invalidate always propagates; kicad 3dcfea5e45 — SwiftShader pass-boundary flush + per-instance font texture + first-frame GL-error drain (GAL recovery recovers instead of falling back to Cairo) + the user-facing eeschema switch navigates again under __EMSCRIPTEN__ (project-sync's FaceRegistered gate had rerouted it into the hidden sync player; caught by the newly-gated web suite). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018eUxiPApHgGiu9NFyQfhAq
2026-07-17 12:10:40 +02:00
"VITE_ALLOW_USER_OVERRIDE",
feat(editor): report uncaught errors to Better Stack The editor reported nothing when a session died. Evidence lived only in-tab — an 800-line React array behind a "Show console" button — so diagnosis meant asking a user to paste a screenshot. Better Stack's Error Tracking ingests the Sentry wire protocol, so this runs the stock @sentry/browser against a Better Stack DSN. Sentry.init installs its own window error/unhandledrejection handlers, so uncaught main-thread errors and the wasm traps that escape emscripten's DOM event handlers are captured with no instrumentation at the throw sites. Not their JS tag: it has no beforeSend or fingerprint hooks, its runtime spawns workers from cross-origin CDN hosts (this page is COEP: require-corp), and it ships session replay on by default — which on a CAD canvas records customers' board geometry. @sentry/browser is imported in exactly one file so the vendor stays swappable, mirroring how lib/analytics.ts isolates Plausible. Also replaces the terminal-signature regex with a shared, unit-tested predicate (wasm/terminal-error.ts) used by BOTH the fatal overlay and the reporter, so they cannot disagree. The regex was a type check written as a string match and had three live holes: `RuntimeError` was listed but never appears IN `.message`; Chrome's bare "unreachable" and "null function" matched nothing (the v0.1.20 prod log is exactly those); and narrowing "table index is out of bounds" to `\bindex out of bounds` for Firefox in 197f317 silently stopped matching Chrome's spelling. Checking the TYPE — every trap in this family is a WebAssembly.RuntimeError — covers all engines and ends the spelling chase; the message patterns remain as a fallback for paths that lose the Error object, such as a worker ErrorEvent crossing the realm boundary with error: null. 197f317's pthread-worker tap, promote() and Firefox findings are kept as-is. Notes: - Off unless VITE_ERRORS_DSN is set AND VITE_ALLOW_USER_OVERRIDE !== "1" (dev servers and every Playwright harness set the latter, and production builds never do), so a production DSN in a local .env still cannot report. With no DSN the whole SDK is const-folded out: 1,193,080 vs 1,282,463 bytes of JS. - browserApiErrors integration removed. It wraps setTimeout/rAF/addEventListener in try/catch, which is exactly how KiCad-on-Emscripten drives its main loop. - Console breadcrumbs off (collab/debug.ts's clog fires per Yjs update and would evict the ring before any crash); dom/fetch/navigation breadcrumbs kept. - beforeSend redacts token/apiKey/Bearer — collab/provider.ts puts the collab token in the y-partyserver URL, so a connection-failure string carries a live credential — and guards the cascade: one wedge produced 8 errors in prod, and after the first terminal event the rest are dropped into cascade_count. Verified end to end against the real EU host from a cross-origin-isolated page: POST /api/<id>/envelope/ -> 200, and 4 terminal throws produce 1 event (control: 1 throw, same count). Privacy policy 9, cookie policy 6 and the licenses page are updated: Better Stack is disclosed as an EU processor, and the licenses page now describes the browser app's own JS dependencies, which it never did. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-03 12:24:30 +02:00
"VITE_WASM_ASSET_BASE_URL",
"VITE_ERRORS_DSN",
"VITE_ERRORS_ENV"
],
"tasks": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"dev": {
"cache": false,
"persistent": true
},
"typecheck": {
"dependsOn": ["^build"]
},
"lint": {}
}
}