devharness 0.9.15 → 0.9.17

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 (52) hide show
  1. package/build/github/issue-body.d.ts +4 -4
  2. package/build/helpers/env-file.d.ts +35 -0
  3. package/build/helpers/env-file.d.ts.map +1 -0
  4. package/build/helpers/env-file.js +53 -0
  5. package/build/helpers/env-file.js.map +1 -0
  6. package/build/tools/interpolation.d.ts +20 -3
  7. package/build/tools/interpolation.d.ts.map +1 -1
  8. package/build/tools/interpolation.js +52 -14
  9. package/build/tools/interpolation.js.map +1 -1
  10. package/build/tools/replay-env-file.test.d.ts +2 -0
  11. package/build/tools/replay-env-file.test.d.ts.map +1 -0
  12. package/build/tools/replay-env-file.test.js +137 -0
  13. package/build/tools/replay-env-file.test.js.map +1 -0
  14. package/build/tools/replay-env-token.test.d.ts +2 -0
  15. package/build/tools/replay-env-token.test.d.ts.map +1 -0
  16. package/build/tools/replay-env-token.test.js +113 -0
  17. package/build/tools/replay-env-token.test.js.map +1 -0
  18. package/build/tools/replay-executor.d.ts +27 -0
  19. package/build/tools/replay-executor.d.ts.map +1 -1
  20. package/build/tools/replay-executor.js +25 -7
  21. package/build/tools/replay-executor.js.map +1 -1
  22. package/build/tools/replay-nested-rebase.test.d.ts +15 -0
  23. package/build/tools/replay-nested-rebase.test.d.ts.map +1 -0
  24. package/build/tools/replay-nested-rebase.test.js +139 -0
  25. package/build/tools/replay-nested-rebase.test.js.map +1 -0
  26. package/build/tools/replay-nested-variables.test.d.ts +2 -0
  27. package/build/tools/replay-nested-variables.test.d.ts.map +1 -0
  28. package/build/tools/replay-nested-variables.test.js +139 -0
  29. package/build/tools/replay-nested-variables.test.js.map +1 -0
  30. package/build/tools/replay-rebase.test.js +25 -0
  31. package/build/tools/replay-rebase.test.js.map +1 -1
  32. package/build/tools/replay-run-all-parity.test.d.ts +2 -0
  33. package/build/tools/replay-run-all-parity.test.d.ts.map +1 -0
  34. package/build/tools/replay-run-all-parity.test.js +90 -0
  35. package/build/tools/replay-run-all-parity.test.js.map +1 -0
  36. package/build/tools/replay-tools.d.ts +25 -21
  37. package/build/tools/replay-tools.d.ts.map +1 -1
  38. package/build/tools/replay-tools.js +202 -14
  39. package/build/tools/replay-tools.js.map +1 -1
  40. package/build/tools/replay-typed-text-variables.test.d.ts +2 -0
  41. package/build/tools/replay-typed-text-variables.test.d.ts.map +1 -0
  42. package/build/tools/replay-typed-text-variables.test.js +119 -0
  43. package/build/tools/replay-typed-text-variables.test.js.map +1 -0
  44. package/build/tools/replay-variable-key-validation.test.d.ts +2 -0
  45. package/build/tools/replay-variable-key-validation.test.d.ts.map +1 -0
  46. package/build/tools/replay-variable-key-validation.test.js +124 -0
  47. package/build/tools/replay-variable-key-validation.test.js.map +1 -0
  48. package/docs/instructions.md +5 -2
  49. package/docs/replay.md +99 -6
  50. package/package.json +1 -1
  51. package/plugin/skills/devharness/SKILL.md +2 -2
  52. package/plugin/skills/devharness/references/sequences.md +33 -3
