본문으로 건너뛰기
cccskills
무료GitHub에 공개한국어 소개

cdp-verification

Chrome DevTools Protocol로 실행 중인 Electron 데스크톱 앱을 조작해 UI 변경을 확인하고 문제를 재현합니다. 실제 사용 흐름을 따라 화면 전환을 검증하고, 스크린샷과 경로·스크롤 위치·포커스·저장 상태를 기록해 비교합니다.

원문원문 설명 보기

Verify UI behavior end-to-end by driving the running desktop app over the Chrome DevTools Protocol. Use when asked to verify, reproduce, or confirm a UI change, bug, or regression in the real app rather than in tests.

ParadevAI/Paradev스타 15,724(GitHub 15,724 + cccskills 0)

실행 점수 미검증

설치 방법 보기

이럴 때 유용합니다

  • 실행 중인 앱에서 UI 문제 재현
  • 수정 후 화면 동작 확인
  • 화면 전환이 포함된 흐름 검증
  • 드래그 동작의 안정성 확인

한국어 소개

할 수 있는 일

이 스킬은 Chrome DevTools Protocol(CDP)로 실행 중인 Electron 데스크톱 앱에 연결해 실제 화면 조작으로 UI 변경을 확인하거나 문제를 재현합니다. 테스트 전에 대상 작업 공간, 렌더러 URL과 포트, 현재 경로, 로그인 상태를 확인한 뒤 보고된 절차를 그대로 따라갑니다. 조작 전후의 스크린샷과 함께 스크롤 위치, 포커스된 요소, 경로, 저장된 상태를 기록하고 화면이 측정 결과와 일치하는지 확인합니다. 경로 이동이나 패널 전환처럼 문제와 관련된 조작 흐름도 검증에 포함합니다.

이럴 때 유용합니다

테스트만으로 재현하기 어려운 UI 문제를 실제 앱에서 확인할 때 적합합니다. 드래그나 스크롤처럼 사용 중 화면 배치가 바뀌는 기능의 동작을 확인하거나, 수정 전후의 화면과 상태를 비교할 때도 사용할 수 있습니다.

사용 예시

  • “보고된 절차대로 이 UI 문제를 재현해 주세요.”
  • “수정 전후의 화면과 상태를 비교해 주세요.”
  • “작업 공간을 전환할 때의 동작을 확인해 주세요.”

주의 사항

대상은 apps/desktop의 Electron 앱입니다. 해당 작업 공간의 개발 앱과 CDP 포트가 필요합니다. 세션 확인과 인증 복구 방법은 환경에 따라 다릅니다. 개발용 인증 정보는 로컬 환경 밖으로 보내면 안 됩니다.

이 소개문은 공개된 SKILL.md를 바탕으로 AI(OpenAI Codex)가 작성했습니다. 정확한 사양은 아래 원문을 확인하세요.

문서 점검

AI가 SKILL.md의 내용에서 주의가 필요한 작업과 도입 전제를 확인했습니다. 점수는 실제로 실행한 결과(실행 검증)만으로 매깁니다.

안전성전송·삭제·명령 실행 등을 명시하고 있는가
A양호인증 정보는 로컬에서만 사용하고 비밀이나 토큰을 노출하지 말라고 명시합니다.
도입의 용이성필요한 도구나 API 키가 적고 적혀 있는가
B일부 부족작업 공간의 Electron 개발 앱과 CDP 포트가 필요하지만 설치 절차는 없습니다.

점수에는 넣지 않았습니다. 2026년 10월 29일 기준으로 AI(OpenAI Codex)가 판정했습니다. 참고용이므로 설치 전에 원문도 확인해 주세요.

평가가 다르다고 생각되면 재검토를 요청하기

어느 항목이 왜 다르다고 생각하는지 적어 주세요. 로그인은 필요 없습니다. SKILL.md와 대조해 평가를 다시 만들고 이곳에 반영합니다.

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

포함된 파일(1)

  • SKILL.md10.5 KB

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

CDP UI Verification

