codex-orchestrator 0.1.35 → 0.1.38

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 (77) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +5 -0
  3. package/dist/src/cli.js +32 -3
  4. package/dist/src/cli.js.map +1 -1
  5. package/dist/src/config/schema.d.ts +19 -1
  6. package/dist/src/config/schema.d.ts.map +1 -1
  7. package/dist/src/config/schema.js +36 -0
  8. package/dist/src/config/schema.js.map +1 -1
  9. package/dist/src/index.d.ts +1 -1
  10. package/dist/src/index.d.ts.map +1 -1
  11. package/dist/src/index.js.map +1 -1
  12. package/dist/src/review-handoff.d.ts +3 -0
  13. package/dist/src/review-handoff.d.ts.map +1 -0
  14. package/dist/src/review-handoff.js +8 -0
  15. package/dist/src/review-handoff.js.map +1 -0
  16. package/dist/src/runner/auto-visual-proof-command.d.ts +15 -0
  17. package/dist/src/runner/auto-visual-proof-command.d.ts.map +1 -0
  18. package/dist/src/runner/auto-visual-proof-command.js +41 -0
  19. package/dist/src/runner/auto-visual-proof-command.js.map +1 -0
  20. package/dist/src/runner/browser-proof-contract.d.ts +134 -0
  21. package/dist/src/runner/browser-proof-contract.d.ts.map +1 -0
  22. package/dist/src/runner/browser-proof-contract.js +400 -0
  23. package/dist/src/runner/browser-proof-contract.js.map +1 -0
  24. package/dist/src/runner/browser-visual-proof-command.d.ts +101 -0
  25. package/dist/src/runner/browser-visual-proof-command.d.ts.map +1 -0
  26. package/dist/src/runner/browser-visual-proof-command.js +532 -0
  27. package/dist/src/runner/browser-visual-proof-command.js.map +1 -0
  28. package/dist/src/runner/command-utils.d.ts.map +1 -1
  29. package/dist/src/runner/command-utils.js +8 -1
  30. package/dist/src/runner/command-utils.js.map +1 -1
  31. package/dist/src/runner/completion-report.d.ts +21 -0
  32. package/dist/src/runner/completion-report.d.ts.map +1 -1
  33. package/dist/src/runner/completion-report.js +46 -0
  34. package/dist/src/runner/completion-report.js.map +1 -1
  35. package/dist/src/runner/handoff-evidence.d.ts +12 -1
  36. package/dist/src/runner/handoff-evidence.d.ts.map +1 -1
  37. package/dist/src/runner/handoff-evidence.js +92 -0
  38. package/dist/src/runner/handoff-evidence.js.map +1 -1
  39. package/dist/src/runner/local-execution-session.d.ts.map +1 -1
  40. package/dist/src/runner/local-execution-session.js +15 -2
  41. package/dist/src/runner/local-execution-session.js.map +1 -1
  42. package/dist/src/runner/plan-auto-command.d.ts +1 -0
  43. package/dist/src/runner/plan-auto-command.d.ts.map +1 -1
  44. package/dist/src/runner/plan-auto-command.js +15 -1
  45. package/dist/src/runner/plan-auto-command.js.map +1 -1
  46. package/dist/src/runner/prompt.d.ts.map +1 -1
  47. package/dist/src/runner/prompt.js +20 -3
  48. package/dist/src/runner/prompt.js.map +1 -1
  49. package/dist/src/runner/review-gate-policy.d.ts +12 -0
  50. package/dist/src/runner/review-gate-policy.d.ts.map +1 -1
  51. package/dist/src/runner/review-gate-policy.js +37 -2
  52. package/dist/src/runner/review-gate-policy.js.map +1 -1
  53. package/dist/src/runner/review-gates.d.ts +5 -0
  54. package/dist/src/runner/review-gates.d.ts.map +1 -1
  55. package/dist/src/runner/review-gates.js +113 -1
  56. package/dist/src/runner/review-gates.js.map +1 -1
  57. package/dist/src/runner/rework-policy.d.ts.map +1 -1
  58. package/dist/src/runner/rework-policy.js +1 -0
  59. package/dist/src/runner/rework-policy.js.map +1 -1
  60. package/dist/src/runner/scoped-auto-command.d.ts.map +1 -1
  61. package/dist/src/runner/scoped-auto-command.js +2 -0
  62. package/dist/src/runner/scoped-auto-command.js.map +1 -1
  63. package/dist/src/runner/visual-proof-runner.d.ts.map +1 -1
  64. package/dist/src/runner/visual-proof-runner.js +15 -4
  65. package/dist/src/runner/visual-proof-runner.js.map +1 -1
  66. package/dist/src/setup/project-config.d.ts +2 -0
  67. package/dist/src/setup/project-config.d.ts.map +1 -1
  68. package/dist/src/setup/project-config.js +31 -4
  69. package/dist/src/setup/project-config.js.map +1 -1
  70. package/docs/deep-dive.md +56 -4
  71. package/package.json +4 -1
  72. package/prompts/workflows/acceptance-proof.md +4 -0
  73. package/prompts/workflows/breakdown-review.md +2 -1
  74. package/prompts/workflows/issue-breakdown.md +21 -0
  75. package/prompts/workflows/issue-tree-orchestration.md +21 -15
  76. package/prompts/workflows/prd.md +11 -0
  77. package/prompts/workflows/scoped-implementation.md +27 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-visual-proof-command.d.ts","sourceRoot":"","sources":["../../../src/runner/browser-visual-proof-command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,532 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { existsSync } from 'node:fs';
