원클릭으로
dev-ui-verify
Use to verify D2E UI behavior with browser tooling, screenshots, network checks, and known local runtime paths.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Use to verify D2E UI behavior with browser tooling, screenshots, network checks, and known local runtime paths.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
| name | dev-ui-verify |
| description | Use to verify D2E UI behavior with browser tooling, screenshots, network checks, and known local runtime paths. |
Use for reproducing bugs, verifying UI fixes, checking local pages, or collecting screenshots/network evidence.
https://localhost:41100/d2e/portal${D2E_APP_REPO:-repos/Data2Evidence}admin / Updatepassword12345For Data2Evidence local UI verification, prefer standalone Playwright with local Chrome/Chromium over the sandboxed/in-app browser. The local portal uses HTTPS, service workers, redirects, and sometimes route stubbing; standalone Playwright is the more reliable default for D2E checks.
Use the in-app browser only for lightweight visual inspection when standalone Playwright is unnecessary or unavailable. In Codex Desktop, standalone Playwright helper commands that launch Chrome must be run with escalation by default, including headed and headless runs. Do not try a sandboxed Chrome launch first. If a sandboxed run happens anyway and reports kill EPERM, SIGABRT, or Target page, context or browser has been closed during Chrome startup, treat it as a command-sandbox permission issue and rerun the same command with escalation instead of switching to a less representative path.
When using Playwright against the local D2E portal, launch Chrome/Chromium with local HTTPS settings:
ignoreHTTPSErrors: true.--ignore-certificate-errors.--unsafely-treat-insecure-origin-as-secure=https://localhost:41100./tmp, for example /tmp/chrome-d2e-insecure-pw./private/tmp/d2e-playwright-login-state.json to reuse local login sessions.scripts/d2e-ui-hot-deploy.sh <nx-project> [resource-dir]. Run this outside the sandbox in Codex because it builds with Nx and may use Docker.tools/d2e-playwright/verify-ui.mjs for standalone Playwright launch, login, storage-state reuse, common navigation, and screenshots. In Codex Desktop, request command escalation before running this helper whenever it will launch Chrome, so Playwright can launch and control local Chrome without the kill EPERM sandbox failure.https://localhost:41100/d2e/portal/researcher, login if needed, and wait for the portal to settle.Use the helper for smoke checks:
node tools/d2e-playwright/verify-ui.mjs --check researcher
node tools/d2e-playwright/verify-ui.mjs --check cohorts --screenshot-dir repos/docs/projects/<project-folder>
In Codex Desktop, request command escalation before running these helper commands. Use --headed when the user wants to watch the real Chrome window:
node tools/d2e-playwright/verify-ui.mjs --check researcher --headed
For custom checks, import helpers from tools/d2e-playwright/verify-ui.mjs and add task-specific route stubs/assertions around gotoResearcher, openCohorts, and saveScreenshot. See tools/d2e-playwright/README.md.
Use this only when the helper needs to be adapted. The helper already wraps this pattern. In Codex Desktop, call load_workspace_dependencies if you need the current Node or node_modules paths.
const fs = require('node:fs');
const path = require('node:path');
function requirePlaywright() {
const candidates = [
process.env.PLAYWRIGHT_MODULE,
process.env.HOME &&
path.join(
process.env.HOME,
'.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright'
),
'playwright',
].filter(Boolean);
for (const candidate of candidates) {
try {
return require(candidate);
} catch (error) {
if (error.code !== 'MODULE_NOT_FOUND') throw error;
}
}
throw new Error('Could not find Playwright. Set PLAYWRIGHT_MODULE to the package path.');
}
const { chromium } = requirePlaywright();
const storageState = '/private/tmp/d2e-playwright-login-state.json';
const headed = process.env.HEADLESS === 'false';
const browser = await chromium.launch({
headless: !headed,
executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',
slowMo: headed ? 150 : 0,
args: ['--no-sandbox', '--ignore-certificate-errors'],
});
const context = await browser.newContext({
ignoreHTTPSErrors: true,
viewport: { width: 1440, height: 900 },
...(fs.existsSync(storageState) ? { storageState } : {}),
});
const page = await context.newPage();
Use this direct login helper instead of rediscovering the login page each run:
async function gotoResearcher(page) {
await page.goto('https://localhost:41100/d2e/portal/researcher', {
waitUntil: 'domcontentloaded',
timeout: 30000,
});
await page.waitForLoadState('networkidle', { timeout: 30000 }).catch(() => {});
if (page.url().includes('/sign-in')) {
await page.locator('input[type="text"], input[name="identifier"], input[name="username"]').first().fill('admin');
await page.locator('input[type="password"]').first().fill('Updatepassword12345');
await page.locator('button[type="submit"], button:has-text("Sign in")').first().click();
await page.waitForURL('**/d2e/portal/**', { timeout: 30000 });
await page.waitForLoadState('networkidle', { timeout: 30000 }).catch(() => {});
}
if (page.url().includes('/no-access')) {
await page.reload({ waitUntil: 'domcontentloaded', timeout: 30000 });
await page.waitForLoadState('networkidle', { timeout: 30000 }).catch(() => {});
}
}
After successful login:
await context.storageState({ path: storageState });
For one-off Cohort Builder checks after login:
await gotoResearcher(page);
await page.locator('text="Demo dataset"').first().click();
await page.waitForURL('**/d2e/portal/researcher/information**', { timeout: 30000 }).catch(() => {});
await page.getByText('Cohorts', { exact: true }).first().click();
await page.waitForURL('**/d2e/portal/researcher/cohort', { timeout: 30000 }).catch(() => {});
.env*, credentials, certificates, or other secret-bearing diagnostics during verification. Use narrow DB/API queries when local state inspection is needed.Use for D2E backend function development and debugging under repos/Data2Evidence/plugins/functions, including Trex-hosted Deno/Express services, function route tracing through plugins/functions/package.json, temporary diagnostic logging, WATCH-mode function reloads, trex restart fallback, and filtered Docker logs.
Use for D2E backend function development and debugging under repos/Data2Evidence/plugins/functions, including Trex-hosted Deno/Express services, function route tracing through plugins/functions/package.json, temporary diagnostic logging, WATCH-mode function reloads, trex restart fallback, and filtered Docker logs.
Use for D2E backend function development and debugging under repos/Data2Evidence/plugins/functions, including Trex-hosted Deno/Express services, function route tracing through plugins/functions/package.json, temporary diagnostic logging, WATCH-mode function reloads, trex restart fallback, and filtered Docker logs.
Use for D2E backend function development and debugging under repos/Data2Evidence/plugins/functions, including Trex-hosted Deno/Express services, function route tracing through plugins/functions/package.json, temporary diagnostic logging, WATCH-mode function reloads, trex restart fallback, and filtered Docker logs.
Use when updating, regenerating, reviewing, or troubleshooting Data2Evidence OpenAPI specs under docs/openapi/specs and tools/d2e-openapi-spec, including source-diff review from the previous baseline, clean generation from latest origin/develop, request/response/example updates, and OpenAPI style checks.
Use when updating, regenerating, reviewing, or troubleshooting Data2Evidence OpenAPI specs under docs/openapi/specs and tools/d2e-openapi-spec, including source-diff review from the previous baseline, clean generation from latest origin/develop, request/response/example updates, and OpenAPI style checks.