CtrlK
BlogDocsLog inGet started
Tessl Logo

testland/bug-tracker-workflow

Files, transitions, and searches bugs in the team's tracker - Jira, Linear, GitHub Issues, or Azure DevOps - through one tracker-agnostic workflow: authenticate, dedupe-search before creating, create with severity/priority classification, transition lifecycle states, and wire idempotent CI-driven filing from test failures. Jira Cloud REST API v3 is worked in full in the body (ADF descriptions, runtime transition lookup, JQL triage and duplicate queries, dry-run bulk transitions); Linear's GraphQL API (issueCreate/issueUpdate, workflowStates resolved by type, the 0-4 priority enum), GitHub Issues REST (open/closed + state_reason, label-based severity/priority), and Azure DevOps Work Item Tracking (JSON Patch, WIQL, process-template states) each have a deep reference. Use when programmatically managing the bug lifecycle on any of the four trackers: creating from CI failures, triaging queues, transitioning states, or dedupe-searching.

94

1.01x
Quality

96%

Does it follow best practices?

Impact

94%

1.01x

Average score across 10 eval scenarios

SecuritybySnyk

Low

Low-risk findings worth noting

Overview
Quality
Evals
Security
Files

jira.mdreferences/

Jira Cloud REST API v3 - field details

Deep Jira specifics for bug-tracker-workflow. Auth setup, create, transition, and JQL search stay in SKILL.md; this file holds the custom-field, update, and result-parsing detail.

Severity custom field

severity is usually a custom field, not the built-in priority. Discover the field ID once per tenant:

curl -u "$JIRA_EMAIL:$JIRA_TOKEN" \
     "$JIRA_BASE/rest/api/3/field" \
     | jq '.[] | select(.name=="Severity") | {id, name}'
# {"id": "customfield_10039", "name": "Severity"}

Then submit it in the create payload:

"customfield_10039": {"value": severity},  # "Critical" | "High" | ...

Update fields

PUT /rest/api/3/issue/{key} for arbitrary field updates:

def update_priority(issue_key, priority_name):
    r = requests.put(
        f"{BASE}/rest/api/3/issue/{issue_key}",
        json={"fields": {"priority": {"name": priority_name}}},
        headers=HEADERS,
    )
    r.raise_for_status()

Parsing results

create_bug returns the new issue key (e.g. ENG-12345). Build a permalink:

url = f"{BASE}/browse/{issue_key}"

Search responses include expand, total, startAt, and issues (the array). Always check total against maxResults for pagination.

Field-spec notes

  • ADF descriptions. Rich descriptions (code blocks, tables) need full ADF construction - see developer.atlassian.com/cloud/jira/platform/apis/document/structure.
  • JQL injection. text ~ "user input" accepts JQL operators - always escape quotes and reserved characters before interpolating.

SKILL.md

tile.json