@@ -0,0 +1,139 @@
1
+ /**
2
+ * `baseUrl` must reach a sequence's nested sequences, not just its own steps.
3
+ *
4
+ * handleRun rebases the sequence it loaded. A `conditional`'s `then` and a
5
+ * `forEach`'s `do` are loaded later, from the recorder, in their recorded
6
+ * form - so before this the parent ran against the target deployment while
7
+ * the helper that logs in or navigates ran against the recorded one, and a
8
+ * retargeted run drove two origins at once. runAll is where that bites: a
9
+ * suite's shared setup lives in exactly those helper sequences.
10
+ *
11
+ * The origin travels on the ExecutionContext (`rebaseOrigin`) so every depth
12
+ * inherits it, the same way connectionMap does.
13
+ */
14
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
15
+ import { executeSteps } from './replay-executor.js';
16
+ import { configManager } from '../config.js';
17
+ import { productionShaped } from '../test-support/fake-execute-tool-call.js';
18
+ const seq = (name, commands) => ({
19
+ id: `seq-${name}`, name, commands, createdAt: 1,
20
+ });
21
+ /** The shape navigate.info really returns: the URL comes from `_meta`. */
22
+ const pageInfo = (url) => ({
23
+ content: [{ type: 'text', text: `URL: ${url}` }],
24
+ _meta: { tool: 'navigate', action: 'info', timestamp: 0, navigate: { url, title: 't', action: 'info' } },
25
+ });
26
+ function makeHarness(nested, rebaseOrigin) {
27
+ const gotoUrls = [];
28
+ const executeToolCall = vi.fn(productionShaped(async (tool, params) => {
29
+ if (tool === 'navigate' && params.action === 'goto') {
30
+ gotoUrls.push(String(params.url));
31
+ return { content: [{ type: 'text', text: 'ok' }] };
32
+ }
33
+ if (tool === 'navigate' && params.action === 'info')
34
+ return pageInfo('https://cue-test.pages.dev/');
35
+ return { content: [{ type: 'text', text: '' }] };
36
+ }));
37
+ const commandRecorder = {
38
+ recordCommand: vi.fn(),
39
+ getCurrentHistoryIndex: () => 0,
40
+ getSequence: (id) => nested.find(s => s.id === id),
41
+ getFreshSequence: async (id) => nested.find(s => s.id === id),
42
+ listSequences: () => nested,
43
+ };
44
+ const ctx = {
45
+ executeToolCall,
46
+ commandRecorder,
47
+ connectionReason: 'device-a',
48
+ logPrefix: 'test',
49
+ variableStore: {},
50
+ ...(rebaseOrigin ? { rebaseOrigin } : {}),
51
+ };
52
+ return { gotoUrls, ctx };
53
+ }
54
+ beforeEach(() => {
55
+ vi.spyOn(configManager, 'getClickValidationConfig').mockReturnValue({
56
+ enabled: false, validateNavigation: false, requireDomChanges: false,
57
+ domChangesFailMode: 'warn', failOnConsoleErrors: false,
58
+ consoleErrorsFailMode: 'error', validateNetworkPayload: false,
59
+ networkFailMode: 'warn', postClickDelayMs: 0,
60
+ });
61
+ vi.spyOn(configManager, 'getReplayConfig').mockReturnValue({
62
+ maxConditionalDepth: 10, maxRegexLength: 500, showCursor: false,
63
+ playwrightExportPath: './x', puppeteerExportPath: './y', maxDelayMs: 0,
64
+ });
65
+ });
66
+ const recordedGoto = (url) => ({ tool: 'navigate', params: { action: 'goto', url } });
67
+ describe('rebaseOrigin reaches nested sequences', () => {
68
+ it("retargets a conditional's then sequence", async () => {
69
+ const inner = seq('login', [recordedGoto('http://localhost:5174/login?next=/home')]);
70
+ const { gotoUrls, ctx } = makeHarness([inner], 'https://cue-test.pages.dev');
71
+ const result = await executeSteps({
72
+ sequence: seq('outer', [
73
+ { tool: 'conditional', params: { if: '{{url:contains:cue-test}}', then: 'login' } },
74
+ ]),
75
+ ctx,
76
+ startStep: 0,
77
+ });
78
+ expect(result.results[0].success).toBe(true);
79
+ expect(gotoUrls).toEqual(['https://cue-test.pages.dev/login?next=/home']);
80
+ });
81
+ it("retargets a forEach's do sequence", async () => {
82
+ const inner = seq('open-row', [recordedGoto('http://localhost:5174/row')]);
83
+ const { gotoUrls, ctx } = makeHarness([inner], 'https://cue-test.pages.dev');
84
+ const result = await executeSteps({
85
+ sequence: seq('outer', [
86
+ { tool: 'forEach', params: { in: ['a', 'b'], as: 'row', do: 'open-row' } },
87
+ ]),
88
+ ctx,
89
+ startStep: 0,
90
+ });
91
+ expect(result.results[0].success).toBe(true);
92
+ expect(gotoUrls).toEqual([
93
+ 'https://cue-test.pages.dev/row',
94
+ 'https://cue-test.pages.dev/row',
95
+ ]);
96
+ });
97
+ it('reaches a sequence nested two deep', async () => {
98
+ const deep = seq('deep', [recordedGoto('http://localhost:5174/deep')]);
99
+ const mid = seq('mid', [{ tool: 'conditional', params: { if: '{{url:contains:cue-test}}', then: 'deep' } }]);
100
+ const { gotoUrls, ctx } = makeHarness([mid, deep], 'https://cue-test.pages.dev');
101
+ const result = await executeSteps({
102
+ sequence: seq('outer', [
103
+ { tool: 'conditional', params: { if: '{{url:contains:cue-test}}', then: 'mid' } },
104
+ ]),
105
+ ctx,
106
+ startStep: 0,
107
+ });
108
+ expect(result.results[0].success).toBe(true);
109
+ expect(gotoUrls).toEqual(['https://cue-test.pages.dev/deep']);
110
+ });
111
+ // A non-localhost recorded origin: checkPortBeforeNavigation refuses a
112
+ // localhost goto whose port is closed, and the step would break before
113
+ // navigate was ever called - which says nothing about rebasing.
114
+ it('leaves nested URLs alone with no rebaseOrigin on the context', async () => {
115
+ const inner = seq('login', [recordedGoto('https://staging.example.com/login')]);
116
+ const { gotoUrls, ctx } = makeHarness([inner]);
117
+ await executeSteps({
118
+ sequence: seq('outer', [
119
+ { tool: 'conditional', params: { if: '{{url:contains:cue-test}}', then: 'login' } },
120
+ ]),
121
+ ctx,
122
+ startStep: 0,
123
+ });
124
+ expect(gotoUrls).toEqual(['https://staging.example.com/login']);
125
+ });
126
+ it('does not mutate the recorder-held nested sequence', async () => {
127
+ const inner = seq('login', [recordedGoto('http://localhost:5174/login')]);
128
+ const { ctx } = makeHarness([inner], 'https://cue-test.pages.dev');
129
+ await executeSteps({
130
+ sequence: seq('outer', [
131
+ { tool: 'conditional', params: { if: '{{url:contains:cue-test}}', then: 'login' } },
132
+ ]),
133
+ ctx,
134
+ startStep: 0,
135
+ });
136
+ expect(inner.commands[0].params.url).toBe('http://localhost:5174/login');
137
+ });
138
+ });
139
+ //# sourceMappingURL=replay-nested-rebase.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-nested-rebase.test.js","sourceRoot":"","sources":["../../src/tools/replay-nested-rebase.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=replay-nested-variables.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-nested-variables.test.d.ts","sourceRoot":"","sources":["../../src/tools/replay-nested-variables.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * `variables` must reach the sequences a run nests into, and a key that lands
3
+ * nowhere must be an error rather than a silent no-op.
4
+ *
5
+ * Both failures ran the same way: the step executed on its RECORDED text while
6
+ * the call read as an override. A recorded credential therefore reached the
7
+ * live app with the run reporting success - the shape that makes it worse than
8
+ * a plain failure, because nothing in the output says the substitution did not
9
+ * happen. A shared login helper reached by a `conditional` is exactly where a
10
+ * supplied password has to land, so the top-level-only substitution missed the
11
+ * one case that matters.
12
+ */
13
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
14
+ import { executeSteps } from './replay-executor.js';
15
+ import { configManager } from '../config.js';
16
+ import { productionShaped } from '../test-support/fake-execute-tool-call.js';
17
+ const seq = (name, commands) => ({ id: `seq-${name}`, name, commands, createdAt: 1 });
18
+ const pageInfo = (url) => ({
19
+ content: [{ type: 'text', text: `URL: ${url}` }],
20
+ _meta: { tool: 'navigate', action: 'info', timestamp: 0, navigate: { url, title: 't', action: 'info' } },
21
+ });
22
+ function makeHarness(nested) {
23
+ const typed = [];
24
+ const fieldValues = new Map();
25
+ const logged = [];
26
+ const executeToolCall = vi.fn(productionShaped(async (tool, params) => {
27
+ if (tool === 'input' && params.action === 'type') {
28
+ typed.push({ selector: params.selector, text: String(params.text) });
29
+ if (params.selector)
30
+ fieldValues.set(String(params.selector), String(params.text));
31
+ }
32
+ if (tool === 'navigate' && params.action === 'info')
33
+ return pageInfo('https://app.example.com/');
34
+ // The executor reads a typed field back and fails the step on a mismatch.
35
+ if (tool === 'inspect' && params.action === 'evaluateExpression') {
36
+ const selector = String(params.expression).match(/querySelector\('([^']*)'\)/)?.[1] ?? '';
37
+ return { content: [{ type: 'text', text: '```json\n' + JSON.stringify(fieldValues.get(selector) ?? '') + '\n```' }] };
38
+ }
39
+ return { content: [{ type: 'text', text: '' }] };
40
+ }));
41
+ const commandRecorder = {
42
+ recordCommand: vi.fn(),
43
+ getCurrentHistoryIndex: () => 0,
44
+ getSequence: (id) => nested.find(s => s.id === id),
45
+ getFreshSequence: async (id) => nested.find(s => s.id === id),
46
+ listSequences: () => nested,
47
+ };
48
+ const ctx = {
49
+ executeToolCall,
50
+ commandRecorder,
51
+ connectionReason: 'device-a',
52
+ logPrefix: 'test',
53
+ variableStore: {},
54
+ };
55
+ return { typed, logged, ctx };
56
+ }
57
+ beforeEach(() => {
58
+ vi.spyOn(configManager, 'getClickValidationConfig').mockReturnValue({
59
+ enabled: false, validateNavigation: false, requireDomChanges: false,
60
+ domChangesFailMode: 'warn', failOnConsoleErrors: false,
61
+ consoleErrorsFailMode: 'error', validateNetworkPayload: false,
62
+ networkFailMode: 'warn', postClickDelayMs: 0,
63
+ });
64
+ vi.spyOn(configManager, 'getReplayConfig').mockReturnValue({
65
+ maxConditionalDepth: 10, maxRegexLength: 500, showCursor: false,
66
+ playwrightExportPath: './x', puppeteerExportPath: './y', maxDelayMs: 0,
67
+ });
68
+ });
69
+ const login = () => seq('login', [
70
+ { tool: 'input', params: { action: 'type', selector: '#password', text: 'recorded-secret' } },
71
+ ]);
72
+ describe('variables reach nested sequences', () => {
73
+ it("substitutes inside a conditional's then sequence", async () => {
74
+ const { typed, ctx } = makeHarness([login()]);
75
+ ctx.variables = { var_0__password: 'supplied-secret' };
76
+ const result = await executeSteps({
77
+ sequence: seq('outer', [
78
+ { tool: 'conditional', params: { if: '{{url:contains:example}}', then: 'login' } },
79
+ ]),
80
+ ctx,
81
+ startStep: 0,
82
+ });
83
+ expect(result.results[0].success).toBe(true);
84
+ expect(typed).toEqual([{ selector: '#password', text: 'supplied-secret' }]);
85
+ });
86
+ it("substitutes inside a forEach's do sequence, on every iteration", async () => {
87
+ const { typed, ctx } = makeHarness([seq('fill-row', [
88
+ { tool: 'input', params: { action: 'type', selector: '#cell', text: 'recorded' } },
89
+ ])]);
90
+ ctx.variables = { var_0__cell: 'supplied' };
91
+ await executeSteps({
92
+ sequence: seq('outer', [
93
+ { tool: 'forEach', params: { in: ['a', 'b'], as: 'row', do: 'fill-row' } },
94
+ ]),
95
+ ctx,
96
+ startStep: 0,
97
+ });
98
+ expect(typed).toEqual([
99
+ { selector: '#cell', text: 'supplied' },
100
+ { selector: '#cell', text: 'supplied' },
101
+ ]);
102
+ });
103
+ it('reaches a sequence nested two deep', async () => {
104
+ const mid = seq('mid', [{ tool: 'conditional', params: { if: '{{url:contains:example}}', then: 'login' } }]);
105
+ const { typed, ctx } = makeHarness([mid, login()]);
106
+ ctx.variables = { var_0__password: 'supplied-secret' };
107
+ await executeSteps({
108
+ sequence: seq('outer', [
109
+ { tool: 'conditional', params: { if: '{{url:contains:example}}', then: 'mid' } },
110
+ ]),
111
+ ctx,
112
+ startStep: 0,
113
+ });
114
+ expect(typed).toEqual([{ selector: '#password', text: 'supplied-secret' }]);
115
+ });
116
+ it('types the recorded text when the context carries no variables', async () => {
117
+ const { typed, ctx } = makeHarness([login()]);
118
+ await executeSteps({
119
+ sequence: seq('outer', [
120
+ { tool: 'conditional', params: { if: '{{url:contains:example}}', then: 'login' } },
121
+ ]),
122
+ ctx,
123
+ startStep: 0,
124
+ });
125
+ expect(typed).toEqual([{ selector: '#password', text: 'recorded-secret' }]);
126
+ });
127
+ it('lets the explicit option win over the context, for teardown and direct callers', async () => {
128
+ const { typed, ctx } = makeHarness([]);
129
+ ctx.variables = { var_0__password: 'from-context' };
130
+ await executeSteps({
131
+ sequence: login(),
132
+ ctx,
133
+ startStep: 0,
134
+ variables: { var_0__password: 'from-option' },
135
+ });
136
+ expect(typed).toEqual([{ selector: '#password', text: 'from-option' }]);
137
+ });
138
+ });
139
+ //# sourceMappingURL=replay-nested-variables.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-nested-variables.test.js","sourceRoot":"","sources":["../../src/tools/replay-nested-variables.test.ts"],"names":[],"mappings":"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"}
@@ -55,4 +55,29 @@ describe('rebaseSequence', () => {
55
55
  expect(out.startUrl).toBeUndefined();
56
56
  });
