@commandable/integration-data 0.0.6 → 0.1.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 (231) hide show
  1. package/dist/credentials-index.d.ts.map +1 -1
  2. package/dist/credentials-index.js +130 -0
  3. package/dist/credentials-index.js.map +1 -1
  4. package/dist/index.d.ts +2 -2
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/loader.d.ts +48 -0
  9. package/dist/loader.d.ts.map +1 -1
  10. package/dist/loader.js +46 -4
  11. package/dist/loader.js.map +1 -1
  12. package/integrations/__tests__/liveHarness.ts +16 -3
  13. package/integrations/airtable/.env.test +9 -0
  14. package/integrations/airtable/.env.test.example +11 -0
  15. package/integrations/airtable/README.md +27 -0
  16. package/integrations/airtable/__tests__/get_handlers.test.ts +43 -5
  17. package/integrations/airtable/credentials.json +2 -1
  18. package/integrations/confluence/.env.test +25 -0
  19. package/integrations/confluence/.env.test.example +36 -0
  20. package/integrations/confluence/README.md +28 -0
  21. package/integrations/confluence/__tests__/get_handlers.test.ts +121 -0
  22. package/integrations/confluence/__tests__/usage_parity.test.ts +14 -0
  23. package/integrations/confluence/__tests__/write_handlers.test.ts +131 -0
  24. package/integrations/confluence/credentials.json +39 -0
  25. package/integrations/confluence/credentials_hint.md +4 -0
  26. package/integrations/confluence/credentials_hint_api_token.md +9 -0
  27. package/integrations/confluence/credentials_hint_oauth_token.md +8 -0
  28. package/integrations/confluence/handlers/add_comment.js +19 -0
  29. package/integrations/confluence/handlers/add_label.js +16 -0
  30. package/integrations/confluence/handlers/create_page.js +22 -0
  31. package/integrations/confluence/handlers/delete_page.js +17 -0
  32. package/integrations/confluence/handlers/get_comments.js +33 -0
  33. package/integrations/confluence/handlers/get_page_children.js +30 -0
  34. package/integrations/confluence/handlers/get_space.js +22 -0
  35. package/integrations/confluence/handlers/list_spaces.js +39 -0
  36. package/integrations/confluence/handlers/read_page.js +49 -0
  37. package/integrations/confluence/handlers/search_pages.js +42 -0
  38. package/integrations/confluence/handlers/update_page.js +42 -0
  39. package/integrations/confluence/manifest.json +85 -0
  40. package/integrations/confluence/prompt.md +55 -0
  41. package/integrations/confluence/schemas/add_comment.json +22 -0
  42. package/integrations/confluence/schemas/add_label.json +19 -0
  43. package/integrations/confluence/schemas/create_page.json +33 -0
  44. package/integrations/confluence/schemas/delete_page.json +23 -0
  45. package/integrations/confluence/schemas/empty.json +6 -0
  46. package/integrations/confluence/schemas/get_comments.json +24 -0
  47. package/integrations/confluence/schemas/get_page_children.json +28 -0
  48. package/integrations/confluence/schemas/get_space.json +18 -0
  49. package/integrations/confluence/schemas/list_spaces.json +36 -0
  50. package/integrations/confluence/schemas/read_page.json +28 -0
  51. package/integrations/confluence/schemas/search_pages.json +26 -0
  52. package/integrations/confluence/schemas/update_page.json +31 -0
  53. package/integrations/github/.env.test +16 -0
  54. package/integrations/github/.env.test.example +17 -0
  55. package/integrations/github/README.md +75 -0
  56. package/integrations/github/__tests__/get_handlers.test.ts +5 -5
  57. package/integrations/github/__tests__/write_handlers.test.ts +176 -58
  58. package/integrations/github/credentials.json +4 -2
  59. package/integrations/github/handlers/create_file.js +46 -0
  60. package/integrations/github/handlers/delete_file.js +14 -1
  61. package/integrations/github/handlers/edit_file.js +52 -0
  62. package/integrations/github/handlers/edit_files.js +107 -0
  63. package/integrations/github/manifest.json +74 -47
  64. package/integrations/github/prompt.md +36 -0
  65. package/integrations/github/schemas/create_file.json +13 -0
  66. package/integrations/github/schemas/delete_file.json +2 -2
  67. package/integrations/github/schemas/edit_file.json +26 -0
  68. package/integrations/github/schemas/edit_files.json +39 -0
  69. package/integrations/google-calendar/.env.test.example +11 -0
  70. package/integrations/google-calendar/README.md +41 -0
  71. package/integrations/google-calendar/__tests__/write_and_admin_handlers.test.ts +7 -7
  72. package/integrations/google-calendar/credentials.json +4 -2
  73. package/integrations/google-calendar/credentials_hint.md +1 -1
  74. package/integrations/google-calendar/manifest.json +27 -17
  75. package/integrations/google-docs/README.md +30 -0
  76. package/integrations/google-docs/credentials_hint.md +1 -1
  77. package/integrations/google-drive/README.md +26 -0
  78. package/integrations/google-drive/credentials.json +4 -2
  79. package/integrations/google-gmail/.env.test.example +11 -0
  80. package/integrations/google-gmail/README.md +49 -0
  81. package/integrations/google-gmail/credentials.json +4 -2
  82. package/integrations/google-gmail/handlers/create_draft_email.js +1 -1
  83. package/integrations/google-gmail/handlers/read_email.js +1 -1
  84. package/integrations/google-gmail/handlers/send_email.js +1 -1
  85. package/integrations/google-gmail/manifest.json +36 -25
  86. package/integrations/google-sheet/README.md +27 -0
  87. package/integrations/google-sheet/credentials_hint.md +1 -1
  88. package/integrations/google-slides/README.md +28 -0
  89. package/integrations/google-slides/credentials_hint.md +1 -1
  90. package/integrations/hubspot/.env.test.example +20 -0
  91. package/integrations/hubspot/README.md +48 -0
  92. package/integrations/hubspot/__tests__/get_handlers.test.ts +151 -0
  93. package/integrations/hubspot/__tests__/usage_parity.test.ts +10 -0
  94. package/integrations/hubspot/__tests__/write_handlers.test.ts +244 -0
  95. package/integrations/hubspot/credentials.json +50 -0
  96. package/integrations/hubspot/credentials_hint.md +20 -0
  97. package/integrations/hubspot/credentials_hint_oauth_token.md +16 -0
  98. package/integrations/hubspot/handlers/archive_company.js +13 -0
  99. package/integrations/hubspot/handlers/archive_contact.js +13 -0
  100. package/integrations/hubspot/handlers/archive_deal.js +13 -0
  101. package/integrations/hubspot/handlers/archive_ticket.js +13 -0
  102. package/integrations/hubspot/handlers/create_association.js +18 -0
  103. package/integrations/hubspot/handlers/create_company.js +13 -0
  104. package/integrations/hubspot/handlers/create_contact.js +14 -0
  105. package/integrations/hubspot/handlers/create_deal.js +16 -0
  106. package/integrations/hubspot/handlers/create_note.js +44 -0
  107. package/integrations/hubspot/handlers/create_task.js +48 -0
  108. package/integrations/hubspot/handlers/create_ticket.js +15 -0
  109. package/integrations/hubspot/handlers/get_associations.js +14 -0
  110. package/integrations/hubspot/handlers/get_company.js +18 -0
  111. package/integrations/hubspot/handlers/get_contact.js +18 -0
  112. package/integrations/hubspot/handlers/get_deal.js +18 -0
  113. package/integrations/hubspot/handlers/get_ticket.js +20 -0
  114. package/integrations/hubspot/handlers/list_owners.js +12 -0
  115. package/integrations/hubspot/handlers/list_pipelines.js +5 -0
  116. package/integrations/hubspot/handlers/list_properties.js +11 -0
  117. package/integrations/hubspot/handlers/remove_association.js +22 -0
  118. package/integrations/hubspot/handlers/search_companies.js +43 -0
  119. package/integrations/hubspot/handlers/search_contacts.js +43 -0
  120. package/integrations/hubspot/handlers/search_deals.js +43 -0
  121. package/integrations/hubspot/handlers/search_notes.js +43 -0
  122. package/integrations/hubspot/handlers/search_tasks.js +43 -0
  123. package/integrations/hubspot/handlers/search_tickets.js +43 -0
  124. package/integrations/hubspot/handlers/update_company.js +13 -0
  125. package/integrations/hubspot/handlers/update_contact.js +14 -0
  126. package/integrations/hubspot/handlers/update_deal.js +16 -0
  127. package/integrations/hubspot/handlers/update_task.js +17 -0
  128. package/integrations/hubspot/handlers/update_ticket.js +15 -0
  129. package/integrations/hubspot/manifest.json +230 -0
  130. package/integrations/hubspot/prompt.md +69 -0
  131. package/integrations/hubspot/schemas/archive_company.json +13 -0
  132. package/integrations/hubspot/schemas/archive_contact.json +13 -0
  133. package/integrations/hubspot/schemas/archive_deal.json +9 -0
  134. package/integrations/hubspot/schemas/archive_ticket.json +9 -0
  135. package/integrations/hubspot/schemas/create_association.json +24 -0
  136. package/integrations/hubspot/schemas/create_company.json +14 -0
  137. package/integrations/hubspot/schemas/create_contact.json +15 -0
  138. package/integrations/hubspot/schemas/create_deal.json +20 -0
  139. package/integrations/hubspot/schemas/create_note.json +37 -0
  140. package/integrations/hubspot/schemas/create_task.json +51 -0
  141. package/integrations/hubspot/schemas/create_ticket.json +16 -0
  142. package/integrations/hubspot/schemas/empty.json +6 -0
  143. package/integrations/hubspot/schemas/get_associations.json +30 -0
  144. package/integrations/hubspot/schemas/get_company.json +27 -0
  145. package/integrations/hubspot/schemas/get_contact.json +27 -0
  146. package/integrations/hubspot/schemas/get_deal.json +20 -0
  147. package/integrations/hubspot/schemas/get_ticket.json +20 -0
  148. package/integrations/hubspot/schemas/list_owners.json +25 -0
  149. package/integrations/hubspot/schemas/list_pipelines.json +13 -0
  150. package/integrations/hubspot/schemas/list_properties.json +17 -0
  151. package/integrations/hubspot/schemas/remove_association.json +24 -0
  152. package/integrations/hubspot/schemas/search_companies.json +56 -0
  153. package/integrations/hubspot/schemas/search_contacts.json +56 -0
  154. package/integrations/hubspot/schemas/search_deals.json +43 -0
  155. package/integrations/hubspot/schemas/search_notes.json +43 -0
  156. package/integrations/hubspot/schemas/search_tasks.json +43 -0
  157. package/integrations/hubspot/schemas/search_tickets.json +43 -0
  158. package/integrations/hubspot/schemas/update_company.json +20 -0
  159. package/integrations/hubspot/schemas/update_contact.json +21 -0
  160. package/integrations/hubspot/schemas/update_deal.json +19 -0
  161. package/integrations/hubspot/schemas/update_task.json +31 -0
  162. package/integrations/hubspot/schemas/update_ticket.json +18 -0
  163. package/integrations/jira/.env.test +46 -0
  164. package/integrations/jira/.env.test.example +41 -0
  165. package/integrations/jira/README.md +46 -0
  166. package/integrations/jira/__tests__/get_handlers.test.ts +193 -0
  167. package/integrations/jira/__tests__/usage_parity.test.ts +14 -0
  168. package/integrations/jira/__tests__/write_handlers.test.ts +157 -0
  169. package/integrations/jira/credentials.json +39 -0
  170. package/integrations/jira/credentials_hint.md +4 -0
  171. package/integrations/jira/credentials_hint_api_token.md +6 -0
  172. package/integrations/jira/credentials_hint_oauth_token.md +6 -0
  173. package/integrations/jira/handlers/add_comment.js +9 -0
  174. package/integrations/jira/handlers/assign_issue.js +11 -0
  175. package/integrations/jira/handlers/create_issue.js +37 -0
  176. package/integrations/jira/handlers/create_sprint.js +19 -0
  177. package/integrations/jira/handlers/delete_issue.js +10 -0
  178. package/integrations/jira/handlers/get_backlog_issues.js +13 -0
  179. package/integrations/jira/handlers/get_board.js +6 -0
  180. package/integrations/jira/handlers/get_issue.js +63 -0
  181. package/integrations/jira/handlers/get_issue_comments.js +31 -0
  182. package/integrations/jira/handlers/get_myself.js +14 -0
  183. package/integrations/jira/handlers/get_project.js +28 -0
  184. package/integrations/jira/handlers/get_sprint.js +5 -0
  185. package/integrations/jira/handlers/get_sprint_issues.js +13 -0
  186. package/integrations/jira/handlers/get_transitions.js +23 -0
  187. package/integrations/jira/handlers/list_boards.js +34 -0
  188. package/integrations/jira/handlers/list_projects.js +29 -0
  189. package/integrations/jira/handlers/list_sprints.js +29 -0
  190. package/integrations/jira/handlers/move_issues_to_sprint.js +11 -0
  191. package/integrations/jira/handlers/search_issues.js +43 -0
  192. package/integrations/jira/handlers/search_users.js +21 -0
  193. package/integrations/jira/handlers/transition_issue.js +44 -0
  194. package/integrations/jira/handlers/update_issue.js +40 -0
  195. package/integrations/jira/handlers/update_sprint.js +20 -0
  196. package/integrations/jira/manifest.json +204 -0
  197. package/integrations/jira/prompt.md +80 -0
  198. package/integrations/jira/schemas/add_comment.json +16 -0
  199. package/integrations/jira/schemas/assign_issue.json +16 -0
  200. package/integrations/jira/schemas/create_issue.json +49 -0
  201. package/integrations/jira/schemas/create_sprint.json +29 -0
  202. package/integrations/jira/schemas/delete_issue.json +12 -0
  203. package/integrations/jira/schemas/empty.json +6 -0
  204. package/integrations/jira/schemas/get_backlog_issues.json +33 -0
  205. package/integrations/jira/schemas/get_board.json +13 -0
  206. package/integrations/jira/schemas/get_issue.json +23 -0
  207. package/integrations/jira/schemas/get_issue_comments.json +23 -0
  208. package/integrations/jira/schemas/get_project.json +17 -0
  209. package/integrations/jira/schemas/get_sprint.json +13 -0
  210. package/integrations/jira/schemas/get_sprint_issues.json +33 -0
  211. package/integrations/jira/schemas/get_transitions.json +12 -0
  212. package/integrations/jira/schemas/list_boards.json +27 -0
  213. package/integrations/jira/schemas/list_projects.json +22 -0
  214. package/integrations/jira/schemas/list_sprints.json +29 -0
  215. package/integrations/jira/schemas/move_issues_to_sprint.json +19 -0
  216. package/integrations/jira/schemas/search_issues.json +28 -0
  217. package/integrations/jira/schemas/search_users.json +18 -0
  218. package/integrations/jira/schemas/transition_issue.json +38 -0
  219. package/integrations/jira/schemas/update_issue.json +47 -0
  220. package/integrations/jira/schemas/update_sprint.json +33 -0
  221. package/integrations/new_integration_prompt.md +173 -2
  222. package/integrations/notion/.env.test +10 -0
  223. package/integrations/notion/.env.test.example +13 -0
  224. package/integrations/notion/README.md +42 -0
  225. package/integrations/notion/credentials.json +2 -1
  226. package/integrations/notion/manifest.json +64 -35
  227. package/integrations/trello/.env.test +6 -0
  228. package/integrations/trello/.env.test.example +9 -0
  229. package/integrations/trello/README.md +50 -0
  230. package/integrations/trello/credentials.json +2 -1
  231. package/package.json +7 -3
