원클릭으로
playwright-testing
// Use when creating or modifying Playwright end-to-end tests, especially when injecting mock plugins to test platform features.
// Use when creating or modifying Playwright end-to-end tests, especially when injecting mock plugins to test platform features.
Use when creating a new plugin, adding a new data source, or debugging missing plugin data in the WorldWideView project. Triggers on seeder creation, WebSocket streaming issues, plugin registration failures, manifest validation errors, GeoEntity rendering problems, or data engine integration
End-to-end pipeline that takes a WorldWideView plugin from idea to npm-published and cleaned up. Conducts an isolated worktree + scaffold, GSD research/plan/build/UAT, dual-repo PRs (plugin + seeder), npm publish, and teardown, with user gates only at plan approval, UAT sign-off, npm publish, and teardown. Use when the user says "/plugin-new", "new plugin", "build a plugin end to end", "ship a plugin", or "run the plugin pipeline".
Post-merge lifecycle cleanup. Investigates the full state first, presents one decision summary, then executes after user approval. Commits leftover artifacts, deletes the session plan file, archives the worktree's isolated .planning, and delegates worktree removal to the worktree-manager agent. Pairs with branch-finisher as the closing bookend of a feature branch.
Create and fully bootstrap a WWV git worktree for isolated feature/debug work. Copies env vars, installs deps, generates Prisma client, and verifies the dev server boots before reporting ready.
User-triggered only. Invoke when the user explicitly runs /full-manual-e2e, or when /gsd:progress routes to manual verification. Do NOT auto-activate. Full WWV ecosystem E2E test script covering 3-server startup on https://wwv.local, chrome-devtools MCP browser driving, and 7-step auth+install validation flow.
Invoke when the user asks to "check history", "recall context", "what did we work on", "load prior context", "what's the background on X", "remind me where we left off", or any similar request to surface prior session work. Also invoke proactively at the start of a session continuation when the user references past work that isn't fully described in the current conversation. Uses observation history, context-mode index, and memory files to reconstruct relevant prior state.
| name | playwright-testing |
| description | Use when creating or modifying Playwright end-to-end tests, especially when injecting mock plugins to test platform features. |
When you are tasked with testing a new feature or plugin in WorldWideView using Playwright, you must use this skill to ensure you follow the strict architecture rules of the platform.
When creating a mock plugin (e.g., public/e2e-fixtures/my-mock-plugin.js) to test a specific UI feature, you MUST implement the full Data Plugin interface.
WorldWideView's PluginManager throws fatal runtime errors if a plugin is missing core data fetching methods, even if your plugin only tests a UI component like a bottom panel.
Required Methods for EVERY Mock Plugin:
export default {
id: "my-mock-plugin",
name: "My Mock Plugin",
// ...
// MUST BE INCLUDED:
fetch: async (timeRange) => { return []; },
getPollingInterval: () => { return 60000; },
getLayerConfig: () => { return { color: "#FFF", clusterEnabled: false, clusterDistance: 50 }; },
renderEntity: (entity) => { return { type: "point", color: "#FFF", size: 5 }; },
// Your UI testing component (e.g., Sidebar, Bottom Panel)
getBottomPanelComponent: () => { ... }
}
If your mock plugin needs to be toggled by the user in the Layers list, you MUST include the "ui:sidebar" capability in its manifest.json.
{
"capabilities": ["ui:bottom-panel", "ui:sidebar"],
"extends": ["sidebar"]
}
The frontend reads plugins from the database. You MUST inject your mock plugin during tests/global.setup.ts using Prisma:
const manifestPath = path.join(process.cwd(), 'public', 'e2e-fixtures', 'my-mock-plugin-manifest.json');
const manifestStr = fs.readFileSync(manifestPath, 'utf-8');
await prisma.installedPlugin.create({
data: {
pluginId: 'my-mock-plugin',
version: '1.0.0',
config: manifestStr,
enabled: true
}
});
Make sure to add your new mock plugin ID to the cleanup logic in global.setup.ts as well:
await prisma.installedPlugin.deleteMany({
where: { pluginId: { in: ['e2e-mock-plugin', 'my-mock-plugin'] } }
});
DO NOT use CSS classes for your locators. CSS classes change frequently (e.g., .dock-btn, .layer-item__toggle).
You MUST either:
data-testid attributes to the React components you are testing.getByRole('button', { name: /Text/ })).pnpm run dev:backends is running before you execute tests locally.pnpm run test:e2e or npx playwright test tests/your-test.spec.ts.&&. Use ; instead.