57
57
  });
58
+ describe('rebaseSequence: declared connections', () => {
59
+ const declared = () => seq({
60
+ requiredConnections: [
61
+ { reference: 'member-one', url: 'http://localhost:5174/join?code=7' },
62
+ { reference: 'member-two' },
63
+ ],
64
+ });
65
+ it("rewrites a declared connection's launch url", () => {
66
+ const out = rebaseSequence(declared(), { baseUrl: 'https://cue-test.pages.dev' });
67
+ expect(out.requiredConnections[0].url).toBe('https://cue-test.pages.dev/join?code=7');
68
+ });
69
+ it('leaves a declaration without a url alone', () => {
70
+ const out = rebaseSequence(declared(), { baseUrl: 'https://cue-test.pages.dev' });
71
+ expect(out.requiredConnections[1]).toEqual({ reference: 'member-two' });
72
+ });
73
+ it('does not mutate the stored declaration', () => {
74
+ const original = declared();
75
+ rebaseSequence(original, { baseUrl: 'https://cue-test.pages.dev' });
76
+ expect(original.requiredConnections[0].url).toBe('http://localhost:5174/join?code=7');
77
+ });
78
+ it('carries the declarations through when no baseUrl is given', () => {
79
+ const out = rebaseSequence(declared(), { startUrl: 'http://localhost:5174/other' });
80
+ expect(out.requiredConnections[0].url).toBe('http://localhost:5174/join?code=7');
81
+ });
82
+ });
58
83
  //# sourceMappingURL=replay-rebase.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"replay-rebase.test.js","sourceRoot":"","sources":["../../src/tools/replay-rebase.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"replay-rebase.test.js","sourceRoot":"","sources":["../../src/tools/replay-rebase.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=replay-run-all-parity.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-run-all-parity.test.d.ts","sourceRoot":"","sources":["../../src/tools/replay-run-all-parity.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * `runAll` fans `run` out over a folder, so a per-run option either carries or
