@paysdoc/devplatform 1.0.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 (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +122 -0
  3. package/dist/git/bootstrapIdentity.d.ts +50 -0
  4. package/dist/git/bootstrapIdentity.d.ts.map +1 -0
  5. package/dist/git/bootstrapIdentity.js +72 -0
  6. package/dist/git/bootstrapIdentity.js.map +1 -0
  7. package/dist/git/branchOps.d.ts +27 -0
  8. package/dist/git/branchOps.d.ts.map +1 -0
  9. package/dist/git/branchOps.js +91 -0
  10. package/dist/git/branchOps.js.map +1 -0
  11. package/dist/git/claimOps.d.ts +40 -0
  12. package/dist/git/claimOps.d.ts.map +1 -0
  13. package/dist/git/claimOps.js +44 -0
  14. package/dist/git/claimOps.js.map +1 -0
  15. package/dist/git/commitOps.d.ts +35 -0
  16. package/dist/git/commitOps.d.ts.map +1 -0
  17. package/dist/git/commitOps.js +131 -0
  18. package/dist/git/commitOps.js.map +1 -0
  19. package/dist/git/consoleLogger.d.ts +8 -0
  20. package/dist/git/consoleLogger.d.ts.map +1 -0
  21. package/dist/git/consoleLogger.js +9 -0
  22. package/dist/git/consoleLogger.js.map +1 -0
  23. package/dist/git/gitContext.d.ts +150 -0
  24. package/dist/git/gitContext.d.ts.map +1 -0
  25. package/dist/git/gitContext.js +405 -0
  26. package/dist/git/gitContext.js.map +1 -0
  27. package/dist/git/gitReadOps.d.ts +33 -0
  28. package/dist/git/gitReadOps.d.ts.map +1 -0
  29. package/dist/git/gitReadOps.js +38 -0
  30. package/dist/git/gitReadOps.js.map +1 -0
  31. package/dist/git/index.d.ts +49 -0
  32. package/dist/git/index.d.ts.map +1 -0
  33. package/dist/git/index.js +44 -0
  34. package/dist/git/index.js.map +1 -0
  35. package/dist/git/processCleanup.d.ts +7 -0
  36. package/dist/git/processCleanup.d.ts.map +1 -0
  37. package/dist/git/processCleanup.js +45 -0
  38. package/dist/git/processCleanup.js.map +1 -0
  39. package/dist/git/remoteOps.d.ts +25 -0
  40. package/dist/git/remoteOps.d.ts.map +1 -0
  41. package/dist/git/remoteOps.js +30 -0
  42. package/dist/git/remoteOps.js.map +1 -0
  43. package/dist/git/repoWorkspace.d.ts +72 -0
  44. package/dist/git/repoWorkspace.d.ts.map +1 -0
  45. package/dist/git/repoWorkspace.js +85 -0
  46. package/dist/git/repoWorkspace.js.map +1 -0
  47. package/dist/git/types.d.ts +182 -0
  48. package/dist/git/types.d.ts.map +1 -0
  49. package/dist/git/types.js +10 -0
  50. package/dist/git/types.js.map +1 -0
  51. package/dist/git/workingDirectoryGuard.d.ts +39 -0
  52. package/dist/git/workingDirectoryGuard.d.ts.map +1 -0
  53. package/dist/git/workingDirectoryGuard.js +53 -0
  54. package/dist/git/workingDirectoryGuard.js.map +1 -0
  55. package/dist/git/worktreeCreateOps.d.ts +45 -0
  56. package/dist/git/worktreeCreateOps.d.ts.map +1 -0
  57. package/dist/git/worktreeCreateOps.js +208 -0
  58. package/dist/git/worktreeCreateOps.js.map +1 -0
  59. package/dist/git/worktreeProbeOps.d.ts +17 -0
  60. package/dist/git/worktreeProbeOps.d.ts.map +1 -0
  61. package/dist/git/worktreeProbeOps.js +66 -0
  62. package/dist/git/worktreeProbeOps.js.map +1 -0
  63. package/dist/git/worktreeQueryOps.d.ts +45 -0
  64. package/dist/git/worktreeQueryOps.d.ts.map +1 -0
  65. package/dist/git/worktreeQueryOps.js +129 -0
  66. package/dist/git/worktreeQueryOps.js.map +1 -0
  67. package/dist/git/worktreeRemoveOps.d.ts +27 -0
  68. package/dist/git/worktreeRemoveOps.d.ts.map +1 -0
  69. package/dist/git/worktreeRemoveOps.js +132 -0
  70. package/dist/git/worktreeRemoveOps.js.map +1 -0
  71. package/dist/git/worktreeResetOps.d.ts +18 -0
  72. package/dist/git/worktreeResetOps.d.ts.map +1 -0
  73. package/dist/git/worktreeResetOps.js +68 -0
  74. package/dist/git/worktreeResetOps.js.map +1 -0
  75. package/dist/index.d.ts +13 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +13 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/providers/forgeProviders.d.ts +72 -0
  80. package/dist/providers/forgeProviders.d.ts.map +1 -0
  81. package/dist/providers/forgeProviders.js +112 -0
  82. package/dist/providers/forgeProviders.js.map +1 -0
  83. package/dist/providers/github/appAuth.d.ts +70 -0
  84. package/dist/providers/github/appAuth.d.ts.map +1 -0
  85. package/dist/providers/github/appAuth.js +243 -0
  86. package/dist/providers/github/appAuth.js.map +1 -0
  87. package/dist/providers/github/cloneUrl.d.ts +12 -0
  88. package/dist/providers/github/cloneUrl.d.ts.map +1 -0
  89. package/dist/providers/github/cloneUrl.js +20 -0
  90. package/dist/providers/github/cloneUrl.js.map +1 -0
  91. package/dist/providers/github/commands/boardCommands.d.ts +22 -0
  92. package/dist/providers/github/commands/boardCommands.d.ts.map +1 -0
  93. package/dist/providers/github/commands/boardCommands.js +66 -0
  94. package/dist/providers/github/commands/boardCommands.js.map +1 -0
  95. package/dist/providers/github/commands/issueCommands.d.ts +21 -0
  96. package/dist/providers/github/commands/issueCommands.d.ts.map +1 -0
  97. package/dist/providers/github/commands/issueCommands.js +50 -0
  98. package/dist/providers/github/commands/issueCommands.js.map +1 -0
  99. package/dist/providers/github/commands/labelCommands.d.ts +3 -0
  100. package/dist/providers/github/commands/labelCommands.d.ts.map +1 -0
  101. package/dist/providers/github/commands/labelCommands.js +8 -0
  102. package/dist/providers/github/commands/labelCommands.js.map +1 -0
  103. package/dist/providers/github/commands/prCommands.d.ts +14 -0
  104. package/dist/providers/github/commands/prCommands.d.ts.map +1 -0
  105. package/dist/providers/github/commands/prCommands.js +46 -0
  106. package/dist/providers/github/commands/prCommands.js.map +1 -0
  107. package/dist/providers/github/commands/secretCommands.d.ts +2 -0
  108. package/dist/providers/github/commands/secretCommands.d.ts.map +1 -0
  109. package/dist/providers/github/commands/secretCommands.js +5 -0
  110. package/dist/providers/github/commands/secretCommands.js.map +1 -0
  111. package/dist/providers/github/contextBinding.d.ts +11 -0
  112. package/dist/providers/github/contextBinding.d.ts.map +1 -0
  113. package/dist/providers/github/contextBinding.js +15 -0
  114. package/dist/providers/github/contextBinding.js.map +1 -0
  115. package/dist/providers/github/domain/issue.d.ts +94 -0
  116. package/dist/providers/github/domain/issue.d.ts.map +1 -0
  117. package/dist/providers/github/domain/issue.js +7 -0
  118. package/dist/providers/github/domain/issue.js.map +1 -0
  119. package/dist/providers/github/domain/pullRequest.d.ts +55 -0
  120. package/dist/providers/github/domain/pullRequest.d.ts.map +1 -0
  121. package/dist/providers/github/domain/pullRequest.js +9 -0
  122. package/dist/providers/github/domain/pullRequest.js.map +1 -0
  123. package/dist/providers/github/ghAuthToken.d.ts +28 -0
  124. package/dist/providers/github/ghAuthToken.d.ts.map +1 -0
  125. package/dist/providers/github/ghAuthToken.js +39 -0
  126. package/dist/providers/github/ghAuthToken.js.map +1 -0
  127. package/dist/providers/github/ghCommandRunner.d.ts +20 -0
  128. package/dist/providers/github/ghCommandRunner.d.ts.map +1 -0
  129. package/dist/providers/github/ghCommandRunner.js +21 -0
  130. package/dist/providers/github/ghCommandRunner.js.map +1 -0
  131. package/dist/providers/github/ghIssueApi.d.ts +29 -0
  132. package/dist/providers/github/ghIssueApi.d.ts.map +1 -0
  133. package/dist/providers/github/ghIssueApi.js +37 -0
  134. package/dist/providers/github/ghIssueApi.js.map +1 -0
  135. package/dist/providers/github/ghIssueParsers.d.ts +28 -0
  136. package/dist/providers/github/ghIssueParsers.d.ts.map +1 -0
  137. package/dist/providers/github/ghIssueParsers.js +105 -0
  138. package/dist/providers/github/ghIssueParsers.js.map +1 -0
  139. package/dist/providers/github/ghPrApi.d.ts +27 -0
  140. package/dist/providers/github/ghPrApi.d.ts.map +1 -0
  141. package/dist/providers/github/ghPrApi.js +32 -0
  142. package/dist/providers/github/ghPrApi.js.map +1 -0
  143. package/dist/providers/github/ghPrParsers.d.ts +57 -0
  144. package/dist/providers/github/ghPrParsers.d.ts.map +1 -0
  145. package/dist/providers/github/ghPrParsers.js +135 -0
  146. package/dist/providers/github/ghPrParsers.js.map +1 -0
  147. package/dist/providers/github/ghRepoApi.d.ts +33 -0
  148. package/dist/providers/github/ghRepoApi.d.ts.map +1 -0
  149. package/dist/providers/github/ghRepoApi.js +89 -0
  150. package/dist/providers/github/ghRepoApi.js.map +1 -0
  151. package/dist/providers/github/githubBoardManager.d.ts +39 -0
  152. package/dist/providers/github/githubBoardManager.d.ts.map +1 -0
  153. package/dist/providers/github/githubBoardManager.js +166 -0
  154. package/dist/providers/github/githubBoardManager.js.map +1 -0
  155. package/dist/providers/github/githubCodeHost.d.ts +73 -0
  156. package/dist/providers/github/githubCodeHost.d.ts.map +1 -0
  157. package/dist/providers/github/githubCodeHost.js +217 -0
  158. package/dist/providers/github/githubCodeHost.js.map +1 -0
  159. package/dist/providers/github/githubIdentity.d.ts +51 -0
  160. package/dist/providers/github/githubIdentity.d.ts.map +1 -0
  161. package/dist/providers/github/githubIdentity.js +110 -0
  162. package/dist/providers/github/githubIdentity.js.map +1 -0
  163. package/dist/providers/github/githubIssueTracker.d.ts +69 -0
  164. package/dist/providers/github/githubIssueTracker.d.ts.map +1 -0
  165. package/dist/providers/github/githubIssueTracker.js +209 -0
  166. package/dist/providers/github/githubIssueTracker.js.map +1 -0
  167. package/dist/providers/github/githubTokenProvider.d.ts +41 -0
  168. package/dist/providers/github/githubTokenProvider.d.ts.map +1 -0
  169. package/dist/providers/github/githubTokenProvider.js +51 -0
  170. package/dist/providers/github/githubTokenProvider.js.map +1 -0
  171. package/dist/providers/github/index.d.ts +10 -0
  172. package/dist/providers/github/index.d.ts.map +1 -0
  173. package/dist/providers/github/index.js +5 -0
  174. package/dist/providers/github/index.js.map +1 -0
  175. package/dist/providers/github/mappers.d.ts +40 -0
  176. package/dist/providers/github/mappers.d.ts.map +1 -0
  177. package/dist/providers/github/mappers.js +103 -0
  178. package/dist/providers/github/mappers.js.map +1 -0
  179. package/dist/providers/github/tokenResolver.d.ts +37 -0
  180. package/dist/providers/github/tokenResolver.d.ts.map +1 -0
  181. package/dist/providers/github/tokenResolver.js +43 -0
  182. package/dist/providers/github/tokenResolver.js.map +1 -0
  183. package/dist/providers/gitlab/gitlabApiClient.d.ts +45 -0
  184. package/dist/providers/gitlab/gitlabApiClient.d.ts.map +1 -0
  185. package/dist/providers/gitlab/gitlabApiClient.js +95 -0
  186. package/dist/providers/gitlab/gitlabApiClient.js.map +1 -0
  187. package/dist/providers/gitlab/gitlabBoardManager.d.ts +11 -0
  188. package/dist/providers/gitlab/gitlabBoardManager.d.ts.map +1 -0
  189. package/dist/providers/gitlab/gitlabBoardManager.js +27 -0
  190. package/dist/providers/gitlab/gitlabBoardManager.js.map +1 -0
  191. package/dist/providers/gitlab/gitlabCodeHost.d.ts +49 -0
  192. package/dist/providers/gitlab/gitlabCodeHost.d.ts.map +1 -0
  193. package/dist/providers/gitlab/gitlabCodeHost.js +109 -0
  194. package/dist/providers/gitlab/gitlabCodeHost.js.map +1 -0
  195. package/dist/providers/gitlab/gitlabTypes.d.ts +46 -0
  196. package/dist/providers/gitlab/gitlabTypes.d.ts.map +1 -0
  197. package/dist/providers/gitlab/gitlabTypes.js +6 -0
  198. package/dist/providers/gitlab/gitlabTypes.js.map +1 -0
  199. package/dist/providers/gitlab/index.d.ts +5 -0
  200. package/dist/providers/gitlab/index.d.ts.map +1 -0
  201. package/dist/providers/gitlab/index.js +4 -0
  202. package/dist/providers/gitlab/index.js.map +1 -0
  203. package/dist/providers/gitlab/mappers.d.ts +26 -0
  204. package/dist/providers/gitlab/mappers.d.ts.map +1 -0
  205. package/dist/providers/gitlab/mappers.js +63 -0
  206. package/dist/providers/gitlab/mappers.js.map +1 -0
  207. package/dist/providers/index.d.ts +7 -0
  208. package/dist/providers/index.d.ts.map +1 -0
  209. package/dist/providers/index.js +7 -0
  210. package/dist/providers/index.js.map +1 -0
  211. package/dist/providers/jira/adfConverter.d.ts +32 -0
  212. package/dist/providers/jira/adfConverter.d.ts.map +1 -0
  213. package/dist/providers/jira/adfConverter.js +144 -0
  214. package/dist/providers/jira/adfConverter.js.map +1 -0
  215. package/dist/providers/jira/index.d.ts +8 -0
  216. package/dist/providers/jira/index.d.ts.map +1 -0
  217. package/dist/providers/jira/index.js +5 -0
  218. package/dist/providers/jira/index.js.map +1 -0
  219. package/dist/providers/jira/jiraApiClient.d.ts +42 -0
  220. package/dist/providers/jira/jiraApiClient.d.ts.map +1 -0
  221. package/dist/providers/jira/jiraApiClient.js +84 -0
  222. package/dist/providers/jira/jiraApiClient.js.map +1 -0
  223. package/dist/providers/jira/jiraBoardManager.d.ts +11 -0
  224. package/dist/providers/jira/jiraBoardManager.d.ts.map +1 -0
  225. package/dist/providers/jira/jiraBoardManager.js +27 -0
  226. package/dist/providers/jira/jiraBoardManager.js.map +1 -0
  227. package/dist/providers/jira/jiraIssueTracker.d.ts +53 -0
  228. package/dist/providers/jira/jiraIssueTracker.d.ts.map +1 -0
  229. package/dist/providers/jira/jiraIssueTracker.js +231 -0
  230. package/dist/providers/jira/jiraIssueTracker.js.map +1 -0
  231. package/dist/providers/jira/jiraTypes.d.ts +61 -0
  232. package/dist/providers/jira/jiraTypes.d.ts.map +1 -0
  233. package/dist/providers/jira/jiraTypes.js +6 -0
  234. package/dist/providers/jira/jiraTypes.js.map +1 -0
  235. package/dist/providers/types.d.ts +271 -0
  236. package/dist/providers/types.d.ts.map +1 -0
  237. package/dist/providers/types.js +52 -0
  238. package/dist/providers/types.js.map +1 -0
  239. package/dist/providers/workspaceValidation.d.ts +18 -0
  240. package/dist/providers/workspaceValidation.d.ts.map +1 -0
  241. package/dist/providers/workspaceValidation.js +37 -0
  242. package/dist/providers/workspaceValidation.js.map +1 -0
  243. package/package.json +66 -0
@@ -0,0 +1,144 @@
1
+ /**
2
+ * Lightweight converters between Markdown and Atlassian Document Format (ADF).
3
+ * Supports the most common markdown elements without external dependencies.
4
+ */
5
+ /**
6
+ * Parses inline markdown marks (bold, italic, links) into ADF text nodes.
7
+ */
8
+ function parseInlineMarks(text) {
9
+ const nodes = [];
10
+ const inlinePattern = /(\*\*(.+?)\*\*|__(.+?)__|_(.+?)_|\*(.+?)\*|\[([^\]]+)\]\(([^)]+)\))/g;
11
+ let lastIndex = 0;
12
+ let match;
13
+ while ((match = inlinePattern.exec(text)) !== null) {
14
+ // Add plain text before the match
15
+ if (match.index > lastIndex) {
16
+ nodes.push({ type: 'text', text: text.slice(lastIndex, match.index) });
17
+ }
18
+ if (match[2] || match[3]) {
19
+ // Bold: **text** or __text__
20
+ nodes.push({ type: 'text', text: match[2] || match[3], marks: [{ type: 'strong' }] });
21
+ }
22
+ else if (match[4] || match[5]) {
23
+ // Italic: _text_ or *text*
24
+ nodes.push({ type: 'text', text: match[4] || match[5], marks: [{ type: 'em' }] });
25
+ }
26
+ else if (match[6] && match[7]) {
27
+ // Link: [text](url)
28
+ nodes.push({
29
+ type: 'text',
30
+ text: match[6],
31
+ marks: [{ type: 'link', attrs: { href: match[7] } }],
32
+ });
33
+ }
34
+ lastIndex = match.index + match[0].length;
35
+ }
36
+ // Add remaining plain text
37
+ if (lastIndex < text.length) {
38
+ nodes.push({ type: 'text', text: text.slice(lastIndex) });
39
+ }
40
+ return nodes.length > 0 ? nodes : [{ type: 'text', text }];
41
+ }
42
+ /**
43
+ * Converts a single line of markdown into ADF paragraph content nodes.
44
+ */
45
+ function lineToParagraph(line) {
46
+ return {
47
+ type: 'paragraph',
48
+ content: parseInlineMarks(line),
49
+ };
50
+ }
51
+ /**
52
+ * Converts markdown text to a minimal ADF document structure.
53
+ * Supports paragraphs, code blocks, bold, italic, headings, bullet lists, and links.
54
+ */
55
+ export function markdownToAdf(markdown) {
56
+ if (!markdown) {
57
+ return { version: 1, type: 'doc', content: [{ type: 'paragraph', content: [] }] };
58
+ }
59
+ const lines = markdown.split('\n');
60
+ const content = [];
61
+ let i = 0;
62
+ while (i < lines.length) {
63
+ const line = lines[i];
64
+ // Code block: ```...```
65
+ if (line.startsWith('```')) {
66
+ const language = line.slice(3).trim() || undefined;
67
+ const codeLines = [];
68
+ i++;
69
+ while (i < lines.length && !lines[i].startsWith('```')) {
70
+ codeLines.push(lines[i]);
71
+ i++;
72
+ }
73
+ i++; // Skip closing ```
74
+ content.push({
75
+ type: 'codeBlock',
76
+ attrs: language ? { language } : {},
77
+ content: [{ type: 'text', text: codeLines.join('\n') }],
78
+ });
79
+ continue;
80
+ }
81
+ // Heading: # ... (h1-h6)
82
+ const headingMatch = line.match(/^(#{1,6})\s+(.+)$/);
83
+ if (headingMatch) {
84
+ content.push({
85
+ type: 'heading',
86
+ attrs: { level: headingMatch[1].length },
87
+ content: parseInlineMarks(headingMatch[2]),
88
+ });
89
+ i++;
90
+ continue;
91
+ }
92
+ // Bullet list item: - ... or * ...
93
+ if (/^[-*]\s+/.test(line)) {
94
+ const listItems = [];
95
+ while (i < lines.length && /^[-*]\s+/.test(lines[i])) {
96
+ const itemText = lines[i].replace(/^[-*]\s+/, '');
97
+ listItems.push({
98
+ type: 'listItem',
99
+ content: [lineToParagraph(itemText)],
100
+ });
101
+ i++;
102
+ }
103
+ content.push({ type: 'bulletList', content: listItems });
104
+ continue;
105
+ }
106
+ // Empty line
107
+ if (line.trim() === '') {
108
+ i++;
109
+ continue;
110
+ }
111
+ // Default: paragraph
112
+ content.push(lineToParagraph(line));
113
+ i++;
114
+ }
115
+ if (content.length === 0) {
116
+ content.push({ type: 'paragraph', content: [] });
117
+ }
118
+ return { version: 1, type: 'doc', content };
119
+ }
120
+ /**
121
+ * Extracts plain text from an ADF document by recursively walking content arrays.
122
+ * Falls back to empty string for unknown or malformed structures.
123
+ */
124
+ export function adfToPlainText(adf) {
125
+ if (adf === null || adf === undefined) {
126
+ return '';
127
+ }
128
+ if (typeof adf !== 'object') {
129
+ return '';
130
+ }
131
+ const node = adf;
132
+ // Extract text from text nodes
133
+ if (node.type === 'text' && typeof node.text === 'string') {
134
+ return node.text;
135
+ }
136
+ // Recursively process content arrays
137
+ if (Array.isArray(node.content)) {
138
+ const parts = node.content.map(child => adfToPlainText(child));
139
+ const separator = node.type === 'doc' || node.type === 'bulletList' ? '\n' : '';
140
+ return parts.join(separator);
141
+ }
142
+ return '';
143
+ }
144
+ //# sourceMappingURL=adfConverter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adfConverter.js","sourceRoot":"","sources":["../../../src/providers/jira/adfConverter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqBH;;GAEG;AACH,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,KAAK,GAAc,EAAE,CAAC;IAC5B,MAAM,aAAa,GAAG,sEAAsE,CAAC;IAE7F,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,KAA6B,CAAC;IAElC,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,kCAAkC;QAClC,IAAI,KAAK,CAAC,KAAK,GAAG,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACzB,6BAA6B;YAC7B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QACxF,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,2BAA2B;YAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QACpF,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,oBAAoB;YACpB,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACd,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aACrD,CAAC,CAAC;QACL,CAAC;QAED,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5C,CAAC;IAED,2BAA2B;IAC3B,IAAI,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC;KAChC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;IACpF,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,OAAO,GAAc,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,wBAAwB;QACxB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC;YACnD,MAAM,SAAS,GAAa,EAAE,CAAC;YAC/B,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACzB,CAAC,EAAE,CAAC;YACN,CAAC;YACD,CAAC,EAAE,CAAC,CAAC,mBAAmB;YACxB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,WAAW;gBACjB,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE;gBACnC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aACxD,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QAED,yBAAyB;QACzB,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACrD,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI,EAAE,SAAS;gBACf,KAAK,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;gBACxC,OAAO,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;aAC3C,CAAC,CAAC;YACH,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,mCAAmC;QACnC,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAc,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACrD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBAClD,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;iBACrC,CAAC,CAAC;gBACH,CAAC,EAAE,CAAC;YACN,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;YACzD,SAAS;QACX,CAAC;QAED,aAAa;QACb,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YACvB,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,qBAAqB;QACrB,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,CAAC,EAAE,CAAC;IACN,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,GAA8B,CAAC;IAE5C,+BAA+B;IAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,qCAAqC;IACrC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,KAAK,GAAI,IAAI,CAAC,OAAqB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,OAAO,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { JiraIssueTracker, createJiraIssueTracker } from './jiraIssueTracker.js';
2
+ export type { JiraConfig } from './jiraIssueTracker.js';
3
+ export { createJiraBoardManager } from './jiraBoardManager.js';
4
+ export { JiraApiClient } from './jiraApiClient.js';
5
+ export type { JiraCloudAuth, JiraDataCenterAuth, JiraAuth } from './jiraApiClient.js';
6
+ export { markdownToAdf, adfToPlainText } from './adfConverter.js';
7
+ export type { JiraIssueResponse, JiraCommentResponse, JiraTransition, JiraStatusCategory, JiraUser, JiraApiError, } from './jiraTypes.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/jira/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACjF,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAClE,YAAY,EACV,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,YAAY,GACb,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { JiraIssueTracker, createJiraIssueTracker } from './jiraIssueTracker.js';
2
+ export { createJiraBoardManager } from './jiraBoardManager.js';
3
+ export { JiraApiClient } from './jiraApiClient.js';
4
+ export { markdownToAdf, adfToPlainText } from './adfConverter.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/jira/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Low-level Jira REST API v3 client using native fetch().
3
+ * Handles authentication, request building, and error handling.
4
+ *
5
+ * Configuration is INJECTED (#818) — never read from the environment. Logs via the
6
+ * `Logger` port (adws/gitContext/types.ts), defaulting to `consoleLogger`.
7
+ * `fetchFn` is the hermetic transport test seam; production uses global fetch.
8
+ */
9
+ import type { Logger } from '../../git/types.js';
10
+ import type { JiraIssueResponse, JiraCommentResponse, JiraTransition } from './jiraTypes.js';
11
+ export interface JiraCloudAuth {
12
+ readonly email: string;
13
+ readonly apiToken: string;
14
+ }
15
+ export interface JiraDataCenterAuth {
16
+ readonly pat: string;
17
+ }
18
+ export type JiraAuth = JiraCloudAuth | JiraDataCenterAuth;
19
+ export declare function isCloudAuth(auth: JiraAuth): auth is JiraCloudAuth;
20
+ /** Runs a fetch request, returning its Response. Production default calls global fetch; tests inject a recorder. */
21
+ export type FetchFn = (url: string, init: RequestInit) => Promise<Response>;
22
+ /** Deps idiom: both optional so a consumer that injects nothing gets `consoleLogger` and real `fetch`. */
23
+ export interface JiraApiClientDeps {
24
+ readonly logger?: Logger;
25
+ readonly fetchFn?: FetchFn;
26
+ }
27
+ export declare class JiraApiClient {
28
+ private readonly instanceUrl;
29
+ private readonly auth;
30
+ private readonly logger;
31
+ private readonly fetchFn;
32
+ constructor(instanceUrl: string, auth: JiraAuth, deps?: JiraApiClientDeps);
33
+ private buildHeaders;
34
+ private request;
35
+ getIssue(issueKey: string): Promise<JiraIssueResponse>;
36
+ addComment(issueKey: string, adfBody: object): Promise<JiraCommentResponse>;
37
+ deleteComment(issueKey: string, commentId: string): Promise<void>;
38
+ getComments(issueKey: string): Promise<readonly JiraCommentResponse[]>;
39
+ getTransitions(issueKey: string): Promise<readonly JiraTransition[]>;
40
+ doTransition(issueKey: string, transitionId: string): Promise<void>;
41
+ }
42
+ //# sourceMappingURL=jiraApiClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jiraApiClient.d.ts","sourceRoot":"","sources":["../../../src/providers/jira/jiraApiClient.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAmB,cAAc,EAA2B,MAAM,gBAAgB,CAAC;AAEvI,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,QAAQ,GAAG,aAAa,GAAG,kBAAkB,CAAC;AAE1D,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,IAAI,aAAa,CAEjE;AAED,oHAAoH;AACpH,MAAM,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE5E,0GAA0G;AAC1G,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAID,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAW;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;gBAEtB,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,GAAE,iBAAsB;IAO7E,OAAO,CAAC,YAAY;YAgBN,OAAO;IAgCf,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAItD,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAI3E,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjE,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC;IAKtE,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,cAAc,EAAE,CAAC;IAKpE,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG1E"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Low-level Jira REST API v3 client using native fetch().
3
+ * Handles authentication, request building, and error handling.
4
+ *
5
+ * Configuration is INJECTED (#818) — never read from the environment. Logs via the
6
+ * `Logger` port (adws/gitContext/types.ts), defaulting to `consoleLogger`.
7
+ * `fetchFn` is the hermetic transport test seam; production uses global fetch.
8
+ */
9
+ import { consoleLogger } from '../../git/consoleLogger.js';
10
+ export function isCloudAuth(auth) {
11
+ return 'email' in auth && 'apiToken' in auth;
12
+ }
13
+ const defaultFetch = (url, init) => fetch(url, init);
14
+ export class JiraApiClient {
15
+ instanceUrl;
16
+ auth;
17
+ logger;
18
+ fetchFn;
19
+ constructor(instanceUrl, auth, deps = {}) {
20
+ this.instanceUrl = instanceUrl.replace(/\/+$/, '');
21
+ this.auth = auth;
22
+ this.logger = deps.logger ?? consoleLogger;
23
+ this.fetchFn = deps.fetchFn ?? defaultFetch;
24
+ }
25
+ buildHeaders() {
26
+ const headers = {
27
+ 'Content-Type': 'application/json',
28
+ 'Accept': 'application/json',
29
+ };
30
+ if (isCloudAuth(this.auth)) {
31
+ const credentials = btoa(`${this.auth.email}:${this.auth.apiToken}`);
32
+ headers['Authorization'] = `Basic ${credentials}`;
33
+ }
34
+ else {
35
+ headers['Authorization'] = `Bearer ${this.auth.pat}`;
36
+ }
37
+ return headers;
38
+ }
39
+ async request(method, path, body) {
40
+ const url = `${this.instanceUrl}/rest/api/3/${path}`;
41
+ const headers = this.buildHeaders();
42
+ const options = { method, headers };
43
+ if (body !== undefined) {
44
+ options.body = JSON.stringify(body);
45
+ }
46
+ const response = await this.fetchFn(url, options);
47
+ if (!response.ok) {
48
+ const errorBody = await response.text().catch(() => '');
49
+ const message = `Jira API ${method} ${path} failed with ${response.status}: ${errorBody}`;
50
+ if (response.status === 429) {
51
+ const retryAfter = response.headers.get('Retry-After');
52
+ this.logger(`Jira API rate limited. Retry-After: ${retryAfter ?? 'unknown'}`, 'warn');
53
+ }
54
+ this.logger(message, 'error');
55
+ throw new Error(message);
56
+ }
57
+ // DELETE returns 204 with no content
58
+ if (response.status === 204) {
59
+ return undefined;
60
+ }
61
+ return response.json();
62
+ }
63
+ async getIssue(issueKey) {
64
+ return this.request('GET', `issue/${issueKey}?expand=renderedFields`);
65
+ }
66
+ async addComment(issueKey, adfBody) {
67
+ return this.request('POST', `issue/${issueKey}/comment`, { body: adfBody });
68
+ }
69
+ async deleteComment(issueKey, commentId) {
70
+ return this.request('DELETE', `issue/${issueKey}/comment/${commentId}`);
71
+ }
72
+ async getComments(issueKey) {
73
+ const page = await this.request('GET', `issue/${issueKey}/comment`);
74
+ return page.comments;
75
+ }
76
+ async getTransitions(issueKey) {
77
+ const result = await this.request('GET', `issue/${issueKey}/transitions`);
78
+ return result.transitions;
79
+ }
80
+ async doTransition(issueKey, transitionId) {
81
+ return this.request('POST', `issue/${issueKey}/transitions`, { transition: { id: transitionId } });
82
+ }
83
+ }
84
+ //# sourceMappingURL=jiraApiClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jiraApiClient.js","sourceRoot":"","sources":["../../../src/providers/jira/jiraApiClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Jira stub implementation of the BoardManager provider interface.
3
+ * All methods throw — Jira board management is not yet supported.
4
+ */
5
+ import type { BoardManager } from '../types.js';
6
+ /**
7
+ * Factory function to create a Jira BoardManager stub.
8
+ * @returns A BoardManager instance that throws for all operations.
9
+ */
10
+ export declare function createJiraBoardManager(): BoardManager;
11
+ //# sourceMappingURL=jiraBoardManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jiraBoardManager.d.ts","sourceRoot":"","sources":["../../../src/providers/jira/jiraBoardManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAoBhD;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,YAAY,CAErD"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Jira stub implementation of the BoardManager provider interface.
3
+ * All methods throw — Jira board management is not yet supported.
4
+ */
5
+ /**
6
+ * Stub BoardManager for Jira.
7
+ * Throws "not implemented" for all methods.
8
+ */
9
+ class JiraBoardManager {
10
+ async findBoard() {
11
+ throw new Error('BoardManager not implemented for Jira');
12
+ }
13
+ async createBoard(_name) {
14
+ throw new Error('BoardManager not implemented for Jira');
15
+ }
16
+ async ensureColumns(_boardId) {
17
+ throw new Error('BoardManager not implemented for Jira');
18
+ }
19
+ }
20
+ /**
21
+ * Factory function to create a Jira BoardManager stub.
22
+ * @returns A BoardManager instance that throws for all operations.
23
+ */
24
+ export function createJiraBoardManager() {
25
+ return new JiraBoardManager();
26
+ }
27
+ //# sourceMappingURL=jiraBoardManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jiraBoardManager.js","sourceRoot":"","sources":["../../../src/providers/jira/jiraBoardManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;GAGG;AACH,MAAM,gBAAgB;IACpB,KAAK,CAAC,SAAS;QACb,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,gBAAgB,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Jira IssueTracker implementation.
3
+ * Maps ADW's IssueTracker interface to Jira REST API v3 via JiraApiClient.
4
+ *
5
+ * Configuration is INJECTED (#818) — never read from the environment. Logs via
6
+ * the `Logger` port, defaulting to `consoleLogger`.
7
+ */
8
+ import type { Logger } from '../../git/types.js';
9
+ import type { IssueTracker, Issue, IssueComment, IssueSummary, IssueListEntry } from '../types.js';
10
+ import { BoardStatus } from '../types.js';
11
+ import { JiraApiClient, type JiraAuth, type JiraApiClientDeps } from './jiraApiClient.js';
12
+ /** The injected configuration `createJiraIssueTracker` takes (#818); ADW's wiring supplies `auth` from `jiraAuthFromEnv()`; `instanceUrl`/`projectKey` come from the caller's own configuration, wired by `adws/core/forgeWiring.ts`. */
13
+ export interface JiraConfig {
14
+ readonly instanceUrl: string;
15
+ readonly projectKey: string;
16
+ readonly auth: JiraAuth;
17
+ }
18
+ export declare class JiraIssueTracker implements IssueTracker {
19
+ private readonly client;
20
+ private readonly projectKey;
21
+ private readonly logger;
22
+ private readonly commentIssueMap;
23
+ constructor(client: JiraApiClient, projectKey: string, logger?: Logger);
24
+ private toJiraKey;
25
+ private mapStatusCategory;
26
+ private toIssueComment;
27
+ private toIssue;
28
+ fetchIssue(issueNumber: number): Promise<Issue>;
29
+ commentOnIssue(issueNumber: number, body: string): void;
30
+ deleteComment(commentId: string): void;
31
+ closeIssue(issueNumber: number, comment?: string): Promise<boolean>;
32
+ getIssueState(issueNumber: number): string;
33
+ fetchComments(issueNumber: number): IssueComment[];
34
+ moveToStatus(issueNumber: number, status: BoardStatus): Promise<boolean>;
35
+ fetchLabels(): readonly string[];
36
+ addLabel(): void;
37
+ applyLabel(): void;
38
+ ensureLabel(): void;
39
+ createIssue(): number;
40
+ updateIssueBody(): void;
41
+ searchOpenIssues(): readonly IssueSummary[];
42
+ findOpenUpgradeIssue(): number | null;
43
+ listIssues(): readonly IssueListEntry[];
44
+ getIssueTitle(): string;
45
+ }
46
+ /**
47
+ * Creates a JiraIssueTracker from INJECTED configuration (#818). Reads no
48
+ * environment; the ADW wiring in `repoContext.ts` derives `auth` from
49
+ * JIRA_EMAIL + JIRA_API_TOKEN (Cloud) or JIRA_PAT (Data Center/Server).
50
+ * `deps.logger` defaults to `consoleLogger`, `deps.fetchFn` to global fetch.
51
+ */
52
+ export declare function createJiraIssueTracker(config: JiraConfig, deps?: JiraApiClientDeps): IssueTracker;
53
+ //# sourceMappingURL=jiraIssueTracker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jiraIssueTracker.d.ts","sourceRoot":"","sources":["../../../src/providers/jira/jiraIssueTracker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnG,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAe,KAAK,QAAQ,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAIvG,yOAAyO;AACzO,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACzB;AA0BD,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA6B;gBAEjD,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,GAAE,MAAsB;IAMrF,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,OAAO;IAiBT,UAAU,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAMrD,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAYvD,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAehC,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAkCzE,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAgB1C,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,EAAE;IAe5C,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IA8B9E,WAAW,IAAI,SAAS,MAAM,EAAE;IAIhC,QAAQ,IAAI,IAAI;IAIhB,UAAU,IAAI,IAAI;IAIlB,WAAW,IAAI,IAAI;IAInB,WAAW,IAAI,MAAM;IAIrB,eAAe,IAAI,IAAI;IAIvB,gBAAgB,IAAI,SAAS,YAAY,EAAE;IAI3C,oBAAoB,IAAI,MAAM,GAAG,IAAI;IAIrC,UAAU,IAAI,SAAS,cAAc,EAAE;IAIvC,aAAa,IAAI,MAAM;CAGxB;AAmBD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,GAAE,iBAAsB,GAAG,YAAY,CAIrG"}
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Jira IssueTracker implementation.
3
+ * Maps ADW's IssueTracker interface to Jira REST API v3 via JiraApiClient.
4
+ *
5
+ * Configuration is INJECTED (#818) — never read from the environment. Logs via
6
+ * the `Logger` port, defaulting to `consoleLogger`.
7
+ */
8
+ import { consoleLogger } from '../../git/consoleLogger.js';
9
+ import { JiraApiClient, isCloudAuth } from './jiraApiClient.js';
10
+ import { markdownToAdf, adfToPlainText } from './adfConverter.js';
11
+ /** Maps Jira status category keys to ADW state strings. */
12
+ const STATUS_CATEGORY_MAP = {
13
+ new: 'OPEN',
14
+ indeterminate: 'IN_PROGRESS',
15
+ done: 'CLOSED',
16
+ };
17
+ /**
18
+ * Matches a target status name against available transition names using fuzzy logic.
19
+ * Exact match takes priority, then substring match.
20
+ */
21
+ function matchTransition(targetStatus, transitions) {
22
+ const target = targetStatus.toLowerCase();
23
+ const exact = transitions.find(t => t.name.toLowerCase() === target);
24
+ if (exact)
25
+ return exact;
26
+ const fuzzy = transitions.find(t => t.name.toLowerCase().includes(target));
27
+ return fuzzy ?? null;
28
+ }
29
+ export class JiraIssueTracker {
30
+ client;
31
+ projectKey;
32
+ logger;
33
+ commentIssueMap = new Map();
34
+ constructor(client, projectKey, logger = consoleLogger) {
35
+ this.client = client;
36
+ this.projectKey = projectKey;
37
+ this.logger = logger;
38
+ }
39
+ toJiraKey(issueNumber) {
40
+ return `${this.projectKey}-${issueNumber}`;
41
+ }
42
+ mapStatusCategory(statusCategoryKey) {
43
+ return STATUS_CATEGORY_MAP[statusCategoryKey] ?? statusCategoryKey.toUpperCase();
44
+ }
45
+ toIssueComment(jiraComment, issueKey) {
46
+ this.commentIssueMap.set(jiraComment.id, issueKey);
47
+ return {
48
+ id: jiraComment.id,
49
+ body: adfToPlainText(jiraComment.body),
50
+ author: jiraComment.author.displayName,
51
+ createdAt: jiraComment.created,
52
+ };
53
+ }
54
+ toIssue(jiraIssue) {
55
+ const comments = (jiraIssue.fields.comment?.comments ?? []).map(c => this.toIssueComment(c, jiraIssue.key));
56
+ return {
57
+ id: jiraIssue.key,
58
+ number: parseInt(jiraIssue.key.split('-').pop() ?? '0', 10),
59
+ title: jiraIssue.fields.summary,
60
+ body: adfToPlainText(jiraIssue.fields.description),
61
+ state: this.mapStatusCategory(jiraIssue.fields.status.statusCategory.key),
62
+ author: jiraIssue.fields.creator.displayName,
63
+ labels: [...jiraIssue.fields.labels],
64
+ comments,
65
+ };
66
+ }
67
+ async fetchIssue(issueNumber) {
68
+ const issueKey = this.toJiraKey(issueNumber);
69
+ const jiraIssue = await this.client.getIssue(issueKey);
70
+ return this.toIssue(jiraIssue);
71
+ }
72
+ commentOnIssue(issueNumber, body) {
73
+ const issueKey = this.toJiraKey(issueNumber);
74
+ const adfBody = markdownToAdf(body);
75
+ this.client.addComment(issueKey, adfBody).then(comment => {
76
+ this.commentIssueMap.set(comment.id, issueKey);
77
+ this.logger(`Commented on Jira issue ${issueKey}`, 'success');
78
+ }).catch(error => {
79
+ this.logger(`Failed to comment on Jira issue ${issueKey}: ${error}`, 'error');
80
+ });
81
+ }
82
+ deleteComment(commentId) {
83
+ const issueKey = this.commentIssueMap.get(commentId);
84
+ if (!issueKey) {
85
+ this.logger(`Cannot delete Jira comment ${commentId}: issue key not found in cache. Fetch comments first.`, 'warn');
86
+ return;
87
+ }
88
+ this.client.deleteComment(issueKey, commentId).then(() => {
89
+ this.commentIssueMap.delete(commentId);
90
+ this.logger(`Deleted Jira comment ${commentId} on ${issueKey}`, 'success');
91
+ }).catch(error => {
92
+ this.logger(`Failed to delete Jira comment ${commentId}: ${error}`, 'error');
93
+ });
94
+ }
95
+ async closeIssue(issueNumber, comment) {
96
+ const issueKey = this.toJiraKey(issueNumber);
97
+ try {
98
+ const jiraIssue = await this.client.getIssue(issueKey);
99
+ if (jiraIssue.fields.status.statusCategory.key === 'done') {
100
+ this.logger(`Jira issue ${issueKey} is already done, skipping`, 'info');
101
+ return false;
102
+ }
103
+ if (comment) {
104
+ const adfBody = markdownToAdf(comment);
105
+ await this.client.addComment(issueKey, adfBody);
106
+ }
107
+ const transitions = await this.client.getTransitions(issueKey);
108
+ const doneTransition = transitions.find(t => t.to.statusCategory.key === 'done');
109
+ if (!doneTransition) {
110
+ this.logger(`No "Done" transition available for Jira issue ${issueKey}`, 'warn');
111
+ return false;
112
+ }
113
+ await this.client.doTransition(issueKey, doneTransition.id);
114
+ this.logger(`Closed Jira issue ${issueKey}`, 'success');
115
+ return true;
116
+ }
117
+ catch (error) {
118
+ this.logger(`Failed to close Jira issue ${issueKey}: ${error}`, 'error');
119
+ return false;
120
+ }
121
+ }
122
+ getIssueState(issueNumber) {
123
+ // The interface is synchronous, but Jira requires an API call.
124
+ // This is a limitation — callers should use fetchIssue().state instead.
125
+ // For compatibility, we trigger a background fetch and return a placeholder.
126
+ const issueKey = this.toJiraKey(issueNumber);
127
+ let state = 'UNKNOWN';
128
+ this.client.getIssue(issueKey).then(issue => {
129
+ state = this.mapStatusCategory(issue.fields.status.statusCategory.key);
130
+ }).catch(error => {
131
+ this.logger(`Failed to get state for Jira issue ${issueKey}: ${error}`, 'error');
132
+ });
133
+ return state;
134
+ }
135
+ fetchComments(issueNumber) {
136
+ const issueKey = this.toJiraKey(issueNumber);
137
+ const comments = [];
138
+ this.client.getComments(issueKey).then(jiraComments => {
139
+ for (const jc of jiraComments) {
140
+ comments.push(this.toIssueComment(jc, issueKey));
141
+ }
142
+ }).catch(error => {
143
+ this.logger(`Failed to fetch comments for Jira issue ${issueKey}: ${error}`, 'error');
144
+ });
145
+ return comments;
146
+ }
147
+ async moveToStatus(issueNumber, status) {
148
+ const issueKey = this.toJiraKey(issueNumber);
149
+ try {
150
+ const jiraIssue = await this.client.getIssue(issueKey);
151
+ const currentStatus = jiraIssue.fields.status.name;
152
+ if (currentStatus.toLowerCase() === status.toLowerCase()) {
153
+ this.logger(`Jira issue ${issueKey} already in "${currentStatus}", skipping`, 'info');
154
+ return true;
155
+ }
156
+ const transitions = await this.client.getTransitions(issueKey);
157
+ const matched = matchTransition(status, transitions);
158
+ if (!matched) {
159
+ const available = transitions.map(t => t.name).join(', ');
160
+ this.logger(`Status "${status}" not found in available transitions for ${issueKey}. Available: ${available}`, 'warn');
161
+ return false;
162
+ }
163
+ await this.client.doTransition(issueKey, matched.id);
164
+ this.logger(`Moved Jira issue ${issueKey} to "${matched.name}"`, 'success');
165
+ return true;
166
+ }
167
+ catch (error) {
168
+ this.logger(`Failed to move Jira issue ${issueKey} to "${status}": ${error}`, 'error');
169
+ return false;
170
+ }
171
+ }
172
+ fetchLabels() {
173
+ throw new Error('JiraIssueTracker.fetchLabels is not implemented');
174
+ }
175
+ addLabel() {
176
+ throw new Error('JiraIssueTracker.addLabel is not implemented');
177
+ }
178
+ applyLabel() {
179
+ throw new Error('JiraIssueTracker.applyLabel is not implemented');
180
+ }
181
+ ensureLabel() {
182
+ throw new Error('JiraIssueTracker.ensureLabel is not implemented');
183
+ }
184
+ createIssue() {
185
+ throw new Error('JiraIssueTracker.createIssue is not implemented');
186
+ }
187
+ updateIssueBody() {
188
+ throw new Error('JiraIssueTracker.updateIssueBody is not implemented');
189
+ }
190
+ searchOpenIssues() {
191
+ throw new Error('JiraIssueTracker.searchOpenIssues is not implemented');
192
+ }
193
+ findOpenUpgradeIssue() {
194
+ throw new Error('JiraIssueTracker.findOpenUpgradeIssue is not implemented');
195
+ }
196
+ listIssues() {
197
+ throw new Error('JiraIssueTracker.listIssues is not implemented');
198
+ }
199
+ getIssueTitle() {
200
+ throw new Error('JiraIssueTracker.getIssueTitle is not implemented');
201
+ }
202
+ }
203
+ /** Throws a library-facing message when `config` is missing a required field or carries an unusable auth shape. The env-flavoured operator message lives in ADW's wiring (`repoContext.ts`), not here. */
204
+ function validateJiraConfig(config) {
205
+ if (!config.instanceUrl?.trim()) {
206
+ throw new Error('Jira issue tracker requires a non-empty instanceUrl');
207
+ }
208
+ if (!config.projectKey?.trim()) {
209
+ throw new Error('Jira issue tracker requires a non-empty projectKey');
210
+ }
211
+ if (isCloudAuth(config.auth)) {
212
+ if (!config.auth.email?.trim() || !config.auth.apiToken?.trim()) {
213
+ throw new Error('Jira Cloud auth requires email and apiToken');
214
+ }
215
+ }
216
+ else if (!config.auth.pat?.trim()) {
217
+ throw new Error('Jira Data Center auth requires a pat');
218
+ }
219
+ }
220
+ /**
221
+ * Creates a JiraIssueTracker from INJECTED configuration (#818). Reads no
222
+ * environment; the ADW wiring in `repoContext.ts` derives `auth` from
223
+ * JIRA_EMAIL + JIRA_API_TOKEN (Cloud) or JIRA_PAT (Data Center/Server).
224
+ * `deps.logger` defaults to `consoleLogger`, `deps.fetchFn` to global fetch.
225
+ */
226
+ export function createJiraIssueTracker(config, deps = {}) {
227
+ validateJiraConfig(config);
228
+ const client = new JiraApiClient(config.instanceUrl, config.auth, deps);
229
+ return new JiraIssueTracker(client, config.projectKey, deps.logger ?? consoleLogger);
230
+ }
231
+ //# sourceMappingURL=jiraIssueTracker.js.map