"Rules" below is what counts as valid evidence. "Mechanics" is how to attach to the right renderer and repair auth. apps/desktop/scripts/cdp-smoke-integrations.ts is a working example script.

Rules

  1. Target the correct app instance. Confirm and report the worktree, renderer URL/port, and active route before testing. Follow any task-provided CDP/auth guidance and verify the expected signed-in session. Another running desktop instance is not equivalent.

  2. Reproduce the exact user journey. Use real browser input and visible UI navigation for the steps the user performs. Assigning DOM properties, invoking internal app APIs, or running component-only scripts is diagnostic support, not proof of end-to-end behavior.

  3. Capture visual and numeric evidence. Take before/after screenshots paired with relevant CDP measurements (scrollTop, focused element, route, persisted state). Confirm the screenshot and the measured state agree.

  4. Exercise the relevant lifecycle. Include the actual route change, workspace/pane/file switch, remount, or close/reopen from the report. A narrower synthetic flow cannot substitute for the reported interaction.

  5. Treat a mismatch as an incomplete reproduction. If the test passes but the user still observes the bug, re-check the target instance, exact steps, input method, persisted keys, and lifecycle timing. Reproduce the failure before changing code; a synthetic smoke test does not disprove the report.

  6. Use an evidence gate. For a reported bug or regression, do not claim verification until the original interaction demonstrably fails before the fix and passes after it under the same observations. For a new feature, record equivalent baseline evidence and demonstrate the expected behavior. State clearly which checks were end-to-end, which were synthetic, and whether screenshots were actually captured.

  7. Test in the real layout, not a staged one. Do not rearrange the UI to make coordinates convenient (e.g. moving a target project next to the section under test) and then generalize from that pass. Layout-dependent failures live exactly in the configurations a staged setup removes: elements far apart, ambiguous zones between valid targets, scrolled containers, collapsed/empty states. Verify in the user's actual data shape; if a mutation was needed for setup, rerun the key journey in the unstaged arrangement too.

    Case study: sidebar drag-and-drop passed every staged test, then crashed with "Maximum update depth exceeded" in the real layout because closest-target collision oscillated across the large gap between the Pinned section and a bottom-of-list project.

  8. Drive interactions adversarially, not just happy-path. A scripted A-to-B gesture proves the feature works once, not that it is stable. For anything continuous (drag-and-drop, resize, scroll-linked UI), also test: back-and-forth oscillation across boundaries, mid-gesture dwells (hold still 0.5-1s where layout can shift under a stationary pointer), long sweeps that trigger autoscroll, repeats of the same gesture, and runs with induced main-thread stalls (setInterval busy-loop, e.g. 120ms every 400ms) to force event batching. Watch for feedback loops where the interaction's own state change re-triggers its trigger (transfer → layout shift → re-measure → transfer). Capture console.error (hook it and assert empty afterward): "Maximum update depth exceeded" and "Cannot update a component while rendering" are regressions even when the screenshot looks fine.

Mechanics

These apply to the Electron desktop app in apps/desktop.

To check a change end-to-end against the real API/DB, drive the running dev app over CDP. Launch with an unused port, for example RENDERER_REMOTE_DEBUG_PORT=9222 bun dev (full stack; the app may restore a signed-in session), then attach via the page target's webSocketDebuggerUrl over a WebSocket (Bun built-in, no deps). Example: apps/desktop/scripts/cdp-smoke-integrations.ts.

Never assume port 9222 or attach to a renderer from another worktree. Multiple Paradev workspaces commonly run at once, each with different renderer, API, and CDP ports. Before testing:

  1. Read this workspace's final DESKTOP_VITE_PORT and NEXT_PUBLIC_API_URL values from the root .env.
  2. Find the Electron process whose executable/parent command path is inside this workspace. Its renderer command line contains --remote-debugging-port=<port>; lsof -nP -iTCP -sTCP:LISTEN can confirm the owning PID.
  3. Fetch http://127.0.0.1:<port>/json/list and require a page target whose URL uses this workspace's DESKTOP_VITE_PORT. A responding CDP endpoint alone is not sufficient proof that it belongs to this branch.
  4. Pass the matched values explicitly when using a script, e.g. RENDERER_REMOTE_DEBUG_PORT=<port> NEXT_PUBLIC_API_URL=<api-origin> bun run apps/desktop/scripts/cdp-smoke-integrations.ts.

