Skip to content

Jira, Linear and GitHub

Connect an issue tracker to a project to do two things:

  • File failures as issues. A failed run, or a whole failure cause in Triage, becomes an issue with the error, steps, AI explanation and a link back to the run.
  • Turn issues into tests. Paste an issue (or, for Jira, a JQL search) and the AI drafts plain-English tests from it.

Connections are per project. Each tracker has its own credentials, stored encrypted.

  1. Open the project’s Settings → Integrations. You need the admin role.
  2. Click Jira, Linear or GitHub under Issue trackers.
  3. Fill in the fields (below) and click Test connection. Plainwright checks the credentials with the tracker and tells you what it found.
  4. Click Connect (or Save when editing).

Settings → Integrations: Jira and GitHub connected, Linear, Figma, Notion and the test inbox not yet connected

Jira Cloud, using the REST API v3.

Field Required Notes
Site URL Yes https://<your-site>.atlassian.net
Account email Yes The Atlassian account the token belongs to
API token Yes Create one in your Atlassian account under Security → API tokens
Project key To file issues Where filed issues go, such as SHOP. Upper-cased for you.
Issue type No Default Bug

Test connection calls /rest/api/3/myself and, if you gave a project key, checks the project exists. Filed issues get the label plainwright.

The Jira drawer: site URL, account email, a saved API token shown as dots, project key SHOP, issue type, the Enabled switch, and Disconnect, Test connection and Save

  • Saved secrets are never shown again. The field says Saved (••••). Leave blank to keep it; type a new value only to replace it. Passwords are always fully masked; for tokens of 16 or more characters, admins also see the last 4 characters.
  • Changing the server address needs the secret again. If you change the site URL, API URL, host or port of a saved connection, type the token or password again too: Plainwright never sends stored credentials to a new address. Saving without it fails with “Re-enter the token / password when changing the server address”, and Test connection reports the same without contacting the new address.
  • The Enabled switch pauses a connection without deleting it. A paused tracker can’t receive issues or be imported from.
  • Disconnect deletes the connection and its stored credentials.

With a tracker connected, a File issue button appears on failed runs and in the Triage drawer for each failure cause. Plainwright files one issue per cause and reuses it afterwards, and it removes project secrets and the tracker’s credentials from the text first. What goes into the issue, and the de-duplication rules, are described in Triage and issues.

To file without clicking, turn on Auto-file issues for new failure clusters in Settings → Notifications and pick the tracker. Each new failure cause then gets one issue automatically; see File issues automatically.

  1. In a module, click New test, then Import (or use Crawler → issue or design).
  2. Pick the tracker and paste a reference (formats below).
  3. Click Suggest tests. One AI call reads the issue and drafts up to five tests.
  4. Review the drafts, untick any you don’t want, choose the module if asked, and click Add N tests.

The drafts are created as Web UI tests. Each one records where it came from (source is jira, linear or github, and source_ref is the issue URL), so you can trace a test back to its requirement.

Tracker You can paste What is read
Jira An issue key (SHOP-142), an issue URL, or a JQL query (project = SHOP AND labels = checkout, optionally prefixed jql:) Summary, type, status, labels, description and the last 5 comments. A JQL search reads up to 10 matching issues, without comments.
Linear An issue ID (ENG-123) or URL Title, status, labels, description and up to 10 comments
GitHub #123, 123, owner/repo#123, or an issue or pull request URL Title, state, labels, body and up to 10 comments

The text sent to the AI is capped at 12,000 characters, and project secret values in it are replaced with ••••. The project’s base URL is included, so the drafts know which app they test.

Endpoint Role Does
GET /api/integrations/project/{project_id} viewer Every kind with configured, enabled, masked config and capabilities
PUT /api/integrations/project/{project_id}/{kind} admin Save {config, enabled}; masked values keep the stored secret
POST /api/integrations/project/{project_id}/{kind}/test admin {ok, message}. Send {"config": {...}} to test unsaved values.
DELETE /api/integrations/project/{project_id}/{kind} admin Disconnect
POST /api/connectors/preview editor Fetch a source and draft tests (one AI call)
POST /api/crawler/create editor Create the drafts you picked

kind is one of jira, linear, github, figma, notion or imap.

Terminal window
# Connect Jira (admin)
curl -fsS -X PUT "$PLAINWRIGHT_URL/api/integrations/project/$PROJECT_ID/jira" \
-H "Authorization: Bearer $PLAINWRIGHT_TOKEN" -H "Content-Type: application/json" \
-d '{"enabled": true, "config": {"base_url": "https://acme.atlassian.net", "email": "qa@acme.example",
"api_token": "'"$JIRA_API_TOKEN"'", "project_key": "SHOP", "issue_type": "Bug"}}'
# Draft tests from an issue (editor, one AI call)
curl -fsS -X POST "$PLAINWRIGHT_URL/api/connectors/preview" \
-H "Authorization: Bearer $PLAINWRIGHT_TOKEN" -H "Content-Type: application/json" \
-d '{"project_id": "'"$PROJECT_ID"'", "kind": "jira", "ref": "SHOP-142", "count": 5}'

count is 1–10 (default 5). The preview returns the source and the drafts:

Preview response (trimmed)
{
"source": { "kind": "jira", "ref": "SHOP-142", "title": "SHOP-142: Pay with a saved card", "url": "https://acme.atlassian.net/browse/SHOP-142", "excerpt": "SHOP-142: Pay with a saved card …" },
"suggestions": [
{ "name": "Pay with a saved card", "description": "…", "complexity": "medium", "flow": "checkout",
"natural_language": "Sign in as a customer with a saved card, add a product to the cart, choose the saved card and pay. Check that the receipt page shows an order number.",
"kind": "ui", "source": "jira", "source_ref": "https://acme.atlassian.net/browse/SHOP-142" }
]
}

Create the ones you want by passing them, unchanged, to the crawler’s create endpoint:

Terminal window
curl -fsS -X POST "$PLAINWRIGHT_URL/api/crawler/create" \
-H "Authorization: Bearer $PLAINWRIGHT_TOKEN" -H "Content-Type: application/json" \
-d '{"module_id": "'"$MODULE_ID"'", "suggestions": [ …the suggestion objects… ]}'
  • Jira support targets Jira Cloud (REST v3 and the /rest/api/3/search/jql search). Jira Server and Data Center aren’t specifically supported.
  • Linear’s OAuth flow isn’t built in; paste a token.
  • Requests to trackers time out after 20 seconds and don’t follow redirects.