playwright-test-agent 1.0.2 → 1.0.3

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "playwright-test-agent",
3
- "version": "1.0.2",
3
+ "version": "1.0.3",
4
4
  "description": "Initialize Playwright Test agents with a Playwright CLI-first browser workflow.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -23,7 +23,7 @@ Before Planner, the parent may read relevant local project information to unders
23
23
 
24
24
  If the available context is sufficient, start/enter Planner without further confirmation. During exploration, pause when required information is missing, incorrect, or contradictory, including credentials, URL, role, prerequisites, expected behavior that changes assertions, or authorization for a consequential action. Ask the user for the specific correction, then resume or restart Planner with the answer and blocking observation. Do not guess credentials, probe nearby environments, bypass access controls, or wander through unrelated pages.
25
25
 
26
- Keep credentials and tokens in environment variables or ignored secret files. Never copy them into plans, tests, screenshots, evidence, or chat. Browser snapshots and session artifacts produced by `playwright-cli` under `.playwright-cli` are reusable workflow state: preserve them across Planner, Generator, and Healer phases by default. Do not clean up snapshots, sessions, or other transient browser artifacts merely because they were created during validation. Remove or redact only a file that is confirmed to contain an exposed credential/token, or when the user explicitly requests cleanup.
26
+ Keep all runtime configuration—including URLs, accounts, passwords, tokens, and feature flags—in the project-root `.env` file. Commit only `.env.example` with variable names and safe placeholders; `.env` must be ignored by Git. Load it through the project's Playwright/Node configuration (for example, `dotenv/config`) so settings persist for the project without relying on global or one-shot shell environment variables. Never copy secrets into plans, tests, screenshots, evidence, or chat. Browser snapshots and session artifacts produced by `playwright-cli` under `.playwright-cli` are reusable workflow state: preserve them across Planner, Generator, and Healer phases by default. Do not clean up snapshots, sessions, or other transient browser artifacts merely because they were created during validation. Remove or redact only a file that is confirmed to contain an exposed credential/token, or when the user explicitly requests cleanup.
27
27
 
28
28
  ## Planner
29
29
 
@@ -37,7 +37,7 @@ Planner, Generator, and Healer may reuse the existing `.playwright-cli` session
37
37
 
38
38
  ## Generator
39
39
 
40
- Generator starts only after confirmation and converts the confirmed plan into executable Playwright test code. Pass the resolved Playwright `testDir` to Generator. Generator—not the parent—uses `playwright-cli` to validate flows, locators, and assertions, writes every new test inside that configured `testDir`, and returns their paths. Generic `tests/` paths in generated role examples, plans, or seed references do not override the configured directory. Generate only confirmed scenarios; prefer independent tests, semantic locators, explicit assertions, and environment-based secrets.
40
+ Generator starts only after confirmation and converts the confirmed plan into executable Playwright test code. Pass the resolved Playwright `testDir` to Generator. Generator—not the parent—uses `playwright-cli` to validate flows, locators, and assertions, writes every new test inside that configured `testDir`, and returns their paths. Generic `tests/` paths in generated role examples, plans, or seed references do not override the configured directory. Generate only confirmed scenarios; prefer independent tests, semantic locators, explicit assertions, and values loaded from the project's `.env` file.
41
41
 
42
42
  After Generator returns, the parent executes the generated test files with `npx playwright test`. This execution step is mandatory. If all tests pass, report the executed result. If any fail, pass the failed test names, failure output, confirmed plan, and generated file paths to Healer.
43
43
 