Verify /api/auth/get-session from inside the matched renderer before testing.

Repairing CDP auth

Check which setup script provisioned the workspace before repairing auth:

  • .superset/setup.local.sh creates a per-workspace local stack and runs the idempotent bun run db:seed-dev, but intentionally leaves sign-in as a separate step. If the account may be missing, rerun bun run db:seed-dev while the local DB stack is running.
  • .superset/setup.sh seeds superset-dev-data/auth-token.enc from $HOME/.superset/auth-token.enc when available. Rerunning it without --force can fill a missing token. Do not use --force merely to repair auth: it resets superset-dev-data/ before reseeding.

The desktop hydrates a persisted token into an in-memory bearer-token closure. A raw Runtime.evaluate fetch cannot read that closure, and the local-dev sign-in button persists a bearer token but uses credentials: "omit"; neither guarantees the cookie required by a raw CDP probe. For a workspace created by setup.local.sh, repair the CDP session as follows:

  1. Require a localhost API origin; never send dev credentials to a remote or shared API.
  2. From apps/desktop (so workspace imports resolve), import DEV_EMAIL and DEV_PASSWORD from @superset/shared/dev-credentials; do not copy their literal values into scripts or logs.
  3. Through Runtime.evaluate in the matched renderer, POST them to ${NEXT_PUBLIC_API_URL}/api/auth/sign-in/email with JSON content type and credentials: "include". Do not print the returned token or response body.
  4. Re-fetch /api/auth/get-session with credentials: "include" and require both session and session.activeOrganizationId before running the test.

This credentialed local-dev sign-in creates the browser session cookie needed by subsequent in-renderer fetches. If it fails, report the sign-in/session status codes only. For a non-local setup, use the app's normal sign-in flow; never substitute local dev credentials.

For a non-local workspace, the normal desktop flow intentionally restores an encrypted bearer token into the renderer's in-memory auth client without creating a browser cookie. If the renderer is on an authenticated route but a raw cookie-only probe returns no session, use Runtime.evaluate to import /lib/auth-client.ts from the renderer dev server and call authClient.getSession({ fetchOptions: { throw: false } }). This still verifies /api/auth/get-session through the app's real authenticated request path. Return only the status and session.activeOrganizationId; never call or print getAuthToken().

Do not use setup --force to fix a stale connection string, a missing CDP cookie, or a corrupt generated Next.js cache. First rerun the applicable setup script without force. If every API route returns Next.js's HTML 404, stop the dev stack, move apps/api/.next aside, and restart. --force is normally only appropriate when the user explicitly intends to replace the copied local/host databases and encrypted auth token. The stale-state signature in the next paragraph is the one explicit exception.

To run the local API against another database (a fresh Neon branch of production, say), passing DATABASE_URL in the environment is not enough: in development apps/api/next.config.ts reloads the root .env with override: true and puts the workspace's database back. The signs are "column ... does not exist" from a branch that has the column, and a sign-in that returns a user your edits on the branch no longer match. Change that database only through the root .env, or with a local, unpushed change to that guard, and check a query that only the target branch can answer. The Local Admin button signs in whichever user holds DEV_EMAIL in that database.

One failure signature where ./.superset/setup.sh --force IS the fix (verified 2026-07-28): session restore hangs at "Restoring your session", the Local Admin sign-in button returns a bodyless 500, get-session returns 200, and a raw select 1 against DATABASE_URL may still succeed; the worktree's seeded dev state (Neon branch credentials in .env, auth-token.enc, copied DBs) has gone stale as a set. Rerunning with --force recreates the Neon branch, rewrites .env, and reseeds superset-dev-data/ together, which restores sign-in. Two side effects to expect: any manual .env edits (e.g. a port remap) are wiped and must be re-applied, and superset-dev-data/ is reset.