3
+ * is deliberately withheld. Two carry that a suite needs:
4
+ *
5
+ * - `baseUrl` retargets every sequence at the same deployment. A suite that
6
+ * could only run against the recorded origin is a suite that can only test
7
+ * the machine it was recorded on.
8
+ * - `killChromeOnFinish` means the SUITE's finish, so only the last sequence
9
+ * carries it: passing it to each one tears down the browser between
10
+ * sequences and destroys the state a _helpers preamble established.
11
+ *
12
+ * The rest (startFrom/stepTo/stepCount/startUrl) address one specific
13
+ * sequence and are cleared.
14
+ */
15
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
16
+ import { promises as fs } from 'fs';
17
+ import { tmpdir } from 'os';
18
+ import { join } from 'path';
19
+ import { CommandRecorder } from '../command-recorder.js';
20
+ import { createReplayTools } from './replay-tools.js';
21
+ import { productionShaped } from '../test-support/fake-execute-tool-call.js';
22
+ let dir;
23
+ let recorder;
24
+ let replay;
25
+ let gotoUrls;
26
+ let killCalls;
27
+ const writeSequence = async (name, url) => {
28
+ await fs.writeFile(join(dir, `${name}.json`), JSON.stringify({
29
+ id: `seq-${name}`, name, createdAt: 1,
30
+ commands: [{ tool: 'navigate', params: { action: 'goto', url, connectionReason: 'suite' } }],
31
+ }));
32
+ };
33
+ beforeEach(async () => {
34
+ dir = await fs.mkdtemp(join(tmpdir(), 'cdp-runall-parity-'));
35
+ recorder = new CommandRecorder();
36
+ gotoUrls = [];
37
+ killCalls = 0;
38
+ vi.spyOn(recorder, 'getSequencesDir').mockReturnValue(dir);
39
+ ({ replay } = createReplayTools(recorder, vi.fn(productionShaped(async (tool, params) => {
40
+ if (tool === 'navigate' && params.action === 'goto')
41
+ gotoUrls.push(String(params.url));
42
+ if (tool === 'killChrome')
43
+ killCalls++;
44
+ return { content: [{ type: 'text', text: '' }] };
45
+ })), async () => null, // no page -> no cursor/overlay injection
46
+ async () => 9222, undefined));
47
+ });
48
+ afterEach(async () => {
49
+ recorder.stopSequenceWatch();
50
+ await fs.rm(dir, { recursive: true, force: true });
51
+ });
52
+ const runAll = (params = {}) => replay.handler({ action: 'runAll', ...params });
53
+ describe('runAll carries baseUrl', () => {
54
+ it('retargets every sequence in the suite', async () => {
55
+ await writeSequence('a-first', 'https://staging.example.com/one');
56
+ await writeSequence('b-second', 'https://staging.example.com/two?q=1');
57
+ await runAll({ baseUrl: 'https://cue-test.pages.dev', connectionReason: 'suite' });
58
+ expect(gotoUrls).toEqual([
59
+ 'https://cue-test.pages.dev/one',
60
+ 'https://cue-test.pages.dev/two?q=1',
61
+ ]);
62
+ });
63
+ it('leaves the recorded origin in place when no baseUrl is given', async () => {
64
+ await writeSequence('a-first', 'https://staging.example.com/one');
65
+ await runAll({ connectionReason: 'suite' });
66
+ expect(gotoUrls).toEqual(['https://staging.example.com/one']);
67
+ });
68
+ it('does not write the retarget back to the sequence file', async () => {
69
+ await writeSequence('a-first', 'https://staging.example.com/one');
70
+ await runAll({ baseUrl: 'https://cue-test.pages.dev', connectionReason: 'suite' });
71
+ const onDisk = JSON.parse(await fs.readFile(join(dir, 'a-first.json'), 'utf-8'));
72
+ expect(onDisk.commands[0].params.url).toBe('https://staging.example.com/one');
73
+ });
74
+ });
75
+ describe('runAll carries killChromeOnFinish once', () => {
76
+ it('kills after the last sequence, not between them', async () => {
77
+ await writeSequence('a-first', 'https://staging.example.com/one');
78
+ await writeSequence('b-second', 'https://staging.example.com/two');
79
+ await runAll({ killChromeOnFinish: true, connectionReason: 'suite' });
80
+ expect(gotoUrls.length).toBe(2);
81
+ expect(killCalls).toBe(1);
82
+ });
83
+ it('kills nothing when it is not asked for', async () => {
84
+ await writeSequence('a-first', 'https://staging.example.com/one');
85
+ await writeSequence('b-second', 'https://staging.example.com/two');
86
+ await runAll({ connectionReason: 'suite' });
87
+ expect(killCalls).toBe(0);
88
+ });
89
+ });
90
+ //# sourceMappingURL=replay-run-all-parity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay-run-all-parity.test.js","sourceRoot":"","sources":["../../src/tools/replay-run-all-parity.test.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,7 @@ getKnownToolNames?: () => string[]): {
38
38
  description: z.ZodOptional<z.ZodString>;
