@geeveeh/atlassian-tools 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +228 -0
  3. package/dist/cli/confluence.d.ts +3 -0
  4. package/dist/cli/confluence.d.ts.map +1 -0
  5. package/dist/cli/confluence.js +209 -0
  6. package/dist/cli/confluence.js.map +1 -0
  7. package/dist/cli/helpers.d.ts +3 -0
  8. package/dist/cli/helpers.d.ts.map +1 -0
  9. package/dist/cli/helpers.js +24 -0
  10. package/dist/cli/helpers.js.map +1 -0
  11. package/dist/cli/index.d.ts +3 -0
  12. package/dist/cli/index.d.ts.map +1 -0
  13. package/dist/cli/index.js +12 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/jira.d.ts +3 -0
  16. package/dist/cli/jira.d.ts.map +1 -0
  17. package/dist/cli/jira.js +264 -0
  18. package/dist/cli/jira.js.map +1 -0
  19. package/dist/confluence/client.d.ts +16 -0
  20. package/dist/confluence/client.d.ts.map +1 -0
  21. package/dist/confluence/client.js +92 -0
  22. package/dist/confluence/client.js.map +1 -0
  23. package/dist/confluence/index.d.ts +3 -0
  24. package/dist/confluence/index.d.ts.map +1 -0
  25. package/dist/confluence/index.js +3 -0
  26. package/dist/confluence/index.js.map +1 -0
  27. package/dist/confluence/types.d.ts +46 -0
  28. package/dist/confluence/types.d.ts.map +1 -0
  29. package/dist/confluence/types.js +2 -0
  30. package/dist/confluence/types.js.map +1 -0
  31. package/dist/core/auth.d.ts +3 -0
  32. package/dist/core/auth.d.ts.map +1 -0
  33. package/dist/core/auth.js +22 -0
  34. package/dist/core/auth.js.map +1 -0
  35. package/dist/core/client.d.ts +9 -0
  36. package/dist/core/client.d.ts.map +1 -0
  37. package/dist/core/client.js +40 -0
  38. package/dist/core/client.js.map +1 -0
  39. package/dist/core/index.d.ts +5 -0
  40. package/dist/core/index.d.ts.map +1 -0
  41. package/dist/core/index.js +5 -0
  42. package/dist/core/index.js.map +1 -0
  43. package/dist/core/markdown.d.ts +15 -0
  44. package/dist/core/markdown.d.ts.map +1 -0
  45. package/dist/core/markdown.js +83 -0
  46. package/dist/core/markdown.js.map +1 -0
  47. package/dist/core/types.d.ts +22 -0
  48. package/dist/core/types.d.ts.map +1 -0
  49. package/dist/core/types.js +12 -0
  50. package/dist/core/types.js.map +1 -0
  51. package/dist/jira/client.d.ts +18 -0
  52. package/dist/jira/client.d.ts.map +1 -0
  53. package/dist/jira/client.js +86 -0
  54. package/dist/jira/client.js.map +1 -0
  55. package/dist/jira/helpers.d.ts +5 -0
  56. package/dist/jira/helpers.d.ts.map +1 -0
  57. package/dist/jira/helpers.js +35 -0
  58. package/dist/jira/helpers.js.map +1 -0
  59. package/dist/jira/index.d.ts +4 -0
  60. package/dist/jira/index.d.ts.map +1 -0
  61. package/dist/jira/index.js +4 -0
  62. package/dist/jira/index.js.map +1 -0
  63. package/dist/jira/types.d.ts +68 -0
  64. package/dist/jira/types.d.ts.map +1 -0
  65. package/dist/jira/types.js +2 -0
  66. package/dist/jira/types.js.map +1 -0
  67. package/dist/mcp/index.d.ts +3 -0
  68. package/dist/mcp/index.d.ts.map +1 -0
  69. package/dist/mcp/index.js +367 -0
  70. package/dist/mcp/index.js.map +1 -0
  71. package/package.json +50 -0
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Lightweight Markdown → Confluence storage format converter.
3
+ *
4
+ * Handles the most common patterns. For full fidelity, consider
5
+ * adding a proper parser (e.g. marked/remark) later.
6
+ */
7
+ export function markdownToStorage(md) {
8
+ let html = md;
9
+ // Code blocks (fenced) — must come before inline processing
10
+ html = html.replace(/```(\w+)?\n([\s\S]*?)```/g, (_match, lang, code) => {
11
+ const langAttr = lang
12
+ ? `<ac:parameter ac:name="language">${lang}</ac:parameter>`
13
+ : "";
14
+ return (`<ac:structured-macro ac:name="code">` +
15
+ `${langAttr}<ac:plain-text-body><![CDATA[${code.trimEnd()}]]></ac:plain-text-body>` +
16
+ `</ac:structured-macro>`);
17
+ });
18
+ // Headings
19
+ html = html.replace(/^######\s+(.+)$/gm, "<h6>$1</h6>");
20
+ html = html.replace(/^#####\s+(.+)$/gm, "<h5>$1</h5>");
21
+ html = html.replace(/^####\s+(.+)$/gm, "<h4>$1</h4>");
22
+ html = html.replace(/^###\s+(.+)$/gm, "<h3>$1</h3>");
23
+ html = html.replace(/^##\s+(.+)$/gm, "<h2>$1</h2>");
24
+ html = html.replace(/^#\s+(.+)$/gm, "<h1>$1</h1>");
25
+ // Bold & italic
26
+ html = html.replace(/\*\*\*(.+?)\*\*\*/g, "<strong><em>$1</em></strong>");
27
+ html = html.replace(/\*\*(.+?)\*\*/g, "<strong>$1</strong>");
28
+ html = html.replace(/\*(.+?)\*/g, "<em>$1</em>");
29
+ // Inline code
30
+ html = html.replace(/`([^`]+)`/g, "<code>$1</code>");
31
+ // Links
32
+ html = html.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
33
+ // Unordered list items (simple, non-nested)
34
+ html = html.replace(/^(?:- |\* )(.+)$/gm, "<li>$1</li>");
35
+ // Wrap consecutive <li> in <ul>
36
+ html = html.replace(/(<li>.*<\/li>\n?)+/g, (match) => `<ul>\n${match}</ul>\n`);
37
+ // Paragraphs: wrap remaining plain lines
38
+ const lines = html.split("\n");
39
+ const result = [];
40
+ for (const line of lines) {
41
+ const trimmed = line.trim();
42
+ if (trimmed === "" ||
43
+ trimmed.startsWith("<h") ||
44
+ trimmed.startsWith("<ul") ||
45
+ trimmed.startsWith("</ul") ||
46
+ trimmed.startsWith("<li") ||
47
+ trimmed.startsWith("<ac:") ||
48
+ trimmed.startsWith("</ac:") ||
49
+ trimmed.startsWith("<p>") ||
50
+ trimmed.startsWith("<table")) {
51
+ result.push(line);
52
+ }
53
+ else {
54
+ result.push(`<p>${trimmed}</p>`);
55
+ }
56
+ }
57
+ return result
58
+ .join("\n")
59
+ .replace(/\n{3,}/g, "\n\n")
60
+ .trim();
61
+ }
62
+ /**
63
+ * Read content from a file path or treat as inline content.
64
+ * If the string ends in .md, read the file and convert.
65
+ * If it ends in .html or .xml, read the file as-is (assume storage format).
66
+ * Otherwise treat it as inline markdown and convert.
67
+ */
68
+ export async function resolveBody(input) {
69
+ const { readFile } = await import("node:fs/promises");
70
+ if (input.endsWith(".md")) {
71
+ const content = await readFile(input, "utf-8");
72
+ return markdownToStorage(content);
73
+ }
74
+ if (input.endsWith(".html") || input.endsWith(".xml")) {
75
+ return readFile(input, "utf-8");
76
+ }
77
+ // Inline content — if it looks like HTML, pass through; otherwise convert
78
+ if (input.trimStart().startsWith("<")) {
79
+ return input;
80
+ }
81
+ return markdownToStorage(input);
82
+ }
83
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/core/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export interface AtlassianConfig {
2
+ baseUrl: string;
3
+ email: string;
4
+ token: string;
5
+ }
6
+ export interface PaginatedResponse<T> {
7
+ results: T[];
8
+ _links?: {
9
+ next?: string;
10
+ };
11
+ }
12
+ export interface ApiError {
13
+ statusCode: number;
14
+ message: string;
15
+ data?: unknown;
16
+ }
17
+ export declare class AtlassianApiError extends Error {
18
+ statusCode: number;
19
+ data?: unknown | undefined;
20
+ constructor(statusCode: number, message: string, data?: unknown | undefined);
21
+ }
22
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAID,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5B;AAED,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,qBAAa,iBAAkB,SAAQ,KAAK;IAEjC,UAAU,EAAE,MAAM;IAElB,IAAI,CAAC,EAAE,OAAO;gBAFd,UAAU,EAAE,MAAM,EACzB,OAAO,EAAE,MAAM,EACR,IAAI,CAAC,EAAE,OAAO,YAAA;CAKxB"}
@@ -0,0 +1,12 @@
1
+ // ── Shared Atlassian types ──────────────────────────────────────────
2
+ export class AtlassianApiError extends Error {
3
+ statusCode;
4
+ data;
5
+ constructor(statusCode, message, data) {
6
+ super(`Atlassian API ${statusCode}: ${message}`);
7
+ this.statusCode = statusCode;
8
+ this.data = data;
9
+ this.name = "AtlassianApiError";
10
+ }
11
+ }
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,uEAAuE;AAqBvE,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAEjC;IAEA;IAHT,YACS,UAAkB,EACzB,OAAe,EACR,IAAc;QAErB,KAAK,CAAC,iBAAiB,UAAU,KAAK,OAAO,EAAE,CAAC,CAAC;QAJ1C,eAAU,GAAV,UAAU,CAAQ;QAElB,SAAI,GAAJ,IAAI,CAAU;QAGrB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,18 @@
1
+ import { AtlassianConfig } from "../core/types.js";
2
+ import { JiraProject, JiraIssue, JiraTransition, IssueCreateInput, IssueUpdateInput, IssueSearchOptions } from "./types.js";
3
+ export declare class JiraClient {
4
+ private readonly http;
5
+ constructor(config: AtlassianConfig);
6
+ verifyConnection(): Promise<JiraProject[]>;
7
+ listProjects(limit?: number): Promise<JiraProject[]>;
8
+ getIssue(issueKey: string): Promise<JiraIssue>;
9
+ searchIssues(options: IssueSearchOptions): Promise<JiraIssue[]>;
10
+ createIssue(input: IssueCreateInput): Promise<JiraIssue>;
11
+ updateIssue(input: IssueUpdateInput): Promise<JiraIssue>;
12
+ getTransitions(issueKey: string): Promise<JiraTransition[]>;
13
+ transitionIssue(issueKey: string, transitionId: string): Promise<void>;
14
+ deleteIssue(issueKey: string): Promise<void>;
15
+ descriptionToText(issue: JiraIssue): string;
16
+ issueUrl(issueKey: string, baseUrl: string): string;
17
+ }
18
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/jira/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EACL,WAAW,EACX,SAAS,EACT,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAiBpB,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkB;gBAE3B,MAAM,EAAE,eAAe;IAM7B,gBAAgB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAS1C,YAAY,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAShD,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAM9C,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAgB/D,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;IAqBxD,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAC;IAkBxD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAO3D,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAStE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASlD,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM;IAI3C,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM;CAGpD"}
@@ -0,0 +1,86 @@
1
+ import { AtlassianClient } from "../core/client.js";
2
+ import { textToAdf, adfToText, buildJql } from "./helpers.js";
3
+ export class JiraClient {
4
+ http;
5
+ constructor(config) {
6
+ this.http = new AtlassianClient(config);
7
+ }
8
+ // ── Authentication check ─────────────────────────────────────────
9
+ async verifyConnection() {
10
+ const result = await this.http.request("/rest/api/3/project/search?maxResults=5");
11
+ return result.values;
12
+ }
13
+ // ── Projects ─────────────────────────────────────────────────────
14
+ async listProjects(limit = 25) {
15
+ const result = await this.http.request(`/rest/api/3/project/search?maxResults=${limit}`);
16
+ return result.values;
17
+ }
18
+ // ── Issues ───────────────────────────────────────────────────────
19
+ async getIssue(issueKey) {
20
+ return this.http.request(`/rest/api/3/issue/${encodeURIComponent(issueKey)}`);
21
+ }
22
+ async searchIssues(options) {
23
+ const jql = buildJql(options);
24
+ const params = new URLSearchParams({
25
+ jql,
26
+ maxResults: String(options.limit ?? 25),
27
+ fields: "summary,status,issuetype,priority,assignee,reporter,created,updated,labels",
28
+ });
29
+ const result = await this.http.request(`/rest/api/3/search?${params.toString()}`);
30
+ return result.issues;
31
+ }
32
+ // ── Create ───────────────────────────────────────────────────────
33
+ async createIssue(input) {
34
+ const fields = {
35
+ project: { key: input.projectKey },
36
+ issuetype: { name: input.issueType },
37
+ summary: input.summary,
38
+ };
39
+ if (input.description)
40
+ fields.description = textToAdf(input.description);
41
+ if (input.priority)
42
+ fields.priority = { name: input.priority };
43
+ if (input.labels)
44
+ fields.labels = input.labels;
45
+ if (input.assigneeId)
46
+ fields.assignee = { accountId: input.assigneeId };
47
+ const created = await this.http.request("/rest/api/3/issue", { method: "POST", body: JSON.stringify({ fields }) });
48
+ return this.getIssue(created.key);
49
+ }
50
+ // ── Update ───────────────────────────────────────────────────────
51
+ async updateIssue(input) {
52
+ const fields = {};
53
+ if (input.summary)
54
+ fields.summary = input.summary;
55
+ if (input.description)
56
+ fields.description = textToAdf(input.description);
57
+ if (input.priority)
58
+ fields.priority = { name: input.priority };
59
+ if (input.labels)
60
+ fields.labels = input.labels;
61
+ if (input.assigneeId)
62
+ fields.assignee = { accountId: input.assigneeId };
63
+ await this.http.request(`/rest/api/3/issue/${encodeURIComponent(input.issueKey)}`, { method: "PUT", body: JSON.stringify({ fields }) });
64
+ return this.getIssue(input.issueKey);
65
+ }
66
+ // ── Transitions ──────────────────────────────────────────────────
67
+ async getTransitions(issueKey) {
68
+ const result = await this.http.request(`/rest/api/3/issue/${encodeURIComponent(issueKey)}/transitions`);
69
+ return result.transitions;
70
+ }
71
+ async transitionIssue(issueKey, transitionId) {
72
+ await this.http.request(`/rest/api/3/issue/${encodeURIComponent(issueKey)}/transitions`, { method: "POST", body: JSON.stringify({ transition: { id: transitionId } }) });
73
+ }
74
+ // ── Delete ───────────────────────────────────────────────────────
75
+ async deleteIssue(issueKey) {
76
+ await this.http.request(`/rest/api/3/issue/${encodeURIComponent(issueKey)}`, { method: "DELETE" });
77
+ }
78
+ // ── Helpers ──────────────────────────────────────────────────────
79
+ descriptionToText(issue) {
80
+ return adfToText(issue.fields.description);
81
+ }
82
+ issueUrl(issueKey, baseUrl) {
83
+ return `${baseUrl}/browse/${issueKey}`;
84
+ }
85
+ }
86
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/jira/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { IssueSearchOptions } from "./types.js";
2
+ export declare function textToAdf(text: string): unknown;
3
+ export declare function adfToText(adf: unknown): string;
4
+ export declare function buildJql(options: IssueSearchOptions): string;
5
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/jira/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAS/C;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAS9C;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAU5D"}
@@ -0,0 +1,35 @@
1
+ export function textToAdf(text) {
2
+ return {
3
+ type: "doc",
4
+ version: 1,
5
+ content: text.split("\n\n").map((paragraph) => ({
6
+ type: "paragraph",
7
+ content: [{ type: "text", text: paragraph }],
8
+ })),
9
+ };
10
+ }
11
+ export function adfToText(adf) {
12
+ if (!adf || typeof adf !== "object")
13
+ return "";
14
+ const doc = adf;
15
+ if (!doc.content)
16
+ return "";
17
+ return doc.content
18
+ .map((block) => (block.content ?? []).map((inline) => inline.text ?? "").join(""))
19
+ .join("\n\n");
20
+ }
21
+ export function buildJql(options) {
22
+ if (options.jql)
23
+ return options.jql;
24
+ const clauses = [];
25
+ if (options.project)
26
+ clauses.push(`project = "${options.project}"`);
27
+ if (options.status)
28
+ clauses.push(`status = "${options.status}"`);
29
+ if (options.assignee)
30
+ clauses.push(`assignee = "${options.assignee}"`);
31
+ if (options.type)
32
+ clauses.push(`issuetype = "${options.type}"`);
33
+ return clauses.join(" AND ");
34
+ }
35
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/jira/helpers.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO;QACL,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;SAC7C,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAY;IACpC,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IAC/C,MAAM,GAAG,GAAG,GAAkE,CAAC;IAC/E,IAAI,CAAC,GAAG,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAC5B,OAAO,GAAG,CAAC,OAAO;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAClE;SACA,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,OAA2B;IAClD,IAAI,OAAO,CAAC,GAAG;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC;IAEpC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,OAAO;QAAE,OAAO,CAAC,IAAI,CAAC,cAAc,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;IACpE,IAAI,OAAO,CAAC,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,eAAe,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,IAAI;QAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC;IAEhE,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { JiraClient } from "./client.js";
2
+ export { textToAdf, adfToText, buildJql } from "./helpers.js";
3
+ export * from "./types.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jira/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC9D,cAAc,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { JiraClient } from "./client.js";
2
+ export { textToAdf, adfToText, buildJql } from "./helpers.js";
3
+ export * from "./types.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/jira/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC9D,cAAc,YAAY,CAAC"}
@@ -0,0 +1,68 @@
1
+ export interface JiraProject {
2
+ id: string;
3
+ key: string;
4
+ name: string;
5
+ projectTypeKey: string;
6
+ style: string;
7
+ }
8
+ export interface JiraIssue {
9
+ id: string;
10
+ key: string;
11
+ self: string;
12
+ fields: {
13
+ summary: string;
14
+ description?: unknown;
15
+ status: {
16
+ name: string;
17
+ };
18
+ issuetype: {
19
+ name: string;
20
+ };
21
+ priority?: {
22
+ name: string;
23
+ };
24
+ assignee?: {
25
+ displayName: string;
26
+ accountId: string;
27
+ };
28
+ reporter?: {
29
+ displayName: string;
30
+ };
31
+ created: string;
32
+ updated: string;
33
+ labels?: string[];
34
+ };
35
+ }
36
+ export interface JiraTransition {
37
+ id: string;
38
+ name: string;
39
+ to: {
40
+ name: string;
41
+ };
42
+ }
43
+ export interface IssueCreateInput {
44
+ projectKey: string;
45
+ issueType: string;
46
+ summary: string;
47
+ description?: string;
48
+ priority?: string;
49
+ labels?: string[];
50
+ assigneeId?: string;
51
+ }
52
+ export interface IssueUpdateInput {
53
+ issueKey: string;
54
+ summary?: string;
55
+ description?: string;
56
+ priority?: string;
57
+ labels?: string[];
58
+ assigneeId?: string;
59
+ }
60
+ export interface IssueSearchOptions {
61
+ jql?: string;
62
+ project?: string;
63
+ status?: string;
64
+ assignee?: string;
65
+ type?: string;
66
+ limit?: number;
67
+ }
68
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/jira/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QACzB,SAAS,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5B,QAAQ,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5B,QAAQ,CAAC,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAA;SAAE,CAAC;QACtD,QAAQ,CAAC,EAAE;YAAE,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC;QACnC,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/jira/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":""}