3
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
4
+ import { createRequire } from 'node:module';
5
+ import { homedir } from 'node:os';
6
+ import { delimiter, dirname, isAbsolute, join, relative, resolve } from 'node:path';
7
+ import { assembleBlockedBrowserProofReport, assembleBrowserAcceptanceProofReport, assertBrowserProofArtifactPath, browserProofArtifactPath, browserProofRuntimeEnv, validateBrowserProofScenario, } from './browser-proof-contract.js';
8
+ const require = createRequire(import.meta.url);
9
+ export function parseBrowserVisualProofArgs(args, env = process.env) {
10
+ const parsed = {
11
+ issueNumber: Number(env.CODEX_ORCHESTRATOR_ISSUE_NUMBER),
12
+ worktreePath: env.CODEX_ORCHESTRATOR_WORKTREE_PATH ?? process.cwd(),
13
+ artifactDir: env.CODEX_ORCHESTRATOR_ARTIFACT_DIR,
14
+ scenarioPath: env.CODEX_ORCHESTRATOR_BROWSER_PROOF_SCENARIO_PATH,
15
+ baseUrl: env.CODEX_ORCHESTRATOR_BROWSER_BASE_URL,
16
+ envPassthrough: envListFromEnv(env.CODEX_ORCHESTRATOR_BROWSER_ENV_PASSTHROUGH),
17
+ strictConsoleErrors: booleanFromEnv(env.CODEX_ORCHESTRATOR_BROWSER_STRICT_CONSOLE),
18
+ strictNetworkFailures: booleanFromEnv(env.CODEX_ORCHESTRATOR_BROWSER_STRICT_NETWORK),
19
+ };
20
+ for (let index = 0; index < args.length; index += 1) {
21
+ const arg = args[index];
22
+ const next = () => {
23
+ const value = args[index + 1];
24
+ if (!value || value.startsWith('--'))
25
+ return undefined;
26
+ index += 1;
27
+ return value;
28
+ };
29
+ switch (arg) {
30
+ case '--issue': {
31
+ const value = next();
32
+ if (!value || !Number.isInteger(Number(value)) || Number(value) < 1) {
33
+ return { ok: false, error: 'visual-proof browser requires --issue <number>' };
34
+ }
35
+ parsed.issueNumber = Number(value);
36
+ break;
37
+ }
38
+ case '--target':
39
+ case '--worktree': {
40
+ const value = next();
41
+ if (!value)
42
+ return { ok: false, error: `${arg} requires a value` };
43
+ parsed.worktreePath = value;
44
+ break;
45
+ }
46
+ case '--artifact-dir': {
47
+ const value = next();
48
+ if (!value)
49
+ return { ok: false, error: `${arg} requires a value` };
50
+ parsed.artifactDir = value;
51
+ break;
52
+ }
53
+ case '--scenario': {
54
+ const value = next();
55
+ if (!value)
56
+ return { ok: false, error: `${arg} requires a value` };
57
+ parsed.scenarioPath = value;
58
+ break;
59
+ }
60
+ case '--base-url': {
61
+ const value = next();
62
+ if (!value)
63
+ return { ok: false, error: `${arg} requires a value` };
64
+ parsed.baseUrl = value;
65
+ break;
66
+ }
67
+ case '--strict-console':
68
+ parsed.strictConsoleErrors = true;
69
+ break;
70
+ case '--strict-network':
71
+ parsed.strictNetworkFailures = true;
72
+ break;
73
+ default:
74
+ return { ok: false, error: `Unknown visual-proof browser option: ${arg ?? ''}` };
75
+ }
76
+ }
77
+ if (!Number.isInteger(parsed.issueNumber) || parsed.issueNumber < 1) {
78
+ return { ok: false, error: 'visual-proof browser requires --issue <number>' };
79
+ }
80
+ return { ok: true, value: parsed };
81
+ }
82
+ export async function runBrowserVisualProofCommand(input) {
83
+ const env = input.env ?? process.env;
84
+ const issueNumber = input.issueNumber;
85
+ const worktreePath = resolve(input.worktreePath ?? env.CODEX_ORCHESTRATOR_WORKTREE_PATH ?? process.cwd());
86
+ const artifactDir = input.artifactDir ?? env.CODEX_ORCHESTRATOR_ARTIFACT_DIR ?? '.codex-orchestrator/proofs';
87
+ const proofDir = resolve(worktreePath, artifactDir, `issue-${issueNumber}`);
88
+ const reportPath = env[browserProofRuntimeEnv.reportPath] ?? join(proofDir, 'acceptance-proof-report.json');
89
+ const scenarioPath = input.scenarioPath
90
+ ? resolve(worktreePath, input.scenarioPath)
91
+ : join(proofDir, 'browser-proof-scenario.json');
92
+ const envPassthrough = input.envPassthrough ?? envListFromEnv(env.CODEX_ORCHESTRATOR_BROWSER_ENV_PASSTHROUGH) ?? [];
93
+ await mkdir(proofDir, { recursive: true });
94
+ const scenarioGuard = validateScenarioPath(scenarioPath, proofDir);
95
+ if (!scenarioGuard.ok) {
96
+ const report = assembleBlockedBrowserProofReport({
97
+ issueNumber,
98
+ artifactDir,
99
+ issue: {
100
+ kind: 'invalidScenario',
101
+ diagnostic: scenarioGuard.error,
102
+ requiredChanges: [scenarioGuard.error],
103
+ },
104
+ });
105
+ await writeReportWithDiagnostics(worktreePath, reportPath, report, { kind: 'invalidScenario', diagnostic: scenarioGuard.error });
106
+ return { status: 'blocked', reportPath };
107
+ }
108
+ const loaded = await loadScenario(scenarioPath, input.baseUrl);
109
+ if (!loaded.ok) {
110
+ const report = assembleBlockedBrowserProofReport({
111
+ issueNumber,
112
+ artifactDir,
113
+ issue: {
114
+ kind: 'invalidScenario',
115
+ diagnostic: loaded.error,
116
+ requiredChanges: [loaded.error],
117
+ },
118
+ });
119
+ await writeReportWithDiagnostics(worktreePath, reportPath, report, { kind: 'invalidScenario', diagnostic: loaded.error });
120
+ return { status: 'blocked', reportPath };
121
+ }
122
+ const validated = validateBrowserProofScenario(loaded.scenario, {
123
+ artifactDir,
124
+ issueNumber,
125
+ envPassthrough,
126
+ });
127
+ if (!validated.ok) {
128
+ const diagnostic = validated.errors.join('; ');
129
+ const report = assembleBlockedBrowserProofReport({
130
+ issueNumber,
131
+ artifactDir,
132
+ issue: {
133
+ kind: 'invalidScenario',
134
+ diagnostic,
135
+ requiredChanges: validated.errors,
136
+ },
137
+ });
138
+ await writeReportWithDiagnostics(worktreePath, reportPath, report, { kind: 'invalidScenario', diagnostic });
139
+ return { status: 'blocked', reportPath };
140
+ }
141
+ try {
142
+ const runtimeDirs = await ensureBrowserRuntimeDirs(env);
143
+ if (!runtimeDirs.ok) {
144
+ const report = assembleBlockedBrowserProofReport({
145
+ issueNumber,
146
+ artifactDir,
147
+ scenario: validated.scenario,
148
+ issue: {
149
+ kind: runtimeDirs.kind,
150
+ diagnostic: runtimeDirs.error,
151
+ requiredChanges: [runtimeDirs.error],
152
+ },
153
+ });
154
+ await writeReportWithDiagnostics(worktreePath, reportPath, report, { kind: runtimeDirs.kind, diagnostic: runtimeDirs.error });
155
+ return { status: 'blocked', reportPath };
156
+ }
157
+ const adapter = input.adapter ?? defaultBrowserProofAdapter();
158
+ const run = await adapter.run({ scenario: validated.scenario, worktreePath, proofDir, artifactDir, issueNumber, env });
159
+ const strictBlockers = [
160
+ ...(input.strictConsoleErrors && run.consoleErrors.length > 0 ? [`Console errors: ${run.consoleErrors.join('; ')}`] : []),
161
+ ...(input.strictNetworkFailures && run.networkFailures.length > 0 ? [`Network failures: ${run.networkFailures.join('; ')}`] : []),
162
+ ];
163
+ if (strictBlockers.length > 0) {
164
+ const strictKind = run.consoleErrors.length > 0 ? 'consoleErrors' : 'networkFailures';
165
+ const report = assembleBlockedBrowserProofReport({
166
+ issueNumber,
167
+ artifactDir,
168
+ scenario: validated.scenario,
169
+ issue: {
170
+ kind: strictKind,
171
+ diagnostic: strictBlockers.join('; '),
172
+ requiredChanges: strictBlockers,
173
+ },
174
+ diagnostics: run.diagnostics,
175
+ });
176
+ await writeReportWithDiagnostics(worktreePath, reportPath, report, { kind: strictKind, diagnostic: strictBlockers.join('; ') });
177
+ return { status: 'blocked', reportPath };
178
+ }
179
+ const report = assembleBrowserAcceptanceProofReport({
180
+ issueNumber,
181
+ artifactDir,
182
+ scenario: validated.scenario,
183
+ checkpoints: run.checkpoints,
184
+ diagnostics: run.diagnostics,
185
+ workflow: workflowFromScenario(validated.scenario),
186
+ layoutFindings: ['Browser proof reviewed layout-relevant viewport artifacts.'],
187
+ copyFindings: ['Browser proof reviewed visible text through DOM and screenshot artifacts.'],
188
+ });
189
+ await writeJson(reportPath, report);
190
+ return { status: 'passed', reportPath };
191
+ }
192
+ catch (error) {
193
+ const message = error instanceof Error ? error.message : 'browser proof failed';
194
+ const assertion = error instanceof Error && 'code' in error && error.code === 'ASSERTION_FAILED';
195
+ if (assertion) {
196
+ const report = needsReworkReport(issueNumber, artifactDir, validated.scenario, message);
197
+ await writeJson(reportPath, report);
198
+ return { status: 'needs-rework', reportPath };
199
+ }
200
+ const report = assembleBlockedBrowserProofReport({
201
+ issueNumber,
202
+ artifactDir,
203
+ scenario: validated.scenario,
204
+ issue: {
205
+ kind: /playwright/iu.test(message) ? 'playwrightPackage' : 'browserBinary',
206
+ diagnostic: message,
207
+ requiredChanges: [message],
208
+ },
209
+ });
210
+ await writeReportWithDiagnostics(worktreePath, reportPath, report, { kind: 'browserBinary', diagnostic: message });
211
+ return { status: 'blocked', reportPath };
212
+ }
213
+ }
214
+ export function createDefaultBrowserProofAdapterForTest(runtime) {
215
+ if ('chromium' in runtime) {
216
+ return defaultBrowserProofAdapter({ playwright: runtime });
217
+ }
218
+ return defaultBrowserProofAdapter(runtime);
219
+ }
220
+ function defaultBrowserProofAdapter(runtime = {}) {
221
+ return {
222
+ async run(input) {
223
+ const moduleName = 'playwright-core';
224
+ const playwright = runtime.playwright ?? await import(moduleName);
225
+ if (!playwright.chromium) {
226
+ throw new Error('Playwright chromium runtime is unavailable.');
227
+ }
228
+ const profileDir = input.env[browserProofRuntimeEnv.playwrightProfileDir] ?? join(input.proofDir, 'playwright-profile');
229
+ const executablePath = input.env[browserProofRuntimeEnv.browserExecutablePath]
230
+ ?? firstExistingPath(runtime.installedBrowserPaths ?? installedBrowserExecutableCandidates(input.env));
231
+ let chromiumInstallAttempted = false;
232
+ const context = await launchBrowserContext({
233
+ chromium: playwright.chromium,
234
+ profileDir,
235
+ executablePath,
236
+ env: input.env,
237
+ installChromium: async (installEnv) => {
238
+ chromiumInstallAttempted = true;
239
+ await (runtime.installChromium ?? installPlaywrightChromium)(installEnv);
240
+ },
241
+ });
242
+ const page = await context.newPage();
243
+ const consoleErrors = [];
244
+ const networkFailures = [];
245
+ page.on('console', (message) => {
246
+ if (message.type() === 'error')
247
+ consoleErrors.push(message.text());
248
+ });
249
+ page.on('requestfailed', (request) => {
250
+ networkFailures.push(`${request.method()} ${request.url()} ${request.failure()?.errorText ?? ''}`.trim());
251
+ });
252
+ const checkpoints = [];
253
+ try {
254
+ for (const viewport of input.scenario.viewports) {
255
+ await page.setViewportSize({ width: viewport.width, height: viewport.height });
256
+ for (const step of input.scenario.steps) {
257
+ await runBrowserStep(page, input.scenario.baseUrl, step, input, checkpoints);
258
+ }
259
+ }
260
+ }
261
+ finally {
262
+ await context.close();
263
+ }
264
+ const browserRuntime = { executablePath, chromiumInstallAttempted };
265
+ const diagnostics = await writeBrowserDiagnostics(input, consoleErrors, networkFailures, browserRuntime);
266
+ return { checkpoints, diagnostics, consoleErrors, networkFailures, browserRuntime };
267
+ },
268
+ };
269
+ }
270
+ async function launchBrowserContext(input) {
271
+ try {
272
+ return await input.chromium.launchPersistentContext(input.profileDir, {
273
+ headless: true,
274
+ ...(input.executablePath ? { executablePath: input.executablePath } : {}),
275
+ });
276
+ }
277
+ catch (error) {
278
+ if (input.executablePath || !isMissingPlaywrightBrowser(error)) {
279
+ throw error;
280
+ }
281
+ await input.installChromium(input.env);
282
+ return input.chromium.launchPersistentContext(input.profileDir, { headless: true });
283
+ }
284
+ }
285
+ function installedBrowserExecutableCandidates(env) {
286
+ return [
287
+ ...macBrowserExecutableCandidates(),
288
+ ...linuxBrowserExecutableCandidates(env),
289
+ ...windowsBrowserExecutableCandidates(env),
290
+ ];
291
+ }
292
+ function macBrowserExecutableCandidates() {
293
+ return [
294
+ '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
295
+ join(homedir(), 'Applications/Google Chrome.app/Contents/MacOS/Google Chrome'),
296
+ '/Applications/Chromium.app/Contents/MacOS/Chromium',
297
+ join(homedir(), 'Applications/Chromium.app/Contents/MacOS/Chromium'),
298
+ '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge',
299
+ join(homedir(), 'Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge'),
300
+ ];
301
+ }
302
+ function linuxBrowserExecutableCandidates(env) {
303
+ return [
304
+ findExecutableOnPath('google-chrome-stable', env),
305
+ findExecutableOnPath('google-chrome', env),
306
+ findExecutableOnPath('chromium', env),
307
+ findExecutableOnPath('chromium-browser', env),
308
+ findExecutableOnPath('microsoft-edge', env),
309
+ findExecutableOnPath('microsoft-edge-stable', env),
310
+ ].filter((path) => Boolean(path));
311
+ }
312
+ function windowsBrowserExecutableCandidates(env) {
313
+ return [
314
+ env.LOCALAPPDATA ? join(env.LOCALAPPDATA, 'Google', 'Chrome', 'Application', 'chrome.exe') : undefined,
315
+ env.PROGRAMFILES ? join(env.PROGRAMFILES, 'Google', 'Chrome', 'Application', 'chrome.exe') : undefined,
316
+ env['PROGRAMFILES(X86)'] ? join(env['PROGRAMFILES(X86)'], 'Google', 'Chrome', 'Application', 'chrome.exe') : undefined,
317
+ env.LOCALAPPDATA ? join(env.LOCALAPPDATA, 'Microsoft', 'Edge', 'Application', 'msedge.exe') : undefined,
318
+ env.PROGRAMFILES ? join(env.PROGRAMFILES, 'Microsoft', 'Edge', 'Application', 'msedge.exe') : undefined,
319
+ env['PROGRAMFILES(X86)'] ? join(env['PROGRAMFILES(X86)'], 'Microsoft', 'Edge', 'Application', 'msedge.exe') : undefined,
320
+ ].filter((path) => Boolean(path));
321
+ }
322
+ function findExecutableOnPath(command, env) {
323
+ const pathEntries = (env.PATH ?? '').split(delimiter).filter(Boolean);
324
+ const extensions = process.platform === 'win32'
325
+ ? (env.PATHEXT ?? '.EXE;.CMD;.BAT;.COM').split(';')
326
+ : [''];
327
+ for (const pathEntry of pathEntries) {
328
+ for (const extension of extensions) {
329
+ const candidate = join(pathEntry, `${command}${extension}`);
330
+ if (existsSync(candidate))
331
+ return candidate;
332
+ }
333
+ }
334
+ return undefined;
335
+ }
336
+ function firstExistingPath(paths) {
337
+ return paths.find((path) => existsSync(path));
338
+ }
339
+ function isMissingPlaywrightBrowser(error) {
340
+ const message = error instanceof Error ? error.message : String(error);
341
+ return /Executable doesn't exist/iu.test(message)
342
+ || /run (?:the following command to )?download new browsers/iu.test(message)
343
+ || /playwright install/iu.test(message);
344
+ }
345
+ async function installPlaywrightChromium(env) {
346
+ const cliPath = require.resolve('playwright-core/cli.js');
347
+ await new Promise((resolvePromise, reject) => {
348
+ execFile(process.execPath, [cliPath, 'install', 'chromium'], { env: { ...process.env, ...env } }, (error, stdout, stderr) => {
349
+ if (error) {
350
+ reject(new Error(`Playwright Chromium install failed: ${error.message}\n${stderr}\n${stdout}`.trim()));
351
+ return;
352
+ }
353
+ resolvePromise();
354
+ });
355
+ });
356
+ }
357
+ async function runBrowserStep(page, baseUrl, step, input, checkpoints) {
358
+ switch (step.action) {
359
+ case 'navigate':
360
+ await page.goto(step.url ?? new URL(step.path ?? '/', baseUrl).toString());
361
+ break;
362
+ case 'click':
363
+ if (step.selector)
364
+ await page.click(step.selector);
365
+ else
366
+ await page.getByText(step.text ?? '').click();
367
+ break;
368
+ case 'fill':
369
+ await page.fill(step.selector, step.value);
370
+ break;
371
+ case 'press':
372
+ await page.press(step.selector, step.key);
373
+ break;
374
+ case 'waitForSelector':
375
+ await page.waitForSelector(step.selector);
376
+ break;
377
+ case 'waitForText':
378
+ await page.getByText(step.text).waitFor();
379
+ break;
380
+ case 'assertText': {
381
+ const text = step.selector ? await page.locator(step.selector).textContent() : step.text;
382
+ if (!text?.includes(step.text))
383
+ throw assertionError(`Expected text ${step.text} was missing`);
384
+ break;
385
+ }
386
+ case 'assertUrl':
387
+ if (!page.url().includes(step.expected))
388
+ throw assertionError(`Expected URL ${step.expected} but got ${page.url()}`);
389
+ break;
390
+ case 'screenshot':
391
+ await mkdir(dirname(browserProofArtifactFilePath(input.worktreePath, step.path, input.artifactDir, input.issueNumber)), { recursive: true });
392
+ await page.screenshot({ path: browserProofArtifactFilePath(input.worktreePath, step.path, input.artifactDir, input.issueNumber), fullPage: true });
393
+ checkpoints.push({ ...step, kind: 'screenshot', description: `Browser screenshot ${step.checkpointId}` });
394
+ break;
395
+ case 'domSnapshot': {
396
+ const html = await page.locator('body').evaluate((element) => element.outerHTML);
397
+ await mkdir(dirname(browserProofArtifactFilePath(input.worktreePath, step.path, input.artifactDir, input.issueNumber)), { recursive: true });
398
+ await writeFile(browserProofArtifactFilePath(input.worktreePath, step.path, input.artifactDir, input.issueNumber), html, 'utf8');
399
+ checkpoints.push({ ...step, kind: 'domSnapshot', description: `Browser DOM snapshot ${step.checkpointId}` });
400
+ break;
401
+ }
402
+ }
403
+ }
404
+ async function writeBrowserDiagnostics(input, consoleErrors, networkFailures, browserRuntime) {
405
+ const consoleLogRef = browserProofArtifactPath(input.artifactDir, input.issueNumber, 'console.log');
406
+ const networkLogRef = browserProofArtifactPath(input.artifactDir, input.issueNumber, 'network.log');
407
+ const runSummaryRef = browserProofArtifactPath(input.artifactDir, input.issueNumber, 'browser-summary.json');
408
+ const consoleLogPath = browserProofArtifactFilePath(input.worktreePath, consoleLogRef, input.artifactDir, input.issueNumber);
409
+ const networkLogPath = browserProofArtifactFilePath(input.worktreePath, networkLogRef, input.artifactDir, input.issueNumber);
410
+ const runSummaryPath = browserProofArtifactFilePath(input.worktreePath, runSummaryRef, input.artifactDir, input.issueNumber);
411
+ await writeFile(consoleLogPath, consoleErrors.join('\n'), 'utf8');
412
+ await writeFile(networkLogPath, networkFailures.join('\n'), 'utf8');
413
+ await writeFile(runSummaryPath, JSON.stringify({
414
+ status: 'completed',
415
+ steps: input.scenario.steps.length,
416
+ browserRuntime: browserRuntime
417
+ ? {
418
+ executablePath: browserRuntime.executablePath ?? null,
419
+ chromiumInstallAttempted: browserRuntime.chromiumInstallAttempted,
420
+ }
421
+ : undefined,
422
+ }, null, 2), 'utf8');
423
+ return {
424
+ consoleLogPath: consoleLogRef,
425
+ networkLogPath: networkLogRef,
426
+ runSummaryPath: runSummaryRef,
427
+ };
428
+ }
429
+ function needsReworkReport(issueNumber, artifactDir, scenario, message) {
430
+ const diagnosticPath = `${artifactDir}/issue-${issueNumber}/browser-proof-diagnostics.json`;
431
+ return {
432
+ status: 'needs-rework',
433
+ criteria: scenario.criteria.map((criterion) => ({
434
+ id: criterion.id,
435
+ description: criterion.description,
436
+ status: 'failed',
437
+ confidence: 'high',
438
+ reasoningSummary: message,
439
+ artifactRefs: [diagnosticPath],
440
+ })),
441
+ artifacts: [{ type: 'log', path: diagnosticPath, description: 'Browser assertion failure' }],
442
+ proofPhaseDiff: { allowedProofPaths: [diagnosticPath], forbiddenProductPaths: [] },
443
+ reworkRequest: {
444
+ summary: message,
445
+ requiredChanges: [message],
446
+ evidenceRefs: [diagnosticPath],
447
+ },
448
+ residualRisks: [],
449
+ };
450
+ }
451
+ async function loadScenario(path, baseUrl) {
452
+ try {
453
+ const scenario = JSON.parse(await readFile(path, 'utf8'));
454
+ return { ok: true, scenario: baseUrl ? { ...scenario, baseUrl } : scenario };
455
+ }
456
+ catch (error) {
457
+ const message = error instanceof Error && 'code' in error && error.code === 'ENOENT'
458
+ ? `Browser proof scenario file was not found: ${path}`
459
+ : `Browser proof scenario is malformed: ${error instanceof Error ? error.message : String(error)}`;
460
+ return { ok: false, error: message };
461
+ }
462
+ }
463
+ function validateScenarioPath(path, proofDir) {
464
+ const resolvedPath = resolve(path);
465
+ const resolvedProofDir = resolve(proofDir);
466
+ const relativePath = relative(resolvedProofDir, resolvedPath);
467
+ const name = resolvedPath.split('/').at(-1) ?? '';
468
+ if (name === '.env' || name.startsWith('.env.')) {
469
+ return { ok: false, error: `Browser proof scenario path must not reference a secret file: ${path}` };
470
+ }
471
+ if (relativePath.length === 0 || relativePath.startsWith('..') || isAbsolute(relativePath)) {
472
+ return { ok: false, error: `Browser proof scenario path must stay under the proof directory: ${path}` };
473
+ }
474
+ return { ok: true };
475
+ }
476
+ async function ensureBrowserRuntimeDirs(env) {
477
+ const dirs = [
478
+ { kind: 'profileDir', path: env[browserProofRuntimeEnv.playwrightProfileDir] },
479
+ { kind: 'cacheDir', path: env[browserProofRuntimeEnv.browserCacheDir] },
480
+ ];
481
+ for (const dir of dirs) {
482
+ if (!dir.path)
483
+ continue;
484
+ try {
485
+ await mkdir(dir.path, { recursive: true });
486
+ }
487
+ catch (error) {
488
+ return {
489
+ ok: false,
490
+ kind: dir.kind,
491
+ error: `Browser proof could not prepare ${dir.kind}: ${error instanceof Error ? error.message : String(error)}`,
492
+ };
493
+ }
494
+ }
495
+ return { ok: true };
496
+ }
497
+ function browserProofArtifactFilePath(worktreePath, artifactPath, artifactDir, issueNumber) {
498
+ return resolve(worktreePath, assertBrowserProofArtifactPath(artifactPath, artifactDir, issueNumber));
499
+ }
500
+ function workflowFromScenario(scenario) {
501
+ return {
502
+ entrypoint: scenario.baseUrl,
503
+ path: scenario.steps.map((step) => step.action),
504
+ screenState: 'Browser proof scenario completed with mapped checkpoint evidence.',
505
+ };
506
+ }
507
+ async function writeReportWithDiagnostics(worktreePath, reportPath, report, diagnostic) {
508
+ const diagnosticPath = report.artifacts[0]?.path;
509
+ if (diagnosticPath) {
510
+ await mkdir(dirname(join(worktreePath, diagnosticPath)), { recursive: true });
511
+ await writeFile(join(worktreePath, diagnosticPath), JSON.stringify(diagnostic, null, 2), 'utf8');
512
+ }
513
+ await writeJson(reportPath, report);
514
+ }
515
+ async function writeJson(path, value) {
516
+ await mkdir(dirname(path), { recursive: true });
517
+ await writeFile(path, `${JSON.stringify(value, null, 2)}\n`, 'utf8');
518
+ }
519
+ function assertionError(message) {
520
+ return Object.assign(new Error(message), { code: 'ASSERTION_FAILED' });
521
+ }
522
+ function booleanFromEnv(value) {
523
+ if (value === undefined)
524
+ return undefined;
525
+ return /^(?:1|true|yes)$/iu.test(value);
526
+ }
527
+ function envListFromEnv(value) {
528
+ if (!value)
529
+ return undefined;
530
+ return value.split(/[,\n]/u).map((entry) => entry.trim()).filter(Boolean);
531
+ }
532
+ //# sourceMappingURL=browser-visual-proof-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser-visual-proof-command.js","sourceRoot":"","sources":["../../../src/runner/browser-visual-proof-command.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"command-utils.d.ts","sourceRoot":"","sources":["../../../src/runner/command-utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAa3F;AAmED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEpD;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,sBAAsB,CAAC,WAAW,CAAC,EAC7C,SAAS,EAAE,sBAAsB,CAAC,WAAW,CAAC,GAC7C,sBAAsB,CAAC,WAAW,CAAC,CAYrC;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,uBAAuB,EAC/B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,oBAAoB,EACnC,gBAAgB,EAAE,oBAAoB,EAAE,EACxC,YAAY,GAAE,MAAM,EAAO,GAC1B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA4DjC"}
1
+ {"version":3,"file":"command-utils.d.ts","sourceRoot":"","sources":["../../../src/runner/command-utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAOlE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAa3F;AA0ED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAEpD;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,IAAI,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,sBAAsB,CAAC,WAAW,CAAC,EAC7C,SAAS,EAAE,sBAAsB,CAAC,WAAW,CAAC,GAC7C,sBAAsB,CAAC,WAAW,CAAC,CAYrC;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,uBAAuB,EAC/B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,oBAAoB,EACnC,gBAAgB,EAAE,oBAAoB,EAAE,EACxC,YAAY,GAAE,MAAM,EAAO,GAC1B,OAAO,CAAC,oBAAoB,EAAE,CAAC,CA4DjC"}
@@ -1,6 +1,6 @@
1
1
  import { readFile } from 'node:fs/promises';
2
2
  import { validateConfig } from '../config/schema.js';
3
- import { applyTargetPackageConfigDefaults, defaultAcceptanceProofConfig, projectConfigPath } from '../setup/project-config.js';
3
+ import { applyTargetPackageConfigDefaults, defaultAcceptanceProofConfig, defaultRiskRoutingConfig, projectConfigPath, } from '../setup/project-config.js';
4
4
  export async function readRunnerConfig(targetRoot) {
5
5
  const content = await readFile(projectConfigPath(targetRoot), 'utf8');
6
6
  const withDefaults = withRuntimeConfigDefaults(JSON.parse(content));
@@ -33,6 +33,9 @@ function withRuntimeConfigDefaults(value) {
33
33
  const acceptanceProof = typeof reviewGates?.acceptanceProof === 'object' && reviewGates.acceptanceProof !== null && !Array.isArray(reviewGates.acceptanceProof)
34
34
  ? reviewGates.acceptanceProof
35
35
  : undefined;
36
+ const riskRouting = typeof reviewGates?.riskRouting === 'object' && reviewGates.riskRouting !== null && !Array.isArray(reviewGates.riskRouting)
37
+ ? reviewGates.riskRouting
38
+ : undefined;
36
39
  const defaultAcceptanceProof = defaultAcceptanceProofConfig();
37
40
  const loopPolicy = typeof root.loopPolicy === 'object' && root.loopPolicy !== null && !Array.isArray(root.loopPolicy)
38
41
  ? root.loopPolicy
@@ -63,6 +66,10 @@ function withRuntimeConfigDefaults(value) {
63
66
  runnerTimeoutMs: visualProof?.runnerTimeoutMs,
64
67
  envPassthrough: visualProof?.envPassthrough ?? defaultAcceptanceProof.envPassthrough,
65
68
  },
69
+ riskRouting: {
70
+ ...defaultRiskRoutingConfig(),
71
+ ...riskRouting,
72
+ },
66
73
  },
67
74
  }
68
75
  : {}),