@gate-forge/pack-playwright 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +31 -0
  2. package/dist/constants.d.ts +13 -140
  3. package/dist/constants.d.ts.map +1 -1
  4. package/dist/constants.js +13 -148
  5. package/dist/constants.js.map +1 -1
  6. package/dist/cypress/plugin.d.ts +53 -0
  7. package/dist/cypress/plugin.d.ts.map +1 -0
  8. package/dist/cypress/plugin.js +369 -0
  9. package/dist/cypress/plugin.js.map +1 -0
  10. package/dist/cypress/spec-scan.d.ts +39 -0
  11. package/dist/cypress/spec-scan.d.ts.map +1 -0
  12. package/dist/cypress/spec-scan.js +301 -0
  13. package/dist/cypress/spec-scan.js.map +1 -0
  14. package/dist/diagnosis.d.ts +39 -0
  15. package/dist/diagnosis.d.ts.map +1 -0
  16. package/dist/diagnosis.js +63 -0
  17. package/dist/diagnosis.js.map +1 -0
  18. package/dist/discovery/adapter-projection.d.ts +13 -0
  19. package/dist/discovery/adapter-projection.d.ts.map +1 -0
  20. package/dist/discovery/adapter-projection.js +84 -0
  21. package/dist/discovery/adapter-projection.js.map +1 -0
  22. package/dist/discovery/config-locations.d.ts +5 -0
  23. package/dist/discovery/config-locations.d.ts.map +1 -0
  24. package/dist/discovery/config-locations.js +19 -0
  25. package/dist/discovery/config-locations.js.map +1 -0
  26. package/dist/discovery/cypress-runner-adapter.d.ts +112 -0
  27. package/dist/discovery/cypress-runner-adapter.d.ts.map +1 -0
  28. package/dist/discovery/cypress-runner-adapter.js +501 -0
  29. package/dist/discovery/cypress-runner-adapter.js.map +1 -0
  30. package/dist/discovery/discover.d.ts +53 -1
  31. package/dist/discovery/discover.d.ts.map +1 -1
  32. package/dist/discovery/discover.js +100 -3
  33. package/dist/discovery/discover.js.map +1 -1
  34. package/dist/discovery/git-ignore.d.ts +13 -0
  35. package/dist/discovery/git-ignore.d.ts.map +1 -0
  36. package/dist/discovery/git-ignore.js +62 -0
  37. package/dist/discovery/git-ignore.js.map +1 -0
  38. package/dist/discovery/index.d.ts +9 -0
  39. package/dist/discovery/index.d.ts.map +1 -1
  40. package/dist/discovery/index.js +9 -0
  41. package/dist/discovery/index.js.map +1 -1
  42. package/dist/discovery/playwright-runner-adapter.d.ts +108 -0
  43. package/dist/discovery/playwright-runner-adapter.d.ts.map +1 -0
  44. package/dist/discovery/playwright-runner-adapter.js +185 -0
  45. package/dist/discovery/playwright-runner-adapter.js.map +1 -0
  46. package/dist/discovery/prepare-barrier.d.ts +522 -0
  47. package/dist/discovery/prepare-barrier.d.ts.map +1 -0
  48. package/dist/discovery/prepare-barrier.js +739 -0
  49. package/dist/discovery/prepare-barrier.js.map +1 -0
  50. package/dist/discovery/pytest-adapter.d.ts.map +1 -1
  51. package/dist/discovery/pytest-adapter.js +6 -2
  52. package/dist/discovery/pytest-adapter.js.map +1 -1
  53. package/dist/discovery/pytest-runner-adapter.d.ts +124 -0
  54. package/dist/discovery/pytest-runner-adapter.d.ts.map +1 -0
  55. package/dist/discovery/pytest-runner-adapter.js +454 -0
  56. package/dist/discovery/pytest-runner-adapter.js.map +1 -0
  57. package/dist/discovery/reconcile.d.ts +80 -11
  58. package/dist/discovery/reconcile.d.ts.map +1 -1
  59. package/dist/discovery/reconcile.js +395 -78
  60. package/dist/discovery/reconcile.js.map +1 -1
  61. package/dist/discovery/runner-env.d.ts +88 -2
  62. package/dist/discovery/runner-env.d.ts.map +1 -1
  63. package/dist/discovery/runner-env.js +142 -4
  64. package/dist/discovery/runner-env.js.map +1 -1
  65. package/dist/discovery/static-discovery.d.ts +38 -3
  66. package/dist/discovery/static-discovery.d.ts.map +1 -1
  67. package/dist/discovery/static-discovery.js +454 -15
  68. package/dist/discovery/static-discovery.js.map +1 -1
  69. package/dist/discovery/supervised-run.d.ts +199 -10
  70. package/dist/discovery/supervised-run.d.ts.map +1 -1
  71. package/dist/discovery/supervised-run.js +350 -39
  72. package/dist/discovery/supervised-run.js.map +1 -1
  73. package/dist/discovery/trusted-config.d.ts +180 -6
  74. package/dist/discovery/trusted-config.d.ts.map +1 -1
  75. package/dist/discovery/trusted-config.js +279 -10
  76. package/dist/discovery/trusted-config.js.map +1 -1
  77. package/dist/discovery/vitest-runner-adapter.d.ts +172 -0
  78. package/dist/discovery/vitest-runner-adapter.d.ts.map +1 -0
  79. package/dist/discovery/vitest-runner-adapter.js +607 -0
  80. package/dist/discovery/vitest-runner-adapter.js.map +1 -0
  81. package/dist/fixture/consumer-runner.d.ts +4 -0
  82. package/dist/fixture/consumer-runner.d.ts.map +1 -0
  83. package/dist/fixture/consumer-runner.js +38 -0
  84. package/dist/fixture/consumer-runner.js.map +1 -0
  85. package/dist/fixture/evidence.d.ts +27 -0
  86. package/dist/fixture/evidence.d.ts.map +1 -1
  87. package/dist/fixture/evidence.js +12 -0
  88. package/dist/fixture/evidence.js.map +1 -1
  89. package/dist/fixture/fixture.d.ts +2 -1
  90. package/dist/fixture/fixture.d.ts.map +1 -1
  91. package/dist/fixture/fixture.js +1 -17
  92. package/dist/fixture/fixture.js.map +1 -1
  93. package/dist/fixture/witness-client.d.ts +6 -174
  94. package/dist/fixture/witness-client.d.ts.map +1 -1
  95. package/dist/fixture/witness-client.js +6 -267
  96. package/dist/fixture/witness-client.js.map +1 -1
  97. package/dist/index.d.ts +9 -6
  98. package/dist/index.d.ts.map +1 -1
  99. package/dist/index.js +5 -4
  100. package/dist/index.js.map +1 -1
  101. package/dist/json.d.ts +6 -12
  102. package/dist/json.d.ts.map +1 -1
  103. package/dist/json.js +6 -17
  104. package/dist/json.js.map +1 -1
  105. package/dist/reporter/project-graph-reporter.d.ts +92 -0
  106. package/dist/reporter/project-graph-reporter.d.ts.map +1 -0
  107. package/dist/reporter/project-graph-reporter.js +92 -0
  108. package/dist/reporter/project-graph-reporter.js.map +1 -0
  109. package/dist/reporter/reporter.cjs.map +1 -1
  110. package/dist/reporter/reporter.d.ts +93 -4
  111. package/dist/reporter/reporter.d.ts.map +1 -1
  112. package/dist/reporter/reporter.js +174 -18
  113. package/dist/reporter/reporter.js.map +1 -1
  114. package/dist/runner-claims.d.ts +13 -0
  115. package/dist/runner-claims.d.ts.map +1 -0
  116. package/dist/runner-claims.js +46 -0
  117. package/dist/runner-claims.js.map +1 -0
  118. package/dist/runner-resolution.d.ts +3 -0
  119. package/dist/runner-resolution.d.ts.map +1 -0
  120. package/dist/runner-resolution.js +14 -0
  121. package/dist/runner-resolution.js.map +1 -0
  122. package/dist/supervisor/client.d.ts +23 -1
  123. package/dist/supervisor/client.d.ts.map +1 -1
  124. package/dist/supervisor/client.js +49 -0
  125. package/dist/supervisor/client.js.map +1 -1
  126. package/dist/supervisor/drain.d.ts +65 -0
  127. package/dist/supervisor/drain.d.ts.map +1 -1
  128. package/dist/supervisor/drain.js +353 -9
  129. package/dist/supervisor/drain.js.map +1 -1
  130. package/dist/supervisor/index.d.ts +7 -3
  131. package/dist/supervisor/index.d.ts.map +1 -1
  132. package/dist/supervisor/index.js +7 -3
  133. package/dist/supervisor/index.js.map +1 -1
  134. package/dist/supervisor/spool.d.ts +65 -2
  135. package/dist/supervisor/spool.d.ts.map +1 -1
  136. package/dist/supervisor/spool.js +47 -0
  137. package/dist/supervisor/spool.js.map +1 -1
  138. package/dist/surface.d.ts +6 -207
  139. package/dist/surface.d.ts.map +1 -1
  140. package/dist/surface.js +6 -264
  141. package/dist/surface.js.map +1 -1
  142. package/dist/vitest/index.d.ts +23 -0
  143. package/dist/vitest/index.d.ts.map +1 -0
  144. package/dist/vitest/index.js +356 -0
  145. package/dist/vitest/index.js.map +1 -0
  146. package/dist/vitest/reporter.d.ts +83 -0
  147. package/dist/vitest/reporter.d.ts.map +1 -0
  148. package/dist/vitest/reporter.js +211 -0
  149. package/dist/vitest/reporter.js.map +1 -0
  150. package/dist/vitest/worker-slot.d.ts +36 -0
  151. package/dist/vitest/worker-slot.d.ts.map +1 -0
  152. package/dist/vitest/worker-slot.js +51 -0
  153. package/dist/vitest/worker-slot.js.map +1 -0
  154. package/dist/witness/adapter-registry.d.ts +6 -50
  155. package/dist/witness/adapter-registry.d.ts.map +1 -1
  156. package/dist/witness/adapter-registry.js +6 -257
  157. package/dist/witness/adapter-registry.js.map +1 -1
  158. package/dist/witness/behavior-request.d.ts +6 -76
  159. package/dist/witness/behavior-request.d.ts.map +1 -1
  160. package/dist/witness/behavior-request.js +6 -273
  161. package/dist/witness/behavior-request.js.map +1 -1
  162. package/dist/witness/behavior.d.ts +6 -48
  163. package/dist/witness/behavior.d.ts.map +1 -1
  164. package/dist/witness/behavior.js +6 -114
  165. package/dist/witness/behavior.js.map +1 -1
  166. package/dist/witness/bin.d.ts +6 -17
  167. package/dist/witness/bin.d.ts.map +1 -1
  168. package/dist/witness/bin.js +6 -168
  169. package/dist/witness/bin.js.map +1 -1
  170. package/dist/witness/browser.d.ts +14 -206
  171. package/dist/witness/browser.d.ts.map +1 -1
  172. package/dist/witness/browser.js +15 -654
  173. package/dist/witness/browser.js.map +1 -1
  174. package/dist/witness/classifications.d.ts +6 -38
  175. package/dist/witness/classifications.d.ts.map +1 -1
  176. package/dist/witness/classifications.js +6 -83
  177. package/dist/witness/classifications.js.map +1 -1
  178. package/dist/witness/env-attestation.d.ts +6 -94
  179. package/dist/witness/env-attestation.d.ts.map +1 -1
  180. package/dist/witness/env-attestation.js +6 -198
  181. package/dist/witness/env-attestation.js.map +1 -1
  182. package/dist/witness/fixture-provider.d.ts +6 -82
  183. package/dist/witness/fixture-provider.d.ts.map +1 -1
  184. package/dist/witness/fixture-provider.js +6 -105
  185. package/dist/witness/fixture-provider.js.map +1 -1
  186. package/dist/witness/loopback-pins.d.ts +6 -75
  187. package/dist/witness/loopback-pins.d.ts.map +1 -1
  188. package/dist/witness/loopback-pins.js +6 -240
  189. package/dist/witness/loopback-pins.js.map +1 -1
  190. package/dist/witness/server.d.ts +8 -26
  191. package/dist/witness/server.d.ts.map +1 -1
  192. package/dist/witness/server.js +24 -3761
  193. package/dist/witness/server.js.map +1 -1
  194. package/dist/witness/types.d.ts +6 -882
  195. package/dist/witness/types.d.ts.map +1 -1
  196. package/dist/witness/types.js +9 -1
  197. package/dist/witness/types.js.map +1 -1
  198. package/examples/overlay-proof.spec.js +75 -0
  199. package/package.json +8 -2
  200. package/python/__pycache__/gateforge_persistence_intents.cpython-312.pyc +0 -0
  201. package/python/__pycache__/gateforge_persistence_intents.cpython-314.pyc +0 -0
  202. package/python/gateforge_pytest_plugin.py +462 -0