@@ -0,0 +1,28 @@
1
+ async (input) => {
2
+ const params = new URLSearchParams()
3
+ if (input.expandIssueTypes !== false)
4
+ params.set('expand', 'issueTypes')
5
+
6
+ const path = `/rest/api/3/project/${encodeURIComponent(input.projectIdOrKey)}${params.toString() ? `?${params.toString()}` : ''}`
7
+ const res = await integration.fetch(path)
8
+ const data = await res.json()
9
+
10
+ const issueTypes = Array.isArray(data.issueTypes) ? data.issueTypes : []
11
+
12
+ return {
13
+ id: data.id ?? null,
14
+ key: data.key ?? null,
15
+ name: data.name ?? null,
16
+ projectTypeKey: data.projectTypeKey ?? null,
17
+ simplified: data.simplified ?? null,
18
+ style: data.style ?? null,
19
+ isPrivate: data.isPrivate ?? null,
20
+ issueTypes: issueTypes.map(t => ({
21
+ id: t.id ?? null,
22
+ name: t.name ?? null,
23
+ description: t.description ?? null,
24
+ subtask: t.subtask ?? null,
25
+ })),
26
+ }
27
+ }
28
+
@@ -0,0 +1,5 @@
1
+ async (input) => {
2
+ const res = await integration.fetch(`/rest/agile/1.0/sprint/${encodeURIComponent(String(input.sprintId))}`)
3
+ return await res.json()
4
+ }
5
+
@@ -0,0 +1,13 @@
1
+ async (input) => {
2
+ const params = new URLSearchParams()
3
+ if (input.jql)
4
+ params.set('jql', input.jql)
5
+ if (Array.isArray(input.fields) && input.fields.length)
6
+ params.set('fields', input.fields.join(','))
7
+ params.set('startAt', String(input.startAt ?? 0))
8
+ params.set('maxResults', String(input.maxResults ?? 50))
9
+
10
+ const res = await integration.fetch(`/rest/agile/1.0/sprint/${encodeURIComponent(String(input.sprintId))}/issue?${params.toString()}`)
11
+ return await res.json()
12
+ }
13
+
@@ -0,0 +1,23 @@
1
+ async (input) => {
2
+ const path = `/rest/api/3/issue/${encodeURIComponent(input.issueIdOrKey)}/transitions`
3
+ const res = await integration.fetch(path)
4
+ const data = await res.json()
5
+ const transitions = Array.isArray(data.transitions) ? data.transitions : []
6
+
7
+ return {
8
+ transitions: transitions.map(t => ({
9
+ id: t.id ?? null,
10
+ name: t.name ?? null,
11
+ to: t.to
12
+ ? {
13
+ id: t.to.id ?? null,
14
+ name: t.to.name ?? null,
15
+ statusCategory: t.to.statusCategory
16
+ ? { key: t.to.statusCategory.key ?? null, name: t.to.statusCategory.name ?? null }
17
+ : null,
18
+ }
19
+ : null,
20
+ })),
21
+ }
22
+ }
23
+
@@ -0,0 +1,34 @@
1
+ async (input) => {
2
+ const params = new URLSearchParams()
3
+ if (input?.projectKeyOrId)
4
+ params.set('projectKeyOrId', input.projectKeyOrId)
5
+ if (input?.type)
6
+ params.set('type', input.type)
7
+ params.set('startAt', String(input?.startAt ?? 0))
8
+ params.set('maxResults', String(input?.maxResults ?? 50))
9
+
10
+ const res = await integration.fetch(`/rest/agile/1.0/board?${params.toString()}`)
11
+ const data = await res.json()
12
+ const values = Array.isArray(data.values) ? data.values : []
13
+
14
+ return {
15
+ startAt: data.startAt ?? (input?.startAt ?? 0),
16
+ maxResults: data.maxResults ?? (input?.maxResults ?? 50),
17
+ total: data.total ?? values.length,
18
+ isLast: Boolean(data.isLast),
19
+ boards: values.map(b => ({
20
+ id: b.id ?? null,
21
+ name: b.name ?? null,
22
+ type: b.type ?? null,
23
+ location: b.location
24
+ ? {
25
+ projectId: b.location.projectId ?? null,
26
+ projectKey: b.location.projectKey ?? null,
27
+ projectName: b.location.projectName ?? null,
28
+ }
29
+ : null,
30
+ self: b.self ?? null,
31
+ })),
32
+ }
33
+ }
34
+
@@ -0,0 +1,29 @@
1
+ async (input) => {
2
+ const params = new URLSearchParams()
3
+ if (input?.query)
4
+ params.set('query', input.query)
5
+ params.set('startAt', String(input?.startAt ?? 0))
6
+ params.set('maxResults', String(input?.maxResults ?? 50))
7
+
8
+ const path = `/rest/api/3/project/search?${params.toString()}`
9
+ const res = await integration.fetch(path)
10
+ const data = await res.json()
11
+ const values = Array.isArray(data.values) ? data.values : []
12
+
13
+ return {
14
+ startAt: data.startAt ?? (input?.startAt ?? 0),
15
+ maxResults: data.maxResults ?? (input?.maxResults ?? 50),
16
+ total: data.total ?? values.length,
17
+ isLast: Boolean(data.isLast),
18
+ projects: values.map(p => ({
19
+ id: p.id ?? null,
20
+ key: p.key ?? null,
21
+ name: p.name ?? null,
22
+ projectTypeKey: p.projectTypeKey ?? null,
23
+ simplified: p.simplified ?? null,
24
+ style: p.style ?? null,
25
+ isPrivate: p.isPrivate ?? null,
26
+ })),
27
+ }
28
+ }
29
+
@@ -0,0 +1,29 @@
1
+ async (input) => {
2
+ const params = new URLSearchParams()
3
+ if (Array.isArray(input.state) && input.state.length)
4
+ params.set('state', input.state.join(','))
5
+ params.set('startAt', String(input.startAt ?? 0))
6
+ params.set('maxResults', String(input.maxResults ?? 50))
7
+
8
+ const res = await integration.fetch(`/rest/agile/1.0/board/${encodeURIComponent(String(input.boardId))}/sprint?${params.toString()}`)
9
+ const data = await res.json()
10
+ const values = Array.isArray(data.values) ? data.values : []
11
+
12
+ return {
13
+ startAt: data.startAt ?? (input.startAt ?? 0),
14
+ maxResults: data.maxResults ?? (input.maxResults ?? 50),
15
+ total: data.total ?? values.length,
16
+ isLast: Boolean(data.isLast),
17
+ sprints: values.map(s => ({
18
+ id: s.id ?? null,
19
+ name: s.name ?? null,
20
+ state: s.state ?? null,
21
+ goal: s.goal ?? null,
22
+ startDate: s.startDate ?? null,
23
+ endDate: s.endDate ?? null,
24
+ completeDate: s.completeDate ?? null,
25
+ self: s.self ?? null,
26
+ })),
27
+ }
28
+ }
29
+
@@ -0,0 +1,11 @@
1
+ async (input) => {
2
+ const res = await integration.fetch(`/rest/agile/1.0/sprint/${encodeURIComponent(String(input.sprintId))}/issue`, {
3
+ method: 'POST',
4
+ body: { issues: input.issueKeys },
5
+ })
6
+
7
+ if (res.status === 204)
8
+ return { success: true }
9
+ return await res.json()
10
+ }
11
+
@@ -0,0 +1,43 @@
1
+ async (input) => {
2
+ const body = {
3
+ jql: input.jql,
4
+ maxResults: input.maxResults ?? 50,
5
+ }
6
+
7
+ if (Array.isArray(input.fields) && input.fields.length)
8
+ body.fields = input.fields
9
+ if (input.nextPageToken)
10
+ body.nextPageToken = input.nextPageToken
11
+
12
+ const res = await integration.fetch('/rest/api/3/search/jql', {
13
+ method: 'POST',
14
+ body,
15
+ })
16
+
17
+ const data = await res.json()
18
+ const issues = Array.isArray(data.issues) ? data.issues : []
19
+
20
+ return {
21
+ isLast: Boolean(data.isLast),
22
+ nextPageToken: data.nextPageToken ?? null,
23
+ issues: issues.map((i) => ({
24
+ id: i.id,
25
+ key: i.key,
26
+ summary: i.fields?.summary ?? null,
27
+ status: i.fields?.status?.name ?? null,
28
+ assignee: i.fields?.assignee
29
+ ? {
30
+ accountId: i.fields.assignee.accountId ?? null,
31
+ displayName: i.fields.assignee.displayName ?? null,
32
+ }
33
+ : null,
34
+ priority: i.fields?.priority?.name ?? null,
35
+ issueType: i.fields?.issuetype?.name ?? null,
36
+ project: i.fields?.project
37
+ ? { key: i.fields.project.key ?? null, name: i.fields.project.name ?? null }
38
+ : null,
39
+ updated: i.fields?.updated ?? null,
40
+ })),
41
+ }
42
+ }
43
+
@@ -0,0 +1,21 @@
1
+ async (input) => {
2
+ const params = new URLSearchParams()
3
+ params.set('query', input.query)
4
+ params.set('maxResults', String(input.maxResults ?? 50))
5
+
6
+ const res = await integration.fetch(`/rest/api/3/user/search?${params.toString()}`)
7
+ const data = await res.json()
8
+ const users = Array.isArray(data) ? data : []
9
+
10
+ return {
11
+ users: users.map(u => ({
12
+ accountId: u.accountId ?? null,
13
+ displayName: u.displayName ?? null,
14
+ active: u.active ?? null,
15
+ accountType: u.accountType ?? null,
16
+ emailAddress: u.emailAddress ?? null,
17
+ timeZone: u.timeZone ?? null,
18
+ })),
19
+ }
20
+ }
21
+
@@ -0,0 +1,44 @@
1
+ async (input) => {
2
+ const resolveTransitionId = async (issueIdOrKey, transitionId, transitionName) => {
3
+ if (transitionId)
4
+ return String(transitionId)
5
+ const name = String(transitionName || '').trim().toLowerCase()
6
+ if (!name)
7
+ return null
8
+
9
+ const res = await integration.fetch(`/rest/api/3/issue/${encodeURIComponent(issueIdOrKey)}/transitions`)
10
+ const data = await res.json()
11
+ const transitions = Array.isArray(data.transitions) ? data.transitions : []
12
+ const match = transitions.find(t => String(t?.name || '').trim().toLowerCase() === name)
13
+ return match?.id ? String(match.id) : null
14
+ }
15
+
16
+ const id = await resolveTransitionId(input.issueIdOrKey, input.transitionId, input.transitionName)
17
+ if (!id)
18
+ throw new Error(`Could not resolve transition. Provide a valid transitionId or transitionName (call get_transitions to see available transitions).`)
19
+
20
+ const body = {
21
+ transition: { id },
22
+ }
23
+
24
+ if (input.fields && typeof input.fields === 'object')
25
+ body.fields = input.fields
26
+ if (input.update && typeof input.update === 'object')
27
+ body.update = input.update
28
+
29
+ if (input.commentText) {
30
+ body.update = body.update || {}
31
+ body.update.comment = body.update.comment || []
32
+ body.update.comment.push({ add: { body: utils.adf?.fromMarkdown(input.commentText) } })
33
+ }
34
+
35
+ const res = await integration.fetch(`/rest/api/3/issue/${encodeURIComponent(input.issueIdOrKey)}/transitions`, {
36
+ method: 'POST',
37
+ body,
38
+ })
39
+
40
+ if (res.status === 204)
41
+ return { success: true }
42
+ return await res.json()
43
+ }
44
+
@@ -0,0 +1,40 @@
1
+ async (input) => {
2
+ const fields = { ...(input.fields || {}) }
3
+ const update = input.update ? { ...(input.update || {}) } : undefined
4
+
5
+ if (typeof input.summary === 'string')
6
+ fields.summary = input.summary
7
+
8
+ if (typeof input.descriptionText === 'string')
9
+ fields.description = utils.adf?.fromMarkdown(input.descriptionText)
10
+
11
+ if (Array.isArray(input.labels))
12
+ fields.labels = input.labels
13
+
14
+ if (input.priorityId)
15
+ fields.priority = { id: input.priorityId }
16
+ else if (input.priorityName)
17
+ fields.priority = { name: input.priorityName }
18
+
19
+ if (input.assigneeAccountId !== undefined) {
20
+ fields.assignee = input.assigneeAccountId === null
21
+ ? null
22
+ : { accountId: input.assigneeAccountId }
23
+ }
24
+
25
+ const body = {}
26
+ if (Object.keys(fields).length)
27
+ body.fields = fields
28
+ if (update && Object.keys(update).length)
29
+ body.update = update
30
+
31
+ const res = await integration.fetch(`/rest/api/3/issue/${encodeURIComponent(input.issueIdOrKey)}`, {
32
+ method: 'PUT',
33
+ body,
34
+ })
35
+
36
+ if (res.status === 204)
37
+ return { success: true }
38
+ return await res.json()
39
+ }
40
+
@@ -0,0 +1,20 @@
1
+ async (input) => {
2
+ const body = {}
3
+ if (input.name !== undefined)
4
+ body.name = input.name
5
+ if (input.goal !== undefined)
6
+ body.goal = input.goal
7
+ if (input.state !== undefined)
8
+ body.state = input.state
9
+ if (input.startDate !== undefined)
10
+ body.startDate = input.startDate
11
+ if (input.endDate !== undefined)
12
+ body.endDate = input.endDate
13
+
14
+ const res = await integration.fetch(`/rest/agile/1.0/sprint/${encodeURIComponent(String(input.sprintId))}`, {
15
+ method: 'POST',
16
+ body,
17
+ })
18
+
19
+ return await res.json()
20
+ }
@@ -0,0 +1,204 @@
1
+ {
2
+ "name": "jira",
3
+ "version": "0.1.0",
4
+ "utils": ["adf"],
5
+ "toolsets": {
6
+ "issues": {
7
+ "label": "Issues",
8
+ "description": "Search, read, create, and manage Jira issues"
9
+ },
10
+ "boards": {
11
+ "label": "Boards & Sprints",
12
+ "description": "Work with Jira Software boards, sprints, and backlogs"
13
+ }
14
+ },
15
+ "tools": [
16
+ {
17
+ "name": "search_issues",
18
+ "description": "Search for issues using JQL. Returns a compact list of issues with key fields. Uses the modern /search/jql endpoint with nextPageToken pagination.",
19
+ "inputSchema": "schemas/search_issues.json",
20
+ "handler": "handlers/search_issues.js",
21
+ "scope": "read",
22
+ "toolset": "issues"
23
+ },
24
+ {
25
+ "name": "get_issue",
26
+ "description": "Get details for a Jira issue by key (e.g. PROJ-123). Converts the issue description from Jira ADF into Markdown for easier reading.",
27
+ "inputSchema": "schemas/get_issue.json",
28
+ "handler": "handlers/get_issue.js",
29
+ "scope": "read",
30
+ "toolset": "issues"
31
+ },
32
+ {
33
+ "name": "get_issue_comments",
34
+ "description": "List comments on an issue. Converts each comment body from Jira ADF into Markdown.",
35
+ "inputSchema": "schemas/get_issue_comments.json",
36
+ "handler": "handlers/get_issue_comments.js",
37
+ "scope": "read",
38
+ "toolset": "issues"
39
+ },
40
+ {
41
+ "name": "list_projects",
42
+ "description": "List accessible Jira projects (key, name, type). Use this before creating issues to discover valid project keys.",
43
+ "inputSchema": "schemas/list_projects.json",
44
+ "handler": "handlers/list_projects.js",
45
+ "scope": "read",
46
+ "toolset": "issues"
47
+ },
48
+ {
49
+ "name": "get_project",
50
+ "description": "Get a project by key or ID. Includes issue types when expandIssueTypes=true, which is useful to choose a valid issue type name before create_issue.",
51
+ "inputSchema": "schemas/get_project.json",
52
+ "handler": "handlers/get_project.js",
53
+ "scope": "read",
54
+ "toolset": "issues"
55
+ },
56
+ {
57
+ "name": "get_transitions",
58
+ "description": "List available workflow transitions for an issue. Use this to discover valid transition names/IDs before calling transition_issue.",
59
+ "inputSchema": "schemas/get_transitions.json",
60
+ "handler": "handlers/get_transitions.js",
61
+ "scope": "read",
62
+ "toolset": "issues"
63
+ },
64
+ {
65
+ "name": "get_myself",
66
+ "description": "Get the authenticated Jira user profile for the current credentials.",
67
+ "inputSchema": "schemas/empty.json",
68
+ "handler": "handlers/get_myself.js",
69
+ "scope": "read",
70
+ "toolset": "issues"
71
+ },
72
+ {
73
+ "name": "search_users",
74
+ "description": "Search for users and return accountIds for assignment. Use this to find assigneeAccountId values for create_issue/update_issue/assign_issue.",
75
+ "inputSchema": "schemas/search_users.json",
76
+ "handler": "handlers/search_users.js",
77
+ "scope": "read",
78
+ "toolset": "issues"
79
+ },
80
+
81
+ {
82
+ "name": "create_issue",
83
+ "description": "Create a new Jira issue. Provide descriptionText as Markdown; the handler converts it to Jira ADF automatically. Use get_project to discover valid issue types.",
84
+ "inputSchema": "schemas/create_issue.json",
85
+ "handler": "handlers/create_issue.js",
86
+ "scope": "write",
87
+ "toolset": "issues"
88
+ },
89
+ {
90
+ "name": "update_issue",
91
+ "description": "Update a Jira issue. You can use simple fields like summary/descriptionText/labels/priorityName/assigneeAccountId, or pass advanced Jira 'fields'/'update' objects for complex updates. descriptionText is treated as Markdown and converted to ADF automatically.",
92
+ "inputSchema": "schemas/update_issue.json",
93
+ "handler": "handlers/update_issue.js",
94
+ "scope": "write",
95
+ "toolset": "issues"
96
+ },
97
+ {
98
+ "name": "transition_issue",
99
+ "description": "Transition an issue to a new workflow status. Provide transitionId or transitionName. If transitionName is provided, the handler resolves it by fetching transitions first. Optionally add a comment during the transition (commentText is treated as Markdown and converted to ADF).",
100
+ "inputSchema": "schemas/transition_issue.json",
101
+ "handler": "handlers/transition_issue.js",
102
+ "scope": "write",
103
+ "toolset": "issues"
104
+ },
105
+ {
106
+ "name": "add_comment",
107
+ "description": "Add a comment to an issue. Provide bodyText as Markdown; the handler converts it to Jira ADF automatically.",
108
+ "inputSchema": "schemas/add_comment.json",
109
+ "handler": "handlers/add_comment.js",
110
+ "scope": "write",
111
+ "toolset": "issues"
112
+ },
113
+ {
114
+ "name": "assign_issue",
115
+ "description": "Assign an issue to a user (by accountId) or unassign it (accountId=null). Use search_users to find accountIds.",
116
+ "inputSchema": "schemas/assign_issue.json",
117
+ "handler": "handlers/assign_issue.js",
118
+ "scope": "write",
119
+ "toolset": "issues"
120
+ },
121
+ {
122
+ "name": "delete_issue",
123
+ "description": "Delete an issue. This is irreversible. Use with care.",
124
+ "inputSchema": "schemas/delete_issue.json",
125
+ "handler": "handlers/delete_issue.js",
126
+ "scope": "write",
127
+ "toolset": "issues"
128
+ },
129
+
130
+ {
131
+ "name": "list_boards",
132
+ "description": "List Jira Software boards. Filter by projectKeyOrId and board type (scrum/kanban).",
133
+ "inputSchema": "schemas/list_boards.json",
134
+ "handler": "handlers/list_boards.js",
135
+ "scope": "read",
136
+ "toolset": "boards"
137
+ },
138
+ {
139
+ "name": "get_board",
140
+ "description": "Get details for a Jira Software board by boardId.",
141
+ "inputSchema": "schemas/get_board.json",
142
+ "handler": "handlers/get_board.js",
143
+ "scope": "read",
144
+ "toolset": "boards"
145
+ },
146
+ {
147
+ "name": "list_sprints",
148
+ "description": "List sprints for a board. Optionally filter by sprint state (future/active/closed).",
149
+ "inputSchema": "schemas/list_sprints.json",
150
+ "handler": "handlers/list_sprints.js",
151
+ "scope": "read",
152
+ "toolset": "boards"
153
+ },
154
+ {
155
+ "name": "get_sprint",
156
+ "description": "Get sprint details by sprintId (name, state, start/end dates, goal).",
157
+ "inputSchema": "schemas/get_sprint.json",
158
+ "handler": "handlers/get_sprint.js",
159
+ "scope": "read",
160
+ "toolset": "boards"
161
+ },
162
+ {
163
+ "name": "get_sprint_issues",
164
+ "description": "List issues in a sprint. Useful for sprint status reports and review preparation.",
165
+ "inputSchema": "schemas/get_sprint_issues.json",
166
+ "handler": "handlers/get_sprint_issues.js",
167
+ "scope": "read",
168
+ "toolset": "boards"
169
+ },
170
+ {
171
+ "name": "get_backlog_issues",
172
+ "description": "List issues in the backlog for a board.",
173
+ "inputSchema": "schemas/get_backlog_issues.json",
174
+ "handler": "handlers/get_backlog_issues.js",
175
+ "scope": "read",
176
+ "toolset": "boards"
177
+ },
178
+ {
179
+ "name": "move_issues_to_sprint",
180
+ "description": "Move one or more issues into a sprint (agile API).",
181
+ "inputSchema": "schemas/move_issues_to_sprint.json",
182
+ "handler": "handlers/move_issues_to_sprint.js",
183
+ "scope": "write",
184
+ "toolset": "boards"
185
+ },
186
+ {
187
+ "name": "create_sprint",
188
+ "description": "Create a sprint in a board (agile API). Use this for sprint-planning workflows and for integration test setup.",
189
+ "inputSchema": "schemas/create_sprint.json",
190
+ "handler": "handlers/create_sprint.js",
191
+ "scope": "write",
192
+ "toolset": "boards"
193
+ },
194
+ {
195
+ "name": "update_sprint",
196
+ "description": "Update a sprint (agile API). Use to rename, set/change goal, start a sprint (state: active, requires startDate + endDate), or close it (state: closed). Partial update — only provided fields are changed.",
197
+ "inputSchema": "schemas/update_sprint.json",
198
+ "handler": "handlers/update_sprint.js",
199
+ "scope": "write",
200
+ "toolset": "boards"
201
+ }
202
+ ]
203
+ }
204
+
@@ -0,0 +1,80 @@
1
+ # Jira usage guide
2
+
3
+ ## Core workflow patterns
4
+
5
+ ### Discover projects and issue types (before creating issues)
6
+
7
+ 1. Call `list_projects` to find the project key (e.g. `PROJ`).
8
+ 2. Call `get_project` with `projectIdOrKey=PROJ` to see available `issueTypes`.
9
+ 3. Use the returned issue type name with `create_issue.issueTypeName`.
10
+
11
+ ### Search issues (JQL)
12
+
13
+ Use `search_issues` with JQL. Common examples:
14
+
15
+ - My open issues:
16
+ - `assignee = currentUser() AND statusCategory != Done ORDER BY updated DESC`
17
+ - Recently updated issues in a project:
18
+ - `project = PROJ ORDER BY updated DESC`
19
+ - Unassigned bugs:
20
+ - `project = PROJ AND issuetype = Bug AND assignee is EMPTY ORDER BY created DESC`
21
+ - Blocked issues (label-based):
22
+ - `project = PROJ AND labels = blocked ORDER BY priority DESC, updated DESC`
23
+
24
+ Pagination:
25
+ - `search_issues` uses `nextPageToken`. If `nextPageToken` is returned and `isLast=false`, pass it back to get the next page.
26
+
27
+ ### Read issue content
28
+
29
+ - Use `get_issue` to read a compact issue summary.
30
+ - `get_issue` converts Jira's ADF description into `descriptionMarkdown` when possible (fallback: `descriptionText`).
31
+ - Use `get_issue_comments` to read the comment thread (comment bodies are converted to Markdown).
32
+
33
+ ### Transition an issue (change status)
34
+
35
+ Jira workflows are project-specific, so you must discover valid transitions:
36
+
37
+ 1. Call `get_transitions` to see available transition names/IDs for the issue.
38
+ 2. Call `transition_issue` using either `transitionId` (preferred) or `transitionName`.
39
+
40
+ ### Assigning issues
41
+
42
+ 1. Call `search_users` to find the user's `accountId`.
43
+ 2. Assign:
44
+ - `assign_issue { issueIdOrKey, accountId }`
45
+ 3. Unassign:
46
+ - `assign_issue { issueIdOrKey, accountId: null }`
47
+
48
+ ## Notes on Jira rich text (ADF)
49
+
50
+ Jira Cloud REST API v3 uses **Atlassian Document Format (ADF)** for fields like `description` and comment bodies.
51
+
52
+ - Read tools convert ADF to Markdown so you can read it directly.
53
+ - Write tools accept **Markdown** in their `*Text` fields and convert it to ADF (`descriptionText`, `bodyText`, `commentText`).
54
+
55
+ ### Round-trip Markdown workflow (recommended)
56
+
57
+ You can safely do a Markdown round-trip:
58
+
59
+ 1. `get_issue` -> edit `descriptionMarkdown`
60
+ 2. `update_issue { descriptionText: <your edited Markdown> }`
61
+
62
+ Supported Markdown features when writing:
63
+
64
+ - Headings (`#`, `##`, ...)
65
+ - Bold/italic/strikethrough (`**bold**`, `*italic*`, `~~strike~~`)
66
+ - Inline code and fenced code blocks (```), including optional language fences
67
+ - Lists (ordered/unordered), nested lists
68
+ - Blockquotes (`>`)
69
+ - Horizontal rules (`---`)
70
+ - Tables
71
+ - Links (`[text](url)`)
72
+
73
+ ## Boards & sprints
74
+
75
+ If you’re using Jira Software:
76
+
77
+ 1. Call `list_boards` (optionally filter by `projectKeyOrId`).
78
+ 2. Call `list_sprints` for a board to find active/future sprints.
79
+ 3. Use `move_issues_to_sprint` to pull work into a sprint (sprint planning).
80
+
@@ -0,0 +1,16 @@
1
+ {
2
+ "type": "object",
3
+ "properties": {
4
+ "issueIdOrKey": {
5
+ "type": "string",
6
+ "description": "Issue key like \"PROJ-123\" or numeric issue ID."
7
+ },
8
+ "bodyText": {
9
+ "type": "string",
10
+ "description": "Plain-text comment body. Converted to ADF by the handler."
11
+ }
12
+ },
13
+ "required": ["issueIdOrKey", "bodyText"],
14
+ "additionalProperties": false
15
+ }
16
+
@@ -0,0 +1,16 @@
1
+ {
2
+ "type": "object",
3
+ "properties": {
4
+ "issueIdOrKey": {
5
+ "type": "string",
6
+ "description": "Issue key like \"PROJ-123\" or numeric issue ID."
7
+ },
8
+ "accountId": {
9
+ "type": ["string", "null"],
10
+ "description": "Account ID to assign the issue to, or null to unassign."
11
+ }
12
+ },
13
+ "required": ["issueIdOrKey", "accountId"],
14
+ "additionalProperties": false
15
+ }
16
+