/** * Jira REST API Client * * Low-level client for Jira REST API with full CRUD support. * Supports both Jira Cloud (API v3) and Jira Server (API v2). */ import { JiraConfig, ConnectionTestResult } from '../../types/integrations.js'; export interface JiraIssue { id: string; key: string; self: string; fields: JiraIssueFields; } export interface JiraIssueFields { summary: string; description?: JiraDescription | string | null; issuetype: JiraIssueType; priority?: JiraPriority; status: JiraStatus; assignee?: JiraUser | null; reporter?: JiraUser | null; labels?: string[]; components?: JiraComponent[]; duedate?: string | null; created: string; updated: string; project: JiraProject; attachment?: JiraAttachment[]; [key: string]: unknown; } export interface JiraAttachment { id: string; self: string; filename: string; author: JiraUser; created: string; size: number; mimeType: string; content: string; thumbnail?: string; } export interface JiraDescription { type: 'doc'; version: number; content: JiraDocContent[]; } export interface JiraDocContent { type: string; content?: Array<{ type: string; text?: string; }>; text?: string; } export interface JiraIssueType { id: string; name: string; description?: string; subtask: boolean; iconUrl?: string; } export interface JiraPriority { id: string; name: string; iconUrl?: string; } export interface JiraStatus { id: string; name: string; statusCategory: { id: number; key: string; name: string; }; } export interface JiraUser { accountId: string; displayName: string; emailAddress?: string; active: boolean; avatarUrls?: Record; } export interface JiraComponent { id: string; name: string; description?: string; } export interface JiraProject { id: string; key: string; name: string; projectTypeKey?: string; } export interface JiraSearchResult { startAt: number; maxResults: number; total: number; issues: JiraIssue[]; } export interface JiraCreateIssueRequest { fields: { project: { key: string; } | { id: string; }; summary: string; description?: JiraDescription | string; issuetype: { name: string; } | { id: string; }; priority?: { name: string; } | { id: string; }; assignee?: { accountId: string; } | null; reporter?: { accountId: string; } | null; labels?: string[]; components?: Array<{ name: string; } | { id: string; }>; duedate?: string; [key: string]: unknown; }; } export interface JiraUpdateIssueRequest { fields?: Partial; update?: Record>; } export interface JiraError { errorMessages: string[]; errors: Record; } export declare class JiraClient { private config; private authHeader; constructor(config: JiraConfig); private buildAuthHeader; private get baseUrl(); private get apiVersion(); private request; testConnection(): Promise; getIssue(issueIdOrKey: string, expand?: string[]): Promise; searchIssues(jql: string, options?: { startAt?: number; maxResults?: number; fields?: string[]; expand?: string[]; }): Promise; createIssue(request: JiraCreateIssueRequest): Promise; updateIssue(issueIdOrKey: string, request: JiraUpdateIssueRequest): Promise; deleteIssue(issueIdOrKey: string, deleteSubtasks?: boolean): Promise; bulkCreateIssues(issues: JiraCreateIssueRequest[]): Promise<{ issues: Array<{ id: string; key: string; self: string; } | null>; errors: Array<{ status: number; elementErrors: JiraError; } | null>; }>; getTransitions(issueIdOrKey: string): Promise<{ transitions: Array<{ id: string; name: string; to: JiraStatus; }>; }>; doTransition(issueIdOrKey: string, transitionId: string, fields?: Partial): Promise; getProjects(): Promise; getProject(projectIdOrKey: string): Promise; getIssueTypes(projectIdOrKey?: string): Promise; getPriorities(): Promise; getStatuses(projectIdOrKey?: string): Promise; getFields(): Promise>; getUsers(query: string, maxResults?: number): Promise; /** * Get attachments for an issue */ getAttachments(issueIdOrKey: string): Promise; /** * Upload attachment to an issue * @param issueIdOrKey - Issue key or ID * @param filePath - Local file path to upload * @param filename - Optional override filename */ addAttachment(issueIdOrKey: string, filePath: string, filename?: string): Promise; /** * Download attachment to local file * @param attachmentUrl - URL from attachment.content * @param outputPath - Local path to save the file */ downloadAttachment(attachmentUrl: string, outputPath: string): Promise; /** * Delete an attachment */ deleteAttachment(attachmentId: string): Promise; /** * Build JQL for fetching issues modified after a given date */ buildChangedSinceJql(since: Date, project?: string): string; /** * Convert plain text to Jira Document Format (ADF) */ static textToAdf(text: string): JiraDescription; /** * Convert Jira Document Format (ADF) to plain text */ static adfToText(adf: JiraDescription | string | null | undefined): string; }