From f9869a59f2120e546a471a4e5ceb8e8b42a138e6 Mon Sep 17 00:00:00 2001 From: "Tommy D. Rossi" Date: Fri, 23 Jan 2026 23:57:25 +0100 Subject: [PATCH] refactor: move welcome.html to src/, simplify vite build config, cleanup cli.ts formatting --- extension/manifest.json | 2 +- extension/src/background.ts | 2 +- extension/{ => src}/welcome.html | 0 extension/vite.config.mts | 20 ++++++++--------- playwriter/src/cli.ts | 38 ++++++++++++++++---------------- website/.gitignore | 3 ++- 6 files changed, 33 insertions(+), 32 deletions(-) rename extension/{ => src}/welcome.html (100%) diff --git a/extension/manifest.json b/extension/manifest.json index 6924174..875d7c7 100644 --- a/extension/manifest.json +++ b/extension/manifest.json @@ -6,7 +6,7 @@ "permissions": ["debugger", "tabGroups", "contextMenus", "tabs"], "host_permissions": [""], "background": { - "service_worker": "lib/background.mjs", + "service_worker": "background.js", "type": "module" }, "action": { diff --git a/extension/src/background.ts b/extension/src/background.ts index 964c976..f5ced8d 100644 --- a/extension/src/background.ts +++ b/extension/src/background.ts @@ -1163,7 +1163,7 @@ function updateContextMenuVisibility(): void { chrome.runtime.onInstalled.addListener((details) => { if (import.meta.env.TESTING) return if (details.reason === 'install') { - void chrome.tabs.create({ url: 'welcome.html' }) + void chrome.tabs.create({ url: 'src/welcome.html' }) } }) diff --git a/extension/welcome.html b/extension/src/welcome.html similarity index 100% rename from extension/welcome.html rename to extension/src/welcome.html diff --git a/extension/vite.config.mts b/extension/vite.config.mts index 888185d..1c98f08 100644 --- a/extension/vite.config.mts +++ b/extension/vite.config.mts @@ -38,23 +38,23 @@ export default defineConfig({ return JSON.stringify(manifest, null, 2); } }, - { - src: resolve(__dirname, 'welcome.html'), - dest: '.' - } ] }) ], build: { - lib: { - entry: resolve(__dirname, 'src/background.ts'), - fileName: 'lib/background', - formats: ['es'] - }, outDir: 'dist', emptyOutDir: false, - minify: false + minify: false, + rollupOptions: { + input: { + background: resolve(__dirname, 'src/background.ts'), + welcome: resolve(__dirname, 'src/welcome.html'), + }, + output: { + entryFileNames: '[name].js', + }, + }, }, define: defineEnv }); diff --git a/playwriter/src/cli.ts b/playwriter/src/cli.ts index 6a65c4a..9d65f74 100644 --- a/playwriter/src/cli.ts +++ b/playwriter/src/cli.ts @@ -7,10 +7,10 @@ import { ensureRelayServer, RELAY_PORT } from './relay-client.js' const cli = cac('playwriter') cli - .command('', 'Start the MCP server. See https://playwriter.dev/prompt.md for usage') + .command('', 'Start the MCP server or controls the browser with -e') .option('--host ', 'Remote relay server host to connect to (or use PLAYWRITER_HOST env var)') .option('--token ', 'Authentication token (or use PLAYWRITER_TOKEN env var)') - .option('-e, --eval ', 'Execute JavaScript code and exit') + .option('-e, --eval ', 'Execute JavaScript code and exit, read https://playwriter.dev/prompt.md for usage') .option('--timeout ', 'Execution timeout in milliseconds', { default: 5000 }) .option('-s, --session ', 'Session name (required for -e)') .action(async (options: { host?: string; token?: string; eval?: string; timeout?: number; session?: string }) => { @@ -25,7 +25,7 @@ cli }) return } - + // Otherwise start the MCP server const { startMcp } = await import('./mcp.js') await startMcp({ @@ -44,16 +44,16 @@ async function executeCode(options: { const { code, timeout, host, token } = options const cwd = process.cwd() const sessionId = options.sessionId || process.env.PLAYWRITER_SESSION - + // Determine server URL const serverHost = host || process.env.PLAYWRITER_HOST || '127.0.0.1' const serverUrl = `http://${serverHost}:${RELAY_PORT}` - + // Ensure relay server is running (only for local) if (!host && !process.env.PLAYWRITER_HOST) { await ensureRelayServer({ logger: console }) } - + // Session is required if (!sessionId) { try { @@ -65,10 +65,10 @@ async function executeCode(options: { } process.exit(1) } - + // Build request URL with token if provided const executeUrl = `${serverUrl}/cli/execute` - + try { const response = await fetch(executeUrl, { method: 'POST', @@ -78,15 +78,15 @@ async function executeCode(options: { }, body: JSON.stringify({ sessionId, code, timeout, cwd }), }) - + if (!response.ok) { const text = await response.text() console.error(`Error: ${response.status} ${text}`) process.exit(1) } - + const result = await response.json() as { text: string; images: Array<{ data: string; mimeType: string }>; isError: boolean } - + // Print output if (result.text) { if (result.isError) { @@ -95,12 +95,12 @@ async function executeCode(options: { console.log(result.text) } } - + // Note: images are base64 encoded, we could save them to files if needed if (result.images && result.images.length > 0) { console.log(`\n${result.images.length} screenshot(s) captured`) } - + if (result.isError) { process.exit(1) } @@ -126,11 +126,11 @@ cli const sessionId = options.session || process.env.PLAYWRITER_SESSION const serverHost = options.host || process.env.PLAYWRITER_HOST || '127.0.0.1' const serverUrl = `http://${serverHost}:${RELAY_PORT}` - + if (!options.host && !process.env.PLAYWRITER_HOST) { await ensureRelayServer({ logger: console }) } - + if (!sessionId) { try { const res = await fetch(`${serverUrl}/cli/session/suggest`) @@ -141,20 +141,20 @@ cli } process.exit(1) } - + try { const response = await fetch(`${serverUrl}/cli/reset`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ sessionId, cwd }), }) - + if (!response.ok) { const text = await response.text() console.error(`Error: ${response.status} ${text}`) process.exit(1) } - + const result = await response.json() as { success: boolean; pageUrl: string; pagesCount: number } console.log(`Connection reset successfully. ${result.pagesCount} page(s) available. Current page URL: ${result.pageUrl}`) } catch (error: any) { @@ -212,7 +212,7 @@ cli // Lazy-load heavy dependencies only when serve command is used const { createFileLogger } = await import('./create-logger.js') const { startPlayWriterCDPRelayServer } = await import('./cdp-relay.js') - + const logger = createFileLogger() process.title = 'playwriter-serve' diff --git a/website/.gitignore b/website/.gitignore index 87fa0f3..11031b9 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -3,4 +3,5 @@ node_modules /build .env .react-router -.DS_Store \ No newline at end of file +.DS_Store +public/prompt.md