openspec-playwright 0.3.55 → 0.3.57

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.
@@ -1,130 +0,0 @@
1
- /**
2
- * Shared utilities for Playwright MCP tool synchronization.
3
- * Parses @playwright/mcp README to extract browser_* tool names and
4
- * updates the Healer MCP tools table in SKILL.md.
5
- */
6
- import { execSync } from 'child_process';
7
- import { existsSync, readFileSync, writeFileSync } from 'fs';
8
- import { join } from 'path';
9
- import chalk from 'chalk';
10
- /** Cached directory for npm temp files */
11
- const TMP_DIR = '/tmp/openspec-pw-mcp';
12
- /**
13
- * Get the latest @playwright/mcp version from npm registry.
14
- * Falls back to cached README if network fails.
15
- */
16
- function getLatestVersion() {
17
- try {
18
- const json = execSync('npm show @playwright/mcp version --json', { stdio: 'pipe', encoding: 'utf-8' }).trim();
19
- return JSON.parse(json);
20
- }
21
- catch {
22
- return '0.0.68'; // fallback to known version
23
- }
24
- }
25
- /**
26
- * Download and parse the @playwright/mcp README to extract all browser_* tools.
27
- */
28
- export function fetchMcpTools() {
29
- const version = getLatestVersion();
30
- const tmpPkg = join(TMP_DIR, 'package');
31
- // Clean and prepare temp dir
32
- execSync(`rm -rf ${TMP_DIR} && mkdir -p ${TMP_DIR}`, { stdio: 'pipe' });
33
- // Download tarball
34
- execSync(`cd ${TMP_DIR} && npm pack @playwright/mcp@${version} --pack-destination ${TMP_DIR}`, { stdio: 'pipe' });
35
- const tarball = execSync(`ls -t ${TMP_DIR}/playwright-mcp-*.tgz | head -1`, { encoding: 'utf-8' }).trim();
36
- execSync(`tar -xzf "${tarball}" -C ${TMP_DIR} --strip-components=1`, { stdio: 'pipe' });
37
- const readme = readFileSync(join(TMP_DIR, 'README.md'), 'utf-8');
38
- return parseToolsFromReadme(readme);
39
- }
40
- /**
41
- * Parse browser_* tools from the MCP README markdown.
42
- * Format:
43
- * - **browser_navigate**
44
- * - Title: Navigate to a URL
45
- * - Description: Navigate to a URL
46
- */
47
- function parseToolsFromReadme(readme) {
48
- const tools = [];
49
- // Match tool blocks: **browser_name** followed by Title and Description
50
- const blockRegex = /- \*\*([a-z_]+)\*\*[\s\S]*?- Title: ([^\n]+)\n[\s\S]*?- Description: ([^\n]+)/g;
51
- let match;
52
- while ((match = blockRegex.exec(readme)) !== null) {
53
- const name = match[1];
54
- const title = match[2].trim();
55
- const description = match[3].trim();
56
- // Map tool name to Healer purpose
57
- const purpose = mapToolToPurpose(name, title, description);
58
- tools.push({ name, title, description, purpose });
59
- }
60
- return tools;
61
- }
62
- /** Map a browser_* tool to its Healer purpose in the SKILL */
63
- function mapToolToPurpose(name, title, description) {
64
- const map = {
65
- browser_navigate: 'Go to the failing test\'s page',
66
- browser_snapshot: 'Get page structure to find equivalent selectors',
67
- browser_console_messages: 'Diagnose JS errors that may cause failures',
68
- browser_take_screenshot: 'Visually compare before/after fixes',
69
- browser_run_code: 'Execute custom fix logic (optional)',
70
- };
71
- return map[name] || title;
72
- }
73
- /**
74
- * Update the Healer MCP tools table in SKILL.md.
75
- * Only syncs the 5 core Healer tools; all other MCP tools are
76
- * general-purpose automation not specific to healing.
77
- * Deduplicates by tool name.
78
- */
79
- export function updateSkillHealerTable(skillPath, tools) {
80
- if (!existsSync(skillPath))
81
- return;
82
- const content = readFileSync(skillPath, 'utf-8');
83
- // Only the 5 core Healer tools
84
- const healerToolNames = [
85
- 'browser_navigate',
86
- 'browser_snapshot',
87
- 'browser_console_messages',
88
- 'browser_take_screenshot',
89
- 'browser_run_code',
90
- ];
91
- // Filter to healer tools, deduplicate by name
92
- const healerTools = tools.filter(t => healerToolNames.includes(t.name));
93
- const seen = new Set();
94
- const unique = healerTools.filter(t => {
95
- if (seen.has(t.name))
96
- return false;
97
- seen.add(t.name);
98
- return true;
99
- });
100
- // Build new table rows
101
- const rows = unique.map(t => `| \`${t.name}\` | ${t.purpose} |`).join('\n');
102
- // Replace the existing table
103
- const tableHeader = '| Tool | Purpose |';
104
- const tableSep = '|------|---------|';
105
- const start = content.indexOf(tableHeader);
106
- const end = content.indexOf(tableSep, start + 1);
107
- if (start === -1 || end === -1)
108
- return;
109
- const newSection = tableHeader + '\n' + tableSep + '\n' + rows;
110
- const newContent = content.substring(0, start) +
111
- newSection +
112
- content.substring(end + tableSep.length);
113
- writeFileSync(skillPath, newContent, 'utf-8');
114
- }
115
- /**
116
- * Main entry point: fetch tools and update SKILL.md.
117
- * Call this after installing the skill in init.ts and update.ts.
118
- */
119
- export function syncMcpTools(skillPath) {
120
- try {
121
- const tools = fetchMcpTools();
122
- updateSkillHealerTable(skillPath, tools);
123
- console.log(chalk.green(` ✓ Healer tools synced from @playwright/mcp`));
124
- }
125
- catch (err) {
126
- console.log(chalk.yellow(` ⚠ Failed to sync MCP tools: ${err}`));
127
- console.log(chalk.gray(' SKILL.md MCP tools table may be stale'));
128
- }
129
- }
130
- //# sourceMappingURL=mcp-tools.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-tools.js","sourceRoot":"","sources":["../../src/utils/mcp-tools.ts"],"names":[],"mappings":"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"}