@@ -0,0 +1,607 @@
1
+ /**
2
+ * The Vitest runner adapter behind the runner-neutral `RunnerAdapter`
3
+ * contract (plan 2026-09-25 phase 4: Jest/Vitest + supertest).
4
+ *
5
+ * - enumerate: the project's own vitest CLI runs `list --run --json` —
6
+ * the runnable set, fixed BEFORE the run. Vitest's list omits skipped
7
+ * tests (a bounded, documented divergence: a selection that would run
8
+ * nothing enumerates `unavailable`, which is the honest verdict).
9
+ * - tag: the pack's Vitest reporter (`vitest/reporter`) spools the same
10
+ * lifecycle events the Playwright reporter writes, and the in-test
11
+ * helper (`@gate-forge/pack-playwright/vitest`) resolves the
12
+ * supervisor-issued session for the running test and rewrites its
13
+ * supertest traffic through the per-test session proxy origin.
14
+ * - execute: `vitest run --reporter=json` into the EXCLUDED run-state
15
+ * dir plus the gateforge reporter; the selection granularity is the
16
+ * test FILE (the same granularity the supervised Playwright run
17
+ * composes).
18
+ * - parse: the jest-compatible JSON document, strictly. A row without
19
+ * an attributable file/title identity is NEVER attributed to a test;
20
+ * runner-assisted retries surface through the reporter's flags
21
+ * document ({@link mergeVitestRunnerFlags}).
22
+ */
23
+ import { spawn } from 'node:child_process';
24
+ import { existsSync, readFileSync } from 'node:fs';
25
+ import { isAbsolute, join, relative } from 'node:path';
26
+ import { fileURLToPath } from 'node:url';
27
+ import { ENV_APP_BASE_URL, ENV_RUN_ID, ENV_RUN_TOKEN, ENV_STATE_DIR, ENV_WITNESS_URL } from '@gate-forge/witness/constants';
28
+ import { buildWitnessedSessionRunnerEnv } from './runner-env.js';
29
+ import { untrustedEnv } from './reconcile.js';
30
+ import { VITEST_END_BARRIER_ENV } from '../vitest/reporter.js';
31
+ /** Per-test session variables a runner adapter publishes to the test. */
32
+ export const VITEST_ENV_SESSION_ID = 'GATEFORGE_SESSION_ID';
33
+ export const VITEST_ENV_SESSION_TOKEN = 'GATEFORGE_SESSION_TOKEN';
34
+ export const VITEST_ENV_SESSION_PROXY_URL = 'GATEFORGE_SESSION_PROXY_URL';
35
+ /** The variables that carry ONE test's identity to its traffic. */
36
+ export const VITEST_IDENTITY_ENV = [
37
+ VITEST_ENV_SESSION_ID,
38
+ VITEST_ENV_SESSION_TOKEN,
39
+ VITEST_ENV_SESSION_PROXY_URL,
40
+ ];
41
+ /** The runner-flags document the reporter seals (retry detection). */
42
+ const RUNNER_FLAGS_FILE = 'runner-flags.json';
43
+ /**
44
+ * The flag that keeps the runner's persistent result cache out of the
45
+ * candidate workspace (see {@link VitestRunnerAdapter.enumerate}).
46
+ */
47
+ const NO_CACHE_FLAG = ['--no-cache'];
48
+ /**
49
+ * The Vitest runner adapter.
50
+ *
51
+ * The child's vitest resolves from the project under test first
52
+ * (`<cwd>/node_modules/vitest/vitest.mjs`, the same local-first rule
53
+ * the supervised Playwright run applies to its CLI), then the parent
54
+ * process's own module graph, then `vitest` on PATH.
55
+ */
56
+ export class VitestRunnerAdapter {
57
+ options;
58
+ runner = 'vitest';
59
+ capabilities = {
60
+ inventory: 'available',
61
+ resolveInstances: 'available',
62
+ execute: 'available',
63
+ };
64
+ constructor(options = {}) {
65
+ this.options = options;
66
+ }
67
+ /**
68
+ * Job 1: the runnable set, fixed BEFORE the run (the project's own
69
+ * vitest CLI, JSON output).
70
+ *
71
+ * Args:
72
+ * cwd: absolute repo root the vitest project lives under.
73
+ *
74
+ * Returns:
75
+ * Promise<RunnerEnumeration>: the enumerated tests, or an
76
+ * `unavailable` verdict with a single cause. An empty project, a
77
+ * vitest failure, and an unreadable listing are all `unavailable`.
78
+ */
79
+ async enumerate(cwd) {
80
+ const entry = this.vitestEntryOf(cwd);
81
+ if (entry === null) {
82
+ return {
83
+ status: 'unavailable',
84
+ detail: `vitest enumeration found no vitest CLI under ${cwd} — install vitest in the project`,
85
+ tests: [],
86
+ };
87
+ }
88
+ // `--no-cache`: vitest's persistent result cache lives INSIDE the
89
+ // candidate workspace (`node_modules/.vite`), so an ordinary run
90
+ // mutates candidate bytes after the authority froze the tree and the
91
+ // fail-closed drift gate then refuses the whole run. The cache buys
92
+ // nothing here (the run is bounded and the selection is fixed), so
93
+ // neither supervised child ever writes into the workspace.
94
+ const outcome = await this.spawnVitest(cwd, entry, ['list', '--run', '--json', ...NO_CACHE_FLAG]);
95
+ if (outcome.timedOut) {
96
+ return {
97
+ status: 'unavailable',
98
+ detail: `vitest enumeration exceeded its timeout and was killed — an unavailable run never proves coverage`,
99
+ tests: [],
100
+ };
101
+ }
102
+ if (outcome.code !== 0 || outcome.error !== null) {
103
+ return {
104
+ status: 'unavailable',
105
+ detail: `vitest enumeration failed (exit ${String(outcome.code)}): ${firstLine(outcome.stderr)} — the expected set is unavailable, never faked empty`,
106
+ tests: [],
107
+ };
108
+ }
109
+ const tests = parseVitestListing(outcome.stdout, cwd);
110
+ if (tests === null) {
111
+ return {
112
+ status: 'unavailable',
113
+ detail: 'vitest enumeration produced an unreadable JSON listing — fail closed',
114
+ tests: [],
115
+ };
116
+ }
117
+ if (tests.length === 0) {
118
+ return {
119
+ status: 'unavailable',
120
+ detail: `vitest enumerated no runnable tests under ${cwd} — a zero-test run never proves coverage`,
121
+ tests: [],
122
+ };
123
+ }
124
+ return {
125
+ status: 'discovered',
126
+ detail: `enumerated ${String(tests.length)} vitest test(s) via the project's vitest CLI`,
127
+ tests: tests.sort((a, b) => (a.logicalKey < b.logicalKey ? -1 : a.logicalKey > b.logicalKey ? 1 : 0)),
128
+ };
129
+ }
130
+ /**
131
+ * Job 2: the per-test tag. The pack's Vitest reporter spools the
132
+ * lifecycle events; the in-test helper resolves the supervisor
133
+ * session for the running test and rewrites its supertest traffic
134
+ * through that session's proxy origin.
135
+ *
136
+ * Args:
137
+ * session: the test being tagged.
138
+ * context: run-scoped, non-secret witness wiring.
139
+ *
140
+ * Returns:
141
+ * RunnerChildEnv: the run identity plus the session-scoped tag.
142
+ */
143
+ childEnv(_session, context) {
144
+ return {
145
+ vars: {
146
+ [ENV_WITNESS_URL]: context.witnessUrl,
147
+ [ENV_RUN_TOKEN]: context.runToken,
148
+ [ENV_APP_BASE_URL]: context.appBaseUrl,
149
+ [ENV_STATE_DIR]: '<run-state dir>',
150
+ [ENV_RUN_ID]: '<run id>',
151
+ [VITEST_ENV_SESSION_ID]: context.sessionId,
152
+ [VITEST_ENV_SESSION_TOKEN]: context.sessionToken,
153
+ [VITEST_ENV_SESSION_PROXY_URL]: context.sessionProxyUrl,
154
+ },
155
+ tagChannel: 'session-proxy',
156
+ identityVars: VITEST_IDENTITY_ENV,
157
+ mechanism: 'gateforge vitest reporter spools the test lifecycle and the in-test helper resolves the ' +
158
+ 'supervisor session, rewriting supertest traffic through the per-test session proxy origin',
159
+ };
160
+ }
161
+ /**
162
+ * Job 3: runs the SELECTED vitest tests under the jest-compatible
163
+ * JSON reporter plus the pack's gateforge reporter, with the
164
+ * witnessed-session env allowlist (the run identity the reporter
165
+ * needs to address the lifecycle spool plus the non-secret run
166
+ * wiring — never the verifier key, never any other parent-side name).
167
+ * A `named-selection` run adds the anchored full-name pattern so only
168
+ * the named tests execute, never their file neighbours.
169
+ *
170
+ * Args:
171
+ * request: the exact selection (with its mode), run identity, and
172
+ * wall-clock bound.
173
+ *
174
+ * Returns:
175
+ * Promise<RunnerExecutionEnvelope>: the structured outcome envelope
176
+ * (a runner exit code alone is never a gate result).
177
+ */
178
+ async execute(request) {
179
+ const entry = this.vitestEntryOf(request.cwd);
180
+ if (entry === null) {
181
+ return envelopeIncomplete(null, `vitest execution found no vitest CLI under ${request.cwd} — install vitest in the project`);
182
+ }
183
+ const files = new Set();
184
+ const fullNames = [];
185
+ for (const logicalKey of request.logicalKeys) {
186
+ const identity = vitestIdentityKeyOf(logicalKey);
187
+ if (identity === null) {
188
+ return envelopeIncomplete(null, `vitest execution cannot run '${logicalKey}': not a <file>#<title path> identity this adapter enumerated`);
189
+ }
190
+ files.add(identity.file);
191
+ fullNames.push(identity.titlePath.join(' '));
192
+ }
193
+ // A `named-selection` run executes ONLY the named tests: vitest
194
+ // matches `--testNamePattern` against the full name (enclosing
195
+ // describes + the test title), so the anchored, escaped alternation
196
+ // of exactly those names is the per-test narrowing. Every other mode
197
+ // runs the selection's files unchanged.
198
+ const namePattern = request.mode === 'named-selection' ? `^(?:${[...new Set(fullNames)].sort().map(escapeRegExp).join('|')})$` : null;
199
+ const reportPath = join(request.stateDir, 'vitest', request.runId, 'report.json');
200
+ const argv = [
201
+ 'run',
202
+ '--run',
203
+ '--reporter=json',
204
+ `--outputFile.json=${reportPath}`,
205
+ `--reporter=${vitestReporterModulePath()}`,
206
+ ...NO_CACHE_FLAG,
207
+ ...(namePattern === null ? [] : [`--testNamePattern=${namePattern}`]),
208
+ ...[...files].sort(),
209
+ ];
210
+ const child = spawn(entry.command, [...entry.prefix, ...argv], {
211
+ cwd: request.cwd,
212
+ env: buildWitnessedSessionRunnerEnv({
213
+ [ENV_WITNESS_URL]: this.options.witness?.url ?? process.env[ENV_WITNESS_URL] ?? '',
214
+ [ENV_RUN_TOKEN]: this.options.witness?.token ?? process.env[ENV_RUN_TOKEN] ?? '',
215
+ [ENV_STATE_DIR]: request.stateDir,
216
+ [ENV_RUN_ID]: request.runId,
217
+ [ENV_APP_BASE_URL]: this.options.witness?.appBaseUrl ?? process.env[ENV_APP_BASE_URL] ?? '',
218
+ // The pack reporter's end-barrier TEST SEAM, read from the
219
+ // ambient environment like the other non-secret run wiring
220
+ // above: unset in every real run, and inert when set except
221
+ // that the reporter waits for the named file before it spools
222
+ // any `testEnd` (see ../vitest/reporter.ts).
223
+ [VITEST_END_BARRIER_ENV]: process.env[VITEST_END_BARRIER_ENV] ?? '',
224
+ }, process.env),
225
+ stdio: ['ignore', 'pipe', 'pipe'],
226
+ });
227
+ const outcome = await new Promise((settle) => {
228
+ let timedOut = false;
229
+ const timer = setTimeout(() => {
230
+ timedOut = true;
231
+ child.kill('SIGKILL');
232
+ }, request.timeoutMs);
233
+ child.stdout?.resume();
234
+ child.stderr?.resume();
235
+ child.once('error', (error) => {
236
+ clearTimeout(timer);
237
+ settle({ code: null, timedOut: false, error });
238
+ });
239
+ child.once('exit', (code) => {
240
+ clearTimeout(timer);
241
+ settle({ code, timedOut, error: null });
242
+ });
243
+ });
244
+ if (outcome.error !== null) {
245
+ return envelopeIncomplete(null, `vitest execution could not start (${entry.command}): ${outcome.error.message}`);
246
+ }
247
+ if (outcome.timedOut) {
248
+ return envelopeIncomplete(null, `vitest execution exceeded its ${String(request.timeoutMs)}ms bound and was killed — an incomplete run never grades complete`);
249
+ }
250
+ let report = '';
251
+ try {
252
+ report = readFileSync(reportPath, 'utf8');
253
+ }
254
+ catch {
255
+ report = '';
256
+ }
257
+ let envelope = this.parseResults({ processExit: outcome.code, report, cwd: request.cwd });
258
+ if (!envelope.complete && report === '') {
259
+ envelope = {
260
+ ...envelope,
261
+ incompleteDetail: `vitest produced no JSON report at ${reportPath} (exit ${String(outcome.code)}) — fail closed`,
262
+ };
263
+ }
264
+ // A `named-selection` run reports the tests vitest COLLECTED in the
265
+ // selected files, not the ones it executed: the name pattern keeps
266
+ // the unselected rows (as never-run placeholders), and a test this
267
+ // run never selected is never evidence, so those rows are dropped
268
+ // here instead of being graded as unplanned executions.
269
+ if (request.mode === 'named-selection') {
270
+ const selected = new Set(request.logicalKeys);
271
+ envelope = { ...envelope, outcomes: envelope.outcomes.filter((row) => selected.has(row.logicalKey)) };
272
+ }
273
+ // Retry evidence lives in the runner-flags document the gateforge
274
+ // reporter seals (the JSON reporter has no retry surface).
275
+ const flags = this.readRunnerFlags(request.stateDir, request.runId);
276
+ if (flags !== null && flags.retriesDetected) {
277
+ envelope = {
278
+ ...envelope,
279
+ complete: false,
280
+ incompleteDetail: envelope.incompleteDetail ??
281
+ 'vitest runner-assisted retry detected (required retries are zero) — the run blocks',
282
+ retriesDetected: true,
283
+ retriesDetail: 'the gateforge vitest reporter observed retryCount > 0 for at least one test',
284
+ };
285
+ }
286
+ return envelope;
287
+ }
288
+ /**
289
+ * Job 4: the jest-compatible JSON document, strictly mapped.
290
+ *
291
+ * Args:
292
+ * raw: the JSON report text plus the runner exit status.
293
+ *
294
+ * Returns:
295
+ * RunnerExecutionEnvelope: reporter INPUT, never a verdict. An
296
+ * unreadable report, a zero-test run, and a report whose rows carry
297
+ * no attributable identity are all `complete: false`.
298
+ */
299
+ parseResults(raw) {
300
+ if (raw.report.trim() === '') {
301
+ return envelopeIncomplete(raw.processExit, 'no vitest JSON report — a missing report never proves anything');
302
+ }
303
+ let document;
304
+ try {
305
+ document = parseVitestReport(raw.report);
306
+ }
307
+ catch (error) {
308
+ return envelopeIncomplete(raw.processExit, `unparsable vitest JSON report — fail closed: ${describeError(error)}`);
309
+ }
310
+ const rows = [];
311
+ let suiteCount = 0;
312
+ const base = raw.cwd ?? process.cwd();
313
+ for (const suite of document.testResults ?? []) {
314
+ const reportedFile = typeof suite.name === 'string' ? suite.name.replace(/^file:\/\//, '') : '';
315
+ const file = reportedFile !== '' && isAbsolute(reportedFile)
316
+ ? relative(base, reportedFile).split('\\').join('/')
317
+ : reportedFile;
318
+ for (const row of suite.assertionResults ?? []) {
319
+ suiteCount += 1;
320
+ const identity = vitestIdentityOf(file, row);
321
+ if (identity !== null) {
322
+ rows.push({ identity, row, frameworkId: `${identity.file}::${identity.titlePath.join('::')}` });
323
+ }
324
+ }
325
+ }
326
+ if (suiteCount > 0 && rows.length === 0) {
327
+ return envelopeIncomplete(raw.processExit, `vitest report carries ${String(suiteCount)} row(s) with no attributable file/title identity — ` +
328
+ 'an unidentified row is never attributed to a test');
329
+ }
330
+ if ((document.numTotalTests ?? 0) === 0 && suiteCount === 0) {
331
+ return envelopeIncomplete(raw.processExit, 'vitest report covers zero tests — a zero-test run is incomplete');
332
+ }
333
+ if (suiteCount > 0 && rows.length > 0 && rows.every((entry) => entry.row.status === 'skipped')) {
334
+ return envelopeIncomplete(raw.processExit, 'vitest report ran only skipped cases — nothing executed');
335
+ }
336
+ const exitDetail = vitestExitIncompleteDetail(raw.processExit);
337
+ const outcomes = rows.map((entry) => ({
338
+ logicalKey: `${entry.identity.file}#${entry.identity.titlePath.join('>')}`,
339
+ project: null,
340
+ frameworkId: entry.frameworkId,
341
+ status: entry.row.status === 'passed' ? 'passed' : entry.row.status === 'skipped' ? 'skipped' : 'failed',
342
+ attempt: 1,
343
+ }));
344
+ if (exitDetail !== null)
345
+ return { ...envelopeIncomplete(raw.processExit, exitDetail), outcomes };
346
+ return {
347
+ processExit: raw.processExit,
348
+ complete: true,
349
+ outcomes,
350
+ fixtureOutcome: 'passed',
351
+ };
352
+ }
353
+ /**
354
+ * The runner's native parsed report (diagnostics surfaces).
355
+ *
356
+ * Args:
357
+ * raw: the JSON report text plus the runner exit status.
358
+ *
359
+ * Returns:
360
+ * VitestJsonReport | null: the parsed document, or null when the
361
+ * report is absent or unparsable (never a guess).
362
+ */
363
+ parseReport(raw) {
364
+ if (raw.report.trim() === '')
365
+ return null;
366
+ try {
367
+ return parseVitestReport(raw.report);
368
+ }
369
+ catch {
370
+ return null;
371
+ }
372
+ }
373
+ /** The runner-flags document of one run (null when absent/broken). */
374
+ readRunnerFlags(stateDir, runId) {
375
+ try {
376
+ const parsed = JSON.parse(readFileSync(join(stateDir, 'vitest', runId, RUNNER_FLAGS_FILE), 'utf8'));
377
+ return { retriesDetected: parsed.retriesDetected === true };
378
+ }
379
+ catch {
380
+ return null;
381
+ }
382
+ }
383
+ /** The vitest CLI entry for a project (local-first), or null. */
384
+ vitestEntryOf(cwd) {
385
+ if (this.options.vitestEntry !== undefined) {
386
+ return this.options.vitestEntry.endsWith('.mjs')
387
+ ? { command: process.execPath, prefix: [this.options.vitestEntry] }
388
+ : { command: this.options.vitestEntry, prefix: [] };
389
+ }
390
+ const localEntry = join(cwd, 'node_modules', 'vitest', 'vitest.mjs');
391
+ if (existsSync(localEntry))
392
+ return { command: process.execPath, prefix: [localEntry] };
393
+ return null;
394
+ }
395
+ /**
396
+ * One bounded vitest CLI invocation (stdout/stderr captured).
397
+ *
398
+ * ENUMERATION runs the CONSUMER's own vitest config, so the child
399
+ * environment is the `untrustedEnv` one: every ambient `GATEFORGE_*`
400
+ * name is stripped, which keeps the verifier key, the run token and
401
+ * the witness URL out of reach of the repository being gated. The
402
+ * ambient `GATEFORGE_REPORTER_FAIL_RUN` the old merge carried is
403
+ * stripped by the same rule, so the list child cannot be armed to
404
+ * fail a run it never reports.
405
+ */
406
+ spawnVitest(cwd, entry, args) {
407
+ return new Promise((settle) => {
408
+ let stdout = '';
409
+ let stderr = '';
410
+ let timedOut = false;
411
+ const child = spawn(entry.command, [...entry.prefix, ...args], {
412
+ cwd,
413
+ env: untrustedEnv(process.env),
414
+ stdio: ['ignore', 'pipe', 'pipe'],
415
+ });
416
+ const timer = setTimeout(() => {
417
+ timedOut = true;
418
+ child.kill('SIGKILL');
419
+ }, 120_000);
420
+ child.stdout?.on('data', (chunk) => {
421
+ stdout += chunk.toString('utf8');
422
+ });
423
+ child.stderr?.on('data', (chunk) => {
424
+ stderr += chunk.toString('utf8');
425
+ });
426
+ child.once('error', (error) => {
427
+ clearTimeout(timer);
428
+ settle({ code: null, stdout, stderr, timedOut: false, error });
429
+ });
430
+ child.once('exit', (code) => {
431
+ clearTimeout(timer);
432
+ settle({ code, stdout, stderr, timedOut, error: null });
433
+ });
434
+ });
435
+ }
436
+ }
437
+ /**
438
+ * Merges the gateforge reporter's runner-flags document into an
439
+ * envelope (retry detection is only observable from the reporter, not
440
+ * from the JSON document).
441
+ *
442
+ * Args:
443
+ * envelope: the envelope `parseResults` produced.
444
+ * flagsJson: the runner-flags document text (empty when absent).
445
+ *
446
+ * Returns:
447
+ * RunnerExecutionEnvelope: the envelope with retry evidence merged;
448
+ * a retry-detected run blocks (required retries are zero).
449
+ */
450
+ export function mergeVitestRunnerFlags(envelope, flagsJson) {
451
+ let flags;
452
+ try {
453
+ flags = JSON.parse(flagsJson);
454
+ }
455
+ catch {
456
+ return envelope;
457
+ }
458
+ if (flags.retriesDetected !== true)
459
+ return envelope;
460
+ return {
461
+ ...envelope,
462
+ complete: false,
463
+ incompleteDetail: envelope.incompleteDetail ??
464
+ 'vitest runner-assisted retry detected (required retries are zero) — the run blocks',
465
+ retriesDetected: true,
466
+ retriesDetail: 'the gateforge vitest reporter observed retryCount > 0 for at least one test',
467
+ };
468
+ }
469
+ /**
470
+ * The identity of one jest-compatible assertion row, or null when the
471
+ * row carries no attributable identity (a row without a suite file or
472
+ * a non-empty title is never attributed to a test).
473
+ */
474
+ function vitestIdentityOf(file, row) {
475
+ if (file === '' || typeof row.title !== 'string' || row.title === '')
476
+ return null;
477
+ const ancestors = Array.isArray(row.ancestorTitles)
478
+ ? row.ancestorTitles.filter((title) => typeof title === 'string')
479
+ : [];
480
+ return { file, titlePath: [...ancestors, row.title] };
481
+ }
482
+ /** Parses the `vitest list --json` document into identities. */
483
+ function parseVitestListing(stdout, cwd) {
484
+ let document;
485
+ try {
486
+ document = JSON.parse(stdout);
487
+ }
488
+ catch {
489
+ return null;
490
+ }
491
+ if (!Array.isArray(document))
492
+ return null;
493
+ const tests = [];
494
+ for (const entry of document) {
495
+ if (typeof entry !== 'object' || entry === null)
496
+ continue;
497
+ const record = entry;
498
+ if (typeof record.name !== 'string' || typeof record.file !== 'string')
499
+ continue;
500
+ const file = repoPosix(record.file);
501
+ const relativeFile = relative(cwd, file).split('\\').join('/');
502
+ const titlePath = record.name.split(' > ');
503
+ tests.push({
504
+ logicalKey: `${relativeFile}#${titlePath.join('>')}`,
505
+ project: null,
506
+ file: relativeFile,
507
+ titlePath,
508
+ blockingAnnotations: [],
509
+ // The pack reporter spools `<file>#<title path>` — registration
510
+ // must name the same id.
511
+ frameworkId: `${relativeFile}#${titlePath.join('>')}`,
512
+ });
513
+ }
514
+ return tests;
515
+ }
516
+ /** Strictly parses the jest-compatible JSON report. */
517
+ function parseVitestReport(report) {
518
+ const document = JSON.parse(report);
519
+ if (typeof document !== 'object' || document === null || Array.isArray(document)) {
520
+ throw new Error('the vitest JSON report is not an object');
521
+ }
522
+ return document;
523
+ }
524
+ /**
525
+ * The `<file>#<title path>` identity one logical key carries, or null
526
+ * when the key is not the identity this adapter enumerated (never a
527
+ * wildcard, never a guess).
528
+ *
529
+ * Args:
530
+ * logicalKey: the exact logical key of one selected test.
531
+ *
532
+ * Returns:
533
+ * TestIdentityKey | null: the file and title path, or null.
534
+ */
535
+ function vitestIdentityKeyOf(logicalKey) {
536
+ const hash = logicalKey.indexOf('#');
537
+ if (hash <= 0)
538
+ return null;
539
+ const file = logicalKey.slice(0, hash);
540
+ const titlePath = logicalKey.slice(hash + 1);
541
+ if (file === '' || titlePath === '' || titlePath.includes('#'))
542
+ return null;
543
+ return { file, titlePath: titlePath.split('>') };
544
+ }
545
+ /**
546
+ * Escapes one literal test name for use inside a regular expression, so
547
+ * a name that contains regex metacharacters matches itself and nothing
548
+ * else.
549
+ *
550
+ * Args:
551
+ * value: the literal title text.
552
+ *
553
+ * Returns:
554
+ * string: the escaped literal.
555
+ */
556
+ export function escapeRegExp(value) {
557
+ return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
558
+ }
559
+ /** Vitest exit codes, fail closed (0 passed, 1 failures). */
560
+ function vitestExitIncompleteDetail(exit) {
561
+ if (exit === null)
562
+ return 'vitest ended without an exit status — incomplete';
563
+ if (exit >= 2)
564
+ return `vitest ended with status ${String(exit)} (fatal/internal error) — incomplete`;
565
+ return null;
566
+ }
567
+ /** Single-cause incomplete envelope (no outcomes are ever invented). */
568
+ function envelopeIncomplete(processExit, detail) {
569
+ return {
570
+ processExit,
571
+ complete: false,
572
+ incompleteDetail: detail,
573
+ outcomes: [],
574
+ fixtureOutcome: 'unknown',
575
+ };
576
+ }
577
+ /** Absolute-normalizes then posix-normalizes a reported suite path. */
578
+ function repoPosix(path) {
579
+ return path.replace(/^file:\/\//, '').split('\\').join('/');
580
+ }
581
+ /** The pack's Vitest reporter module path (built JS, or the TS source). */
582
+ function vitestReporterModulePath() {
583
+ const candidates = [
584
+ // When this module runs from dist (the published/compiled layout).
585
+ fileURLToPath(new URL('../vitest/reporter.js', import.meta.url)),
586
+ // When this module runs from src (the monorepo test layout).
587
+ fileURLToPath(new URL('../../dist/vitest/reporter.js', import.meta.url)),
588
+ // Last resort: the TypeScript source, loadable by the child's
589
+ // vite-node runner.
590
+ fileURLToPath(new URL('../vitest/reporter.ts', import.meta.url)),
591
+ ];
592
+ for (const candidate of candidates) {
593
+ if (existsSync(candidate))
594
+ return candidate;
595
+ }
596
+ return candidates[0];
597
+ }
598
+ /** First non-empty line of a captured stream (bounded). */
599
+ function firstLine(text) {
600
+ const line = text.split('\n').find((candidate) => candidate.trim() !== '');
601
+ return line === undefined ? 'no output' : line.trim().slice(0, 300);
602
+ }
603
+ /** Single-line message of an unknown thrown value. */
604
+ function describeError(error) {
605
+ return error instanceof Error ? error.message : String(error);
606
+ }
607
+ //# sourceMappingURL=vitest-runner-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-runner-adapter.js","sourceRoot":"","sources":["../../src/discovery/vitest-runner-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type * as PlaywrightTest from 'playwright/test';
2
+ export declare const test: typeof PlaywrightTest.test;
3
+ export declare const expect: typeof PlaywrightTest.expect;
4
+ //# sourceMappingURL=consumer-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer-runner.d.ts","sourceRoot":"","sources":["../../src/fixture/consumer-runner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,KAAK,cAAc,MAAM,iBAAiB,CAAC;AAuCvD,eAAO,MAAM,IAAI,EAAE,OAAO,cAAc,CAAC,IAAkB,CAAC;AAC5D,eAAO,MAAM,MAAM,EAAE,OAAO,cAAc,CAAC,MAAsB,CAAC"}