Files
replypier/.claude/skills/write-e2e-test/SKILL.md
T
WangShen007 20fef2b9f3 chore: settle product naming across app, widget and deployments
One word everywhere: ReplyPier in UI copy, package and image names, the
replypier.site domains (app/api/docs/help), REPLYPIER_* settings and the
--rp-* design tokens.

- public widget API is window.ReplyPier with replypierId / replypierBaseUrl /
  replypierConfig / replypierToken, loader at webclient/replypier.min.js;
  both bundles rebuilt from source
- NOTICE, llms.txt, CONTRIBUTING, HELP_CENTER_INFRA and the demo runtime
  config rewritten; the demo config ships no third-party keys
- migration adds the ReplyPier managed model value to the AI model enum
- local compose project, database, role, volume and Docker network carry the
  same name
2026-10-26 00:57:22 +08:00

2.1 KiB

name, description
name description
write-e2e-test Write or change a ReplyPier Playwright end-to-end test (e2e/). Use when adding e2e coverage for a feature, fixing a failing e2e spec, or adding a page object, fixture or fake-LLM script.

Writing a ReplyPier e2e test

The suite lives in e2e/. Read e2e/AUTHORING.md first — it is the source of truth for layout and rules. The essentials:

  1. Specs speak product language. specs/<feature>/<name>.spec.ts, imports only from @e2e, no selectors (page.locator) and no raw HTTP — lint fails otherwise. Title ends with tags: @<feature>, plus @smoke only for the few journeys that must run on every PR.
  2. Selectors go in src/pages/ (a screen) or src/components/ (shared UI). Prefer getByRole/getByLabel; if the element has no accessible name, add an aria-label to the Vue component rather than reaching for CSS. CSS needs a one-line "why" comment.
  3. Seed through src/api/, assert through the UI. Need a new endpoint? Add a function to the matching src/api/*.ts module.
  4. Script the AI with llm.script(agent, s => …) — reply, handOver, createTicket, callTool(...).thenReply(...). Replies are structured ChatResponse JSON; handover and tickets are boolean fields, not tool calls.
  5. Fixtures give each test its own agent + widget. test.use({ agentSettings: { transferToHuman: true } }) for handover. inbox is Sam Agent's dashboard in a second browser. Never change org-wide settings outside a *.org.spec.ts.
  6. Prove it is stable before finishing: cd e2e && npx playwright test specs/<feature> --repeat-each=10 && npm run lint && npm run typecheck (start the stack once with ./scripts/stack.sh up; in a Claude worktree pass E2E_PYTHON and E2E_FRONTEND_NODE_MODULES pointing at the main checkout, and run with the sandbox disabled — Postgres, ports and the node_modules symlink need it).
  7. Update e2e/FEATURES.md — the row for the journey, with the spec path and ✅.

Enterprise specs live in the private enterprise_frontend repo under e2e/, import only from @e2e, and must never be added to this public repo.