39
39
  expectedOutcome: z.ZodOptional<z.ZodString>;
40
40
  startUrl: z.ZodOptional<z.ZodString>;
41
+ envFile: z.ZodOptional<z.ZodString>;
41
42
  baseUrl: z.ZodOptional<z.ZodString>;
42
43
  indices: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
43
44
  lines: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
@@ -115,6 +116,13 @@ getKnownToolNames?: () => string[]): {
115
116
  connectionReason?: string | undefined;
116
117
  stepTimeout?: number | undefined;
117
118
  totalTimeout?: number | undefined;
119
+ requiredConnections?: {
120
+ reference: string;
121
+ profile?: string | undefined;
122
+ url?: string | undefined;
123
+ forceNewInstance?: boolean | undefined;
124
+ role?: string | undefined;
125
+ }[] | undefined;
118
126
  limit?: number | undefined;
119
127
  comment?: string | undefined;
120
128
  stepTo?: number | undefined;
@@ -126,18 +134,12 @@ getKnownToolNames?: () => string[]): {
126
134
  preferCoordinates?: boolean | undefined;
127
135
  preferSelectors?: boolean | undefined;
128
136
  stepCount?: number | undefined;
137
+ envFile?: string | undefined;
129
138
  indices?: number[] | undefined;
130
139
  sequenceId?: string | undefined;
131
140
  runId?: string | undefined;
132
141
  format?: "sequence" | "playwright" | "puppeteer" | undefined;
133
142
  intoHistory?: boolean | undefined;
134
- requiredConnections?: {
135
- reference: string;
136
- profile?: string | undefined;
137
- url?: string | undefined;
138
- forceNewInstance?: boolean | undefined;
139
- role?: string | undefined;
140
- }[] | undefined;
141
143
  tags?: string[] | undefined;
142
144
  requiredSockets?: string[] | undefined;
143
145
  connections?: Record<string, string> | undefined;
@@ -173,6 +175,13 @@ getKnownToolNames?: () => string[]): {
173
175
  connectionReason?: string | undefined;
174
176
  stepTimeout?: number | undefined;
175
177
  totalTimeout?: number | undefined;
178
+ requiredConnections?: {
179
+ reference: string;
180
+ profile?: string | undefined;
181
+ url?: string | undefined;
182
+ forceNewInstance?: boolean | undefined;
183
+ role?: string | undefined;
184
+ }[] | undefined;
176
185
  limit?: number | undefined;
177
186
  comment?: string | undefined;
178
187
  stepTo?: number | undefined;
@@ -184,18 +193,12 @@ getKnownToolNames?: () => string[]): {
184
193
  preferCoordinates?: boolean | undefined;
185
194
  preferSelectors?: boolean | undefined;
186
195
  stepCount?: number | undefined;
196
+ envFile?: string | undefined;
187
197
  indices?: number[] | undefined;
188
198
  sequenceId?: string | undefined;
189
199
  runId?: string | undefined;
190
200
  format?: "sequence" | "playwright" | "puppeteer" | undefined;
191
201
  intoHistory?: boolean | undefined;
192
- requiredConnections?: {
193
- reference: string;
194
- profile?: string | undefined;
195
- url?: string | undefined;
196
- forceNewInstance?: boolean | undefined;
197
- role?: string | undefined;
198
- }[] | undefined;
199
202
  tags?: string[] | undefined;
200
203
  requiredSockets?: string[] | undefined;
201
204
  connections?: Record<string, string> | undefined;
@@ -238,6 +241,13 @@ getKnownToolNames?: () => string[]): {
238
241
  connectionReason?: string | undefined;
239
242
  stepTimeout?: number | undefined;
240
243
  totalTimeout?: number | undefined;
244
+ requiredConnections?: {
245
+ reference: string;
246
+ profile?: string | undefined;
247
+ url?: string | undefined;
248
+ forceNewInstance?: boolean | undefined;
249
+ role?: string | undefined;
250
+ }[] | undefined;
241
251
  limit?: number | undefined;
242
252
  comment?: string | undefined;
243
253
  stepTo?: number | undefined;
@@ -249,18 +259,12 @@ getKnownToolNames?: () => string[]): {
249
259
  preferCoordinates?: boolean | undefined;
250
260
  preferSelectors?: boolean | undefined;
251
261
  stepCount?: number | undefined;
262
+ envFile?: string | undefined;
252
263
  indices?: number[] | undefined;
253
264
  sequenceId?: string | undefined;
254
265
  runId?: string | undefined;
255
266
  format?: "sequence" | "playwright" | "puppeteer" | undefined;
256
267
  intoHistory?: boolean | undefined;
257
- requiredConnections?: {
258
- reference: string;
259
- profile?: string | undefined;
260
- url?: string | undefined;
261
- forceNewInstance?: boolean | undefined;
262
- role?: string | undefined;
263
- }[] | undefined;
264
268
  tags?: string[] | undefined;
265
269
  requiredSockets?: string[] | undefined;
266
270
  connections?: Record<string, string> | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"replay-tools.d.ts","sourceRoot":"","sources":["../../src/tools/replay-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,eAAe,EAAyD,MAAM,wBAAwB,CAAC;AACrH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAgFnD,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACnC,cAAc,EAAE,MAAM,EAAE,GACvB,eAAe,EAAE,CAWnB;AAmwGD,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,EAChC,oBAAoB,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,EACjE,iBAAiB,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;AACxE;;;;;GAKG;AACH,iBAAiB,CAAC,EAAE,MAAM,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwDnC"}
1
+ {"version":3,"file":"replay-tools.d.ts","sourceRoot":"","sources":["../../src/tools/replay-tools.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,eAAe,EAAyD,MAAM,wBAAwB,CAAC;AACrH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAgFnD,MAAM,WAAW,eAAe;IAC9B,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACnC,cAAc,EAAE,MAAM,EAAE,GACvB,eAAe,EAAE,CAWnB;AA88GD,wBAAgB,iBAAiB,CAC/B,eAAe,EAAE,eAAe,EAChC,eAAe,EAAE,eAAe,EAChC,oBAAoB,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,EACjE,iBAAiB,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;AACxE;;;;;GAKG;AACH,iBAAiB,CAAC,EAAE,MAAM,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwDnC"}