@@ -13,7 +13,7 @@ const cliFirstInstructions = (role) => `${ROLE_BLOCK_START}
13
13
 
14
14
  ## Browser tool priority
15
15
 
16
- Use the installed \`playwright-cli\` command as the primary browser interface for this role. Read the globally installed \`playwright-cli\` skill when available. Start or attach a session with \`playwright-cli open\`/\`attach\`, navigate with \`goto\`, inspect compact state with \`snapshot\`, and interact through refs from the latest snapshot. Prefer \`snapshot\` and \`find\` over screenshots. Keep credentials in environment variables or ignored files and never print them. Preserve \`.playwright-cli\` snapshots, sessions, and other browser artifacts for reuse by later phases; do not delete validation artifacts by default. Only remove or redact a confirmed credential/token leak, or act on an explicit cleanup request.
16
+ Use the installed \`playwright-cli\` command as the primary browser interface for this role. Read the globally installed \`playwright-cli\` skill when available. Start or attach a session with \`playwright-cli open\`/\`attach\`, navigate with \`goto\`, inspect compact state with \`snapshot\`, and interact through refs from the latest snapshot. Prefer \`snapshot\` and \`find\` over screenshots. Keep all runtime configuration in the project-root \`.env\` file (commit only \`.env.example\`); load it through Playwright/Node configuration and never rely on global or one-shot shell variables. Never print secrets. Preserve \`.playwright-cli\` snapshots, sessions, and other browser artifacts for reuse by later phases; do not delete validation artifacts by default. Only remove or redact a confirmed credential/token leak, or act on an explicit cleanup request.
17
17
 
18
18
  Keep the official Playwright Test MCP configuration and tools generated for this role; do not remove or disable them. Prefer CLI for live page interaction and use it when those MCP tools are unavailable, so missing \`planner_*\`, \`generator_*\`, \`test_*\`, or \`browser_*\` tools must not block the phase. Do not call Chrome DevTools or an unrelated browser integration, and do not spawn a nested or same-role agent.
19
19
 
@@ -113,6 +113,27 @@ async function updateInstructionFiles(projectDir) {
113
113
  }
114
114
  }
115
115
 
116
+ async function ensureEnvFiles(projectDir) {
117
+ const examplePath = path.join(projectDir, '.env.example');
118
+ if (!await exists(examplePath)) {
119
+ await writeFile(examplePath,
120
+ '# Copy this file to .env and fill in project-specific runtime settings.\n' +
121
+ '# Keep .env local; never commit secrets.\n' +
122
+ '# BASE_URL=https://example.test\n' +
123
+ '# TEST_USERNAME=\n' +
124
+ '# TEST_PASSWORD=\n', 'utf8');
125
+ }
126
+
127
+ const gitignorePath = path.join(projectDir, '.gitignore');
128
+ const source = await exists(gitignorePath) ? await readFile(gitignorePath, 'utf8') : '';
129
+ const entries = ['.env', '.env.*', '!.env.example', '.playwright-evidence/', '.playwright-cli/'];
130
+ const missing = entries.filter((entry) => !source.split(/\r?\n/).includes(entry));
131
+ if (missing.length > 0) {
132
+ const prefix = source.length === 0 || source.endsWith('\n') ? source : `${source}\n`;
133
+ await writeFile(gitignorePath, `${prefix}\n# Playwright Test Agent local configuration\n${missing.join('\n')}\n`, 'utf8');
134
+ }
135
+ }
136
+
116
137
  function withRoleBlock(source, role) {
117
138
  const start = source.indexOf(ROLE_BLOCK_START);
118
139
  const end = source.indexOf(ROLE_BLOCK_END);
@@ -253,9 +274,12 @@ async function installPlaywrightCli(projectDir, run) {
253
274
  await run(projectDir, 'playwright-cli', ['install-browser']);
254
275
  }
255
276
 
256
- async function patchPlaywrightConfig(projectDir) {
257
- const configPath = path.join(projectDir, 'playwright.config.ts');
258
- let source = await readFile(configPath, 'utf8');
277
+ async function patchPlaywrightConfig(projectDir) {
278
+ const configPath = path.join(projectDir, 'playwright.config.ts');
279
+ let source = await readFile(configPath, 'utf8');
280
+ if (!/^import\s+['"]dotenv\/config['"];?/m.test(source)) {
281
+ source = `import 'dotenv/config';\n${source}`;
282
+ }
259
283
  source = source.replace(/testDir:\s*['"]\.\/tests['"]/, "testDir: './playwright-tests'");
260
284
  source = source.replace(
261
285
  /reporter:\s*['"]html['"],?/,
@@ -315,10 +339,15 @@ async function initializePlaywright(projectDir, run) {
315
339
  await mkdir(targetDir, { recursive: true });
316
340
  await rename(generatedExample, path.join(targetDir, 'example.spec.ts'));
317
341
  }
318
- await patchPlaywrightConfig(projectDir);
319
- }
342
+ }
343
+
344
+ await patchPlaywrightConfig(projectDir);
320
345
 
321
- await disableTraceScreenshots(projectDir);
346
+ await disableTraceScreenshots(projectDir);
347
+
348
+ if (await exists(path.join(projectDir, 'package.json'))) {
349
+ await run(projectDir, 'npm', ['install', '--save-dev', 'dotenv']);
350
+ }
322
351
 
323
352
  await run(projectDir, 'npx', ['--no-install', 'playwright', 'init-agents', '--loop=codex']);
324
353
  await run(projectDir, 'npx', ['--no-install', 'playwright', 'init-agents', '--loop=claude']);
@@ -347,7 +376,8 @@ export async function initializeProject({
347
376
  await runStage('installing skill', () => installSkill(target, skillSourceDir));
348
377
  await runStage('installing Playwright CLI and browser', () => installPlaywrightCli(target, run));
349
378
  await runStage('initializing Playwright Test agents', () => initializePlaywright(target, run));
350
- await runStage('updating project instructions', () => updateInstructionFiles(target));
379
+ await runStage('configuring project .env files', () => ensureEnvFiles(target));
380
+ await runStage('updating project instructions', () => updateInstructionFiles(target));
351
381
 
352
382
  process.stdout.write(
353
383
  'Playwright Test Agent ready: Playwright CLI and skills installed globally, ' +