Use Runtime.evaluate (awaitPromise, returnByValue), not Network.* interception; sniffing misses React-Query-cached responses, and refetchInterval is paused while the window is backgrounded. After verifying the session through the applicable cookie or bearer path above, run requests inside the renderer. API below is the dev backend origin (NEXT_PUBLIC_API_URL, e.g. http://localhost:5881):

  • Active org: local cookie flow uses fetch(API + "/api/auth/get-session", {credentials:"include"}); non-local bearer flow uses authClient.getSession({ fetchOptions: { throw: false } }). Require .session.activeOrganizationId.
  • A tRPC query (bypasses the cache): GET API + "/api/trpc/<proc>?batch=1&input=" + encodeURIComponent(JSON.stringify({"0":{json:<input>}})); response is [{result:{data:{json:...}}}].
  • window.location.hash nav may not remount the route; call the endpoint directly instead.

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

10x

무료요약 있음

Superset 사용 현황을 살펴보고 아직 쓰지 않는 기능 중 업무 방식에 맞는 항목을 제안합니다. 각 기능을 설명하고, 사용자가 고른 예약 실행 에이전트나 병렬 작업 공간, 공유 작업 등을 설정합니다.

  • 사용하지 않는 Superset 기능 찾기
  • 에이전트 예약 실행 설정
  • 여러 작업 공간에서 병렬 작업
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

automate

무료요약 있음

반복 작업을 Superset 자동화로 설정합니다. 에이전트 지침, 일정 또는 이벤트 조건, 실행 작업 공간을 정리하고 명시적인 확인을 받은 뒤 자동화를 만듭니다. 저장된 조건과 첫 실행 결과를 살펴 지침을 조정합니다.

  • 매일 또는 매주 작업 예약
  • GitHub에서 풀 리퀘스트가 열릴 때 실행
  • Slack의 지정된 반응을 계기로 실행
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

browser

무료요약 있음

Superset 작업 공간의 브라우저에서 페이지를 열고 클릭하거나 입력하며, 화면과 콘솔 정보를 확인합니다. 개발 중인 웹 앱 미리 보기, 폼 동작 및 화면 이동 점검에 활용할 수 있습니다.

  • 로컬 웹 앱 미리 보기
  • 페이지 화면 캡처
  • 콘솔 오류 확인
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

build-a-stripe-integration

무료요약 있음

Stripe 공식 문서와 API 매개변수 정의를 확인해 결제, 구독, 청구서, 웹훅 연동을 구현합니다. 적절한 제품 선택부터 샌드박스 테스트와 웹훅 처리까지 다루며, 결제와 구독 상태를 웹훅 이벤트로 판단합니다.

  • 정기 결제에 맞는 Stripe 제품 선택
  • Checkout 또는 청구서 처리 구현
  • 오작동하는 Stripe 연동 조사
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

ci-triage

무료요약 있음

GitHub Actions 실패 로그에서 최초 오류를 찾아 코드 결함, 환경 문제, 간헐적 실패, 기존 장애로 구분합니다. 기준 브랜치와 PR 변경 사항을 비교해 관련성을 설명하고 다음 조치를 정리합니다.

  • PR 검사 실패 원인 조사
  • 불안정한 테스트와 코드 결함 구분
  • 기준 브랜치의 기존 장애 확인
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

computer

무료요약 있음

실제 데스크톱 화면을 읽고 컨트롤을 식별해 클릭, 입력, 메뉴 선택, 창 배치를 수행하며 매번 결과를 확인합니다. 설정 변경, 앱 작업, 로그인된 시스템 브라우저를 통한 전체 흐름 점검에 사용할 수 있습니다.

  • 데스크톱 설정 변경
  • 앱에서 저장하거나 글자 입력
  • 화면 확인 또는 창 배치
ParadevAI/Paradev1.6만2026년 10월 29일 업데이트

ParadevAI의 스킬 모두 보기

이 스킬의 문제 신고