Issue Tracking
import { linear, githubIssues, jira, canLinkPr, canListTriageHistory } from "@swenyai/providers/issue-tracking";Interface
Section titled “Interface”interface IssueTrackingProvider { verifyAccess(): Promise<void>; createIssue(opts: IssueCreateOptions): Promise<Issue>; getIssue(identifier: string): Promise<Issue>; updateIssue(issueId: string, opts: IssueUpdateOptions): Promise<void>; searchIssues(opts: IssueSearchOptions): Promise<Issue[]>; addComment(issueId: string, body: string): Promise<void>;}Optional capabilities
Section titled “Optional capabilities”interface PrLinkCapable { linkPr(issueId: string, prUrl: string, prNumber: number): Promise<void>;}
interface FingerprintCapable { searchByFingerprint(projectId: string, errorPattern: string): Promise<Issue[]>;}
interface TriageHistoryCapable { listTriageHistory(projectId: string, labelId: string, days?: number): Promise<TriageHistoryEntry[]>;}Use type guards to check capabilities at runtime:
if (canLinkPr(tracker)) { await tracker.linkPr(issue.id, prUrl, prNumber);}Linear
Section titled “Linear”const tracker = linear({ apiKey: process.env.LINEAR_API_KEY!, logger: myLogger,});Supports all optional capabilities: PrLinkCapable, FingerprintCapable, TriageHistoryCapable.
Creating an issue
Section titled “Creating an issue”const issue = await tracker.createIssue({ title: "NullPointerException in WebhookHandler.process()", description: "312 occurrences in the last 24h. Root cause: missing null check on refund payload.", teamId: "TEAM-UUID", labelIds: ["bug-label-uuid", "triage-label-uuid"], priority: 2, // High});// issue.identifier → "ENG-456"// issue.url → "https://linear.app/team/issue/ENG-456"Searching for duplicates
Section titled “Searching for duplicates”const existing = await tracker.searchIssues({ query: "NullPointerException WebhookHandler", projectId: "TEAM-UUID",});// Returns matching issues — SWEny uses this for duplicate detectionGitHub Issues
Section titled “GitHub Issues”const tracker = githubIssues({ token: process.env.GITHUB_TOKEN!, owner: "your-org", repo: "your-repo", logger: myLogger,});Supports PrLinkCapable.
const tracker = jira({ baseUrl: "https://mycompany.atlassian.net", email: "bot@mycompany.com", apiToken: process.env.JIRA_API_TOKEN!, logger: myLogger,});Supports PrLinkCapable. Uses the Jira REST API v3. Native fetch only.