@commandable/integration-data 0.0.5 → 0.0.7

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 (387) hide show
  1. package/dist/credentials-index.d.ts.map +1 -1
  2. package/dist/credentials-index.js +183 -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 +33 -0
  9. package/dist/loader.d.ts.map +1 -1
  10. package/dist/loader.js +36 -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/confluence/.env.test +25 -0
  18. package/integrations/confluence/.env.test.example +36 -0
  19. package/integrations/confluence/README.md +28 -0
  20. package/integrations/confluence/__tests__/get_handlers.test.ts +121 -0
  21. package/integrations/confluence/__tests__/usage_parity.test.ts +14 -0
  22. package/integrations/confluence/__tests__/write_handlers.test.ts +131 -0
  23. package/integrations/confluence/credentials.json +39 -0
  24. package/integrations/confluence/credentials_hint.md +4 -0
  25. package/integrations/confluence/credentials_hint_api_token.md +9 -0
  26. package/integrations/confluence/credentials_hint_oauth_token.md +8 -0
  27. package/integrations/confluence/handlers/add_comment.js +19 -0
  28. package/integrations/confluence/handlers/add_label.js +16 -0
  29. package/integrations/confluence/handlers/create_page.js +22 -0
  30. package/integrations/confluence/handlers/delete_page.js +17 -0
  31. package/integrations/confluence/handlers/get_comments.js +33 -0
  32. package/integrations/confluence/handlers/get_page_children.js +30 -0
  33. package/integrations/confluence/handlers/get_space.js +22 -0
  34. package/integrations/confluence/handlers/list_spaces.js +39 -0
  35. package/integrations/confluence/handlers/read_page.js +49 -0
  36. package/integrations/confluence/handlers/search_pages.js +42 -0
  37. package/integrations/confluence/handlers/update_page.js +42 -0
  38. package/integrations/confluence/manifest.json +85 -0
  39. package/integrations/confluence/prompt.md +55 -0
  40. package/integrations/confluence/schemas/add_comment.json +22 -0
  41. package/integrations/confluence/schemas/add_label.json +19 -0
  42. package/integrations/confluence/schemas/create_page.json +33 -0
  43. package/integrations/confluence/schemas/delete_page.json +23 -0
  44. package/integrations/confluence/schemas/empty.json +6 -0
  45. package/integrations/confluence/schemas/get_comments.json +24 -0
  46. package/integrations/confluence/schemas/get_page_children.json +28 -0
  47. package/integrations/confluence/schemas/get_space.json +18 -0
  48. package/integrations/confluence/schemas/list_spaces.json +36 -0
  49. package/integrations/confluence/schemas/read_page.json +28 -0
  50. package/integrations/confluence/schemas/search_pages.json +26 -0
  51. package/integrations/confluence/schemas/update_page.json +31 -0
  52. package/integrations/github/.env.test +16 -0
  53. package/integrations/github/.env.test.example +17 -0
  54. package/integrations/github/README.md +75 -0
  55. package/integrations/github/__tests__/get_handlers.test.ts +207 -12
  56. package/integrations/github/__tests__/write_handlers.test.ts +323 -55
  57. package/integrations/github/handlers/create_commit.js +10 -2
  58. package/integrations/github/handlers/create_file.js +46 -0
  59. package/integrations/github/handlers/create_pull_request_review.js +10 -0
  60. package/integrations/github/handlers/create_release.js +14 -0
  61. package/integrations/github/handlers/delete_branch.js +8 -0
  62. package/integrations/github/handlers/delete_file.js +22 -0
  63. package/integrations/github/handlers/edit_file.js +52 -0
  64. package/integrations/github/handlers/edit_files.js +107 -0
  65. package/integrations/github/handlers/fork_repo.js +10 -0
  66. package/integrations/github/handlers/get_commit.js +8 -0
  67. package/integrations/github/handlers/get_file_contents.js +21 -0
  68. package/integrations/github/handlers/get_job_logs.js +6 -0
  69. package/integrations/github/handlers/get_latest_release.js +4 -0
  70. package/integrations/github/handlers/get_me.js +4 -0
  71. package/integrations/github/handlers/get_pull_request.js +4 -0
  72. package/integrations/github/handlers/get_pull_request_diff.js +8 -0
  73. package/integrations/github/handlers/get_repo_tree.js +12 -0
  74. package/integrations/github/handlers/get_workflow_run.js +4 -0
  75. package/integrations/github/handlers/list_branches.js +6 -1
  76. package/integrations/github/handlers/list_commits.js +5 -6
  77. package/integrations/github/handlers/list_issue_comments.js +8 -0
  78. package/integrations/github/handlers/list_issues.js +5 -6
  79. package/integrations/github/handlers/list_labels.js +8 -0
  80. package/integrations/github/handlers/list_pull_request_comments.js +8 -0
  81. package/integrations/github/handlers/list_pull_request_files.js +8 -0
  82. package/integrations/github/handlers/list_pull_requests.js +7 -2
  83. package/integrations/github/handlers/list_releases.js +8 -0
  84. package/integrations/github/handlers/list_tags.js +8 -0
  85. package/integrations/github/handlers/list_workflow_runs.js +11 -0
  86. package/integrations/github/handlers/request_pull_request_reviewers.js +10 -0
  87. package/integrations/github/handlers/search_code.js +8 -0
  88. package/integrations/github/handlers/search_issues.js +8 -0
  89. package/integrations/github/handlers/search_pull_requests.js +8 -0
  90. package/integrations/github/handlers/search_repos.js +10 -0
  91. package/integrations/github/handlers/update_pull_request.js +13 -0
  92. package/integrations/github/manifest.json +86 -21
  93. package/integrations/github/prompt.md +36 -0
  94. package/integrations/github/schemas/create_file.json +13 -0
  95. package/integrations/github/schemas/create_pull_request_review.json +17 -0
  96. package/integrations/github/schemas/create_release.json +16 -0
  97. package/integrations/github/schemas/delete_branch.json +10 -0
  98. package/integrations/github/schemas/delete_file.json +13 -0
  99. package/integrations/github/schemas/edit_file.json +26 -0
  100. package/integrations/github/schemas/edit_files.json +39 -0
  101. package/integrations/github/schemas/fork_repo.json +11 -0
  102. package/integrations/github/schemas/get_commit.json +12 -0
  103. package/integrations/github/schemas/get_file_contents.json +11 -0
  104. package/integrations/github/schemas/get_job_logs.json +10 -0
  105. package/integrations/github/schemas/get_pull_request.json +10 -0
  106. package/integrations/github/schemas/get_pull_request_diff.json +10 -0
  107. package/integrations/github/schemas/get_repo_tree.json +12 -0
  108. package/integrations/github/schemas/get_workflow_run.json +10 -0
  109. package/integrations/github/schemas/list_branches.json +12 -0
  110. package/integrations/github/schemas/list_commits.json +5 -3
  111. package/integrations/github/schemas/list_issue_comments.json +12 -0
  112. package/integrations/github/schemas/list_issues.json +4 -2
  113. package/integrations/github/schemas/list_labels.json +11 -0
  114. package/integrations/github/schemas/list_pull_request_comments.json +12 -0
  115. package/integrations/github/schemas/list_pull_request_files.json +12 -0
  116. package/integrations/github/schemas/list_pull_requests.json +7 -1
  117. package/integrations/github/schemas/list_releases.json +11 -0
  118. package/integrations/github/schemas/list_tags.json +11 -0
  119. package/integrations/github/schemas/list_workflow_runs.json +18 -0
  120. package/integrations/github/schemas/request_pull_request_reviewers.json +20 -0
  121. package/integrations/github/schemas/search_code.json +10 -0
  122. package/integrations/github/schemas/search_issues.json +10 -0
  123. package/integrations/github/schemas/search_pull_requests.json +10 -0
  124. package/integrations/github/schemas/search_repos.json +12 -0
  125. package/integrations/github/schemas/update_pull_request.json +15 -0
  126. package/integrations/google-calendar/.env.test.example +11 -0
  127. package/integrations/google-calendar/README.md +41 -0
  128. package/integrations/google-calendar/__tests__/write_and_admin_handlers.test.ts +7 -20
  129. package/integrations/google-calendar/handlers/get_event.js +5 -1
  130. package/integrations/google-calendar/handlers/list_events.js +2 -0
  131. package/integrations/google-calendar/manifest.json +27 -18
  132. package/integrations/google-calendar/prompt.md +68 -0
  133. package/integrations/google-calendar/schemas/id_calendar_event.json +4 -2
  134. package/integrations/google-calendar/schemas/list_events.json +10 -8
  135. package/integrations/google-docs/README.md +30 -0
  136. package/integrations/google-docs/__tests__/get_handlers.test.ts +4 -19
  137. package/integrations/google-docs/__tests__/write_handlers.test.ts +31 -48
  138. package/integrations/google-docs/handlers/read_document.js +189 -0
  139. package/integrations/google-docs/manifest.json +16 -31
  140. package/integrations/google-docs/prompt.md +49 -0
  141. package/integrations/google-docs/schemas/{get_document_text.json → read_document.json} +5 -2
  142. package/integrations/google-docs/todo.md +18 -0
  143. package/integrations/google-drive/README.md +26 -0
  144. package/integrations/google-drive/__tests__/handlers.test.ts +43 -0
  145. package/integrations/google-drive/__tests__/usage_parity.test.ts +9 -0
  146. package/integrations/google-drive/handlers/get_file.js +2 -4
  147. package/integrations/google-drive/handlers/get_file_content.js +41 -0
  148. package/integrations/google-drive/handlers/list_files.js +15 -0
  149. package/integrations/google-drive/handlers/search_files.js +20 -0
  150. package/integrations/google-drive/handlers/share_file.js +20 -0
  151. package/integrations/google-drive/manifest.json +37 -10
  152. package/integrations/google-drive/prompt.md +59 -0
  153. package/integrations/google-drive/schemas/get_file.json +2 -2
  154. package/integrations/google-drive/schemas/get_file_content.json +11 -0
  155. package/integrations/google-drive/schemas/list_files.json +12 -0
  156. package/integrations/google-drive/schemas/search_files.json +14 -0
  157. package/integrations/google-drive/schemas/share_file.json +23 -0
  158. package/integrations/google-gmail/.env.test.example +11 -0
  159. package/integrations/google-gmail/README.md +49 -0
  160. package/integrations/google-gmail/__tests__/get_handlers.test.ts +134 -0
  161. package/integrations/google-gmail/__tests__/usage_parity.test.ts +9 -0
  162. package/integrations/google-gmail/__tests__/write_and_admin_handlers.test.ts +211 -0
  163. package/integrations/google-gmail/credentials.json +57 -0
  164. package/integrations/google-gmail/credentials_hint_oauth_token.md +8 -0
  165. package/integrations/google-gmail/credentials_hint_service_account.md +10 -0
  166. package/integrations/google-gmail/handlers/create_draft_email.js +27 -0
  167. package/integrations/google-gmail/handlers/create_label.js +12 -0
  168. package/integrations/google-gmail/handlers/delete_draft.js +13 -0
  169. package/integrations/google-gmail/handlers/delete_label.js +13 -0
  170. package/integrations/google-gmail/handlers/delete_message.js +13 -0
  171. package/integrations/google-gmail/handlers/delete_thread.js +13 -0
  172. package/integrations/google-gmail/handlers/get_draft.js +6 -0
  173. package/integrations/google-gmail/handlers/get_label.js +6 -0
  174. package/integrations/google-gmail/handlers/get_message.js +14 -0
  175. package/integrations/google-gmail/handlers/get_profile.js +5 -0
  176. package/integrations/google-gmail/handlers/get_thread.js +14 -0
  177. package/integrations/google-gmail/handlers/list_drafts.js +15 -0
  178. package/integrations/google-gmail/handlers/list_labels.js +5 -0
  179. package/integrations/google-gmail/handlers/list_messages.js +19 -0
  180. package/integrations/google-gmail/handlers/list_threads.js +19 -0
  181. package/integrations/google-gmail/handlers/modify_message.js +11 -0
  182. package/integrations/google-gmail/handlers/modify_thread.js +11 -0
  183. package/integrations/google-gmail/handlers/read_email.js +56 -0
  184. package/integrations/google-gmail/handlers/send_draft.js +15 -0
  185. package/integrations/google-gmail/handlers/send_email.js +22 -0
  186. package/integrations/google-gmail/handlers/trash_message.js +6 -0
  187. package/integrations/google-gmail/handlers/trash_thread.js +6 -0
  188. package/integrations/google-gmail/handlers/untrash_message.js +6 -0
  189. package/integrations/google-gmail/handlers/untrash_thread.js +6 -0
  190. package/integrations/google-gmail/handlers/update_label.js +15 -0
  191. package/integrations/google-gmail/manifest.json +44 -0
  192. package/integrations/google-gmail/prompt.md +52 -0
  193. package/integrations/google-gmail/schemas/create_draft_email.json +16 -0
  194. package/integrations/google-gmail/schemas/create_label.json +26 -0
  195. package/integrations/google-gmail/schemas/get_message.json +20 -0
  196. package/integrations/{google-docs/schemas/get_document_structured.json → google-gmail/schemas/get_profile.json} +4 -2
  197. package/integrations/google-gmail/schemas/get_thread.json +20 -0
  198. package/integrations/google-gmail/schemas/id_draft.json +16 -0
  199. package/integrations/google-gmail/schemas/id_label.json +16 -0
  200. package/integrations/google-gmail/schemas/id_message.json +16 -0
  201. package/integrations/google-gmail/schemas/id_thread.json +16 -0
  202. package/integrations/google-gmail/schemas/list_drafts.json +30 -0
  203. package/integrations/{google-sheet/schemas/get_developer_metadata.json → google-gmail/schemas/list_labels.json} +4 -3
  204. package/integrations/google-gmail/schemas/list_messages.json +35 -0
  205. package/integrations/google-gmail/schemas/list_threads.json +35 -0
  206. package/integrations/google-gmail/schemas/modify_message.json +24 -0
  207. package/integrations/google-gmail/schemas/modify_thread.json +24 -0
  208. package/integrations/google-gmail/schemas/read_email.json +10 -0
  209. package/integrations/google-gmail/schemas/send_draft.json +29 -0
  210. package/integrations/google-gmail/schemas/send_email.json +17 -0
  211. package/integrations/google-gmail/schemas/update_label.json +33 -0
  212. package/integrations/google-sheet/README.md +27 -0
  213. package/integrations/google-sheet/__tests__/get_handlers.test.ts +6 -52
  214. package/integrations/google-sheet/__tests__/write_handlers.test.ts +0 -20
  215. package/integrations/google-sheet/handlers/get_spreadsheet.js +2 -0
  216. package/integrations/google-sheet/handlers/read_sheet.js +75 -0
  217. package/integrations/google-sheet/manifest.json +13 -62
  218. package/integrations/google-sheet/prompt.md +49 -0
  219. package/integrations/google-sheet/schemas/get_spreadsheet.json +5 -4
  220. package/integrations/google-sheet/schemas/read_sheet.json +21 -0
  221. package/integrations/google-slides/README.md +28 -0
  222. package/integrations/google-slides/__tests__/get_handlers.test.ts +12 -9
  223. package/integrations/google-slides/handlers/read_presentation.js +51 -0
  224. package/integrations/google-slides/manifest.json +13 -13
  225. package/integrations/google-slides/prompt.md +56 -0
  226. package/integrations/hubspot/.env.test.example +20 -0
  227. package/integrations/hubspot/README.md +48 -0
  228. package/integrations/hubspot/__tests__/get_handlers.test.ts +151 -0
  229. package/integrations/hubspot/__tests__/usage_parity.test.ts +10 -0
  230. package/integrations/hubspot/__tests__/write_handlers.test.ts +244 -0
  231. package/integrations/hubspot/credentials.json +48 -0
  232. package/integrations/hubspot/credentials_hint.md +20 -0
  233. package/integrations/hubspot/credentials_hint_oauth_token.md +16 -0
  234. package/integrations/hubspot/handlers/archive_company.js +13 -0
  235. package/integrations/hubspot/handlers/archive_contact.js +13 -0
  236. package/integrations/hubspot/handlers/archive_deal.js +13 -0
  237. package/integrations/hubspot/handlers/archive_ticket.js +13 -0
  238. package/integrations/hubspot/handlers/create_association.js +18 -0
  239. package/integrations/hubspot/handlers/create_company.js +13 -0
  240. package/integrations/hubspot/handlers/create_contact.js +14 -0
  241. package/integrations/hubspot/handlers/create_deal.js +16 -0
  242. package/integrations/hubspot/handlers/create_note.js +44 -0
  243. package/integrations/hubspot/handlers/create_task.js +48 -0
  244. package/integrations/hubspot/handlers/create_ticket.js +15 -0
  245. package/integrations/hubspot/handlers/get_associations.js +14 -0
  246. package/integrations/hubspot/handlers/get_company.js +18 -0
  247. package/integrations/hubspot/handlers/get_contact.js +18 -0
  248. package/integrations/hubspot/handlers/get_deal.js +18 -0
  249. package/integrations/hubspot/handlers/get_ticket.js +20 -0
  250. package/integrations/hubspot/handlers/list_owners.js +12 -0
  251. package/integrations/hubspot/handlers/list_pipelines.js +5 -0
  252. package/integrations/hubspot/handlers/list_properties.js +11 -0
  253. package/integrations/hubspot/handlers/remove_association.js +22 -0
  254. package/integrations/hubspot/handlers/search_companies.js +43 -0
  255. package/integrations/hubspot/handlers/search_contacts.js +43 -0
  256. package/integrations/hubspot/handlers/search_deals.js +43 -0
  257. package/integrations/hubspot/handlers/search_notes.js +43 -0
  258. package/integrations/hubspot/handlers/search_tasks.js +43 -0
  259. package/integrations/hubspot/handlers/search_tickets.js +43 -0
  260. package/integrations/hubspot/handlers/update_company.js +13 -0
  261. package/integrations/hubspot/handlers/update_contact.js +14 -0
  262. package/integrations/hubspot/handlers/update_deal.js +16 -0
  263. package/integrations/hubspot/handlers/update_task.js +17 -0
  264. package/integrations/hubspot/handlers/update_ticket.js +15 -0
  265. package/integrations/hubspot/manifest.json +230 -0
  266. package/integrations/hubspot/prompt.md +69 -0
  267. package/integrations/hubspot/schemas/archive_company.json +13 -0
  268. package/integrations/hubspot/schemas/archive_contact.json +13 -0
  269. package/integrations/hubspot/schemas/archive_deal.json +9 -0
  270. package/integrations/hubspot/schemas/archive_ticket.json +9 -0
  271. package/integrations/hubspot/schemas/create_association.json +24 -0
  272. package/integrations/hubspot/schemas/create_company.json +14 -0
  273. package/integrations/hubspot/schemas/create_contact.json +15 -0
  274. package/integrations/hubspot/schemas/create_deal.json +20 -0
  275. package/integrations/hubspot/schemas/create_note.json +37 -0
  276. package/integrations/hubspot/schemas/create_task.json +51 -0
  277. package/integrations/hubspot/schemas/create_ticket.json +16 -0
  278. package/integrations/hubspot/schemas/empty.json +6 -0
  279. package/integrations/hubspot/schemas/get_associations.json +30 -0
  280. package/integrations/hubspot/schemas/get_company.json +27 -0
  281. package/integrations/hubspot/schemas/get_contact.json +27 -0
  282. package/integrations/hubspot/schemas/get_deal.json +20 -0
  283. package/integrations/hubspot/schemas/get_ticket.json +20 -0
  284. package/integrations/hubspot/schemas/list_owners.json +25 -0
  285. package/integrations/hubspot/schemas/list_pipelines.json +13 -0
  286. package/integrations/hubspot/schemas/list_properties.json +17 -0
  287. package/integrations/hubspot/schemas/remove_association.json +24 -0
  288. package/integrations/hubspot/schemas/search_companies.json +56 -0
  289. package/integrations/hubspot/schemas/search_contacts.json +56 -0
  290. package/integrations/hubspot/schemas/search_deals.json +43 -0
  291. package/integrations/hubspot/schemas/search_notes.json +43 -0
  292. package/integrations/hubspot/schemas/search_tasks.json +43 -0
  293. package/integrations/hubspot/schemas/search_tickets.json +43 -0
  294. package/integrations/hubspot/schemas/update_company.json +20 -0
  295. package/integrations/hubspot/schemas/update_contact.json +21 -0
  296. package/integrations/hubspot/schemas/update_deal.json +19 -0
  297. package/integrations/hubspot/schemas/update_task.json +31 -0
  298. package/integrations/hubspot/schemas/update_ticket.json +18 -0
  299. package/integrations/jira/.env.test +46 -0
  300. package/integrations/jira/.env.test.example +41 -0
  301. package/integrations/jira/README.md +46 -0
  302. package/integrations/jira/__tests__/get_handlers.test.ts +193 -0
  303. package/integrations/jira/__tests__/usage_parity.test.ts +14 -0
  304. package/integrations/jira/__tests__/write_handlers.test.ts +157 -0
  305. package/integrations/jira/credentials.json +39 -0
  306. package/integrations/jira/credentials_hint.md +4 -0
  307. package/integrations/jira/credentials_hint_api_token.md +6 -0
  308. package/integrations/jira/credentials_hint_oauth_token.md +6 -0
  309. package/integrations/jira/handlers/add_comment.js +9 -0
  310. package/integrations/jira/handlers/assign_issue.js +11 -0
  311. package/integrations/jira/handlers/create_issue.js +37 -0
  312. package/integrations/jira/handlers/create_sprint.js +19 -0
  313. package/integrations/jira/handlers/delete_issue.js +10 -0
  314. package/integrations/jira/handlers/get_backlog_issues.js +13 -0
  315. package/integrations/jira/handlers/get_board.js +6 -0
  316. package/integrations/jira/handlers/get_issue.js +63 -0
  317. package/integrations/jira/handlers/get_issue_comments.js +31 -0
  318. package/integrations/jira/handlers/get_myself.js +14 -0
  319. package/integrations/jira/handlers/get_project.js +28 -0
  320. package/integrations/jira/handlers/get_sprint.js +5 -0
  321. package/integrations/jira/handlers/get_sprint_issues.js +13 -0
  322. package/integrations/jira/handlers/get_transitions.js +23 -0
  323. package/integrations/jira/handlers/list_boards.js +34 -0
  324. package/integrations/jira/handlers/list_projects.js +29 -0
  325. package/integrations/jira/handlers/list_sprints.js +29 -0
  326. package/integrations/jira/handlers/move_issues_to_sprint.js +11 -0
  327. package/integrations/jira/handlers/search_issues.js +43 -0
  328. package/integrations/jira/handlers/search_users.js +21 -0
  329. package/integrations/jira/handlers/transition_issue.js +44 -0
  330. package/integrations/jira/handlers/update_issue.js +40 -0
  331. package/integrations/jira/handlers/update_sprint.js +20 -0
  332. package/integrations/jira/manifest.json +204 -0
  333. package/integrations/jira/prompt.md +80 -0
  334. package/integrations/jira/schemas/add_comment.json +16 -0
  335. package/integrations/jira/schemas/assign_issue.json +16 -0
  336. package/integrations/jira/schemas/create_issue.json +49 -0
  337. package/integrations/jira/schemas/create_sprint.json +29 -0
  338. package/integrations/jira/schemas/delete_issue.json +12 -0
  339. package/integrations/jira/schemas/empty.json +6 -0
  340. package/integrations/jira/schemas/get_backlog_issues.json +33 -0
  341. package/integrations/jira/schemas/get_board.json +13 -0
  342. package/integrations/jira/schemas/get_issue.json +23 -0
  343. package/integrations/jira/schemas/get_issue_comments.json +23 -0
  344. package/integrations/jira/schemas/get_project.json +17 -0
  345. package/integrations/jira/schemas/get_sprint.json +13 -0
  346. package/integrations/jira/schemas/get_sprint_issues.json +33 -0
  347. package/integrations/jira/schemas/get_transitions.json +12 -0
  348. package/integrations/jira/schemas/list_boards.json +27 -0
  349. package/integrations/jira/schemas/list_projects.json +22 -0
  350. package/integrations/jira/schemas/list_sprints.json +29 -0
  351. package/integrations/jira/schemas/move_issues_to_sprint.json +19 -0
  352. package/integrations/jira/schemas/search_issues.json +28 -0
  353. package/integrations/jira/schemas/search_users.json +18 -0
  354. package/integrations/jira/schemas/transition_issue.json +38 -0
  355. package/integrations/jira/schemas/update_issue.json +47 -0
  356. package/integrations/jira/schemas/update_sprint.json +33 -0
  357. package/integrations/new_integration_prompt.md +177 -2
  358. package/integrations/notion/.env.test +10 -0
  359. package/integrations/notion/.env.test.example +13 -0
  360. package/integrations/notion/README.md +42 -0
  361. package/integrations/notion/manifest.json +64 -35
  362. package/integrations/trello/.env.test +6 -0
  363. package/integrations/trello/.env.test.example +9 -0
  364. package/integrations/trello/README.md +50 -0
  365. package/package.json +7 -3
  366. package/integrations/google-calendar/handlers/update_event.js +0 -5
  367. package/integrations/google-calendar/schemas/update_event.json +0 -10
  368. package/integrations/google-docs/handlers/get_document.js +0 -12
  369. package/integrations/google-docs/handlers/get_document_structured.js +0 -6
  370. package/integrations/google-docs/handlers/get_document_text.js +0 -17
  371. package/integrations/google-docs/schemas/get_document.json +0 -11
  372. package/integrations/google-sheet/handlers/batch_clear_values_by_data_filter.js +0 -6
  373. package/integrations/google-sheet/handlers/batch_get_values.js +0 -16
  374. package/integrations/google-sheet/handlers/batch_update_values_by_data_filter.js +0 -16
  375. package/integrations/google-sheet/handlers/get_developer_metadata.js +0 -6
  376. package/integrations/google-sheet/handlers/get_spreadsheet_by_data_filter.js +0 -10
  377. package/integrations/google-sheet/handlers/get_values.js +0 -14
  378. package/integrations/google-sheet/handlers/get_values_by_data_filter.js +0 -14
  379. package/integrations/google-sheet/handlers/search_developer_metadata.js +0 -7
  380. package/integrations/google-sheet/schemas/batch_clear_values_by_data_filter.json +0 -10
  381. package/integrations/google-sheet/schemas/batch_get_values.json +0 -13
  382. package/integrations/google-sheet/schemas/batch_update_values_by_data_filter.json +0 -25
  383. package/integrations/google-sheet/schemas/get_spreadsheet_by_data_filter.json +0 -11
  384. package/integrations/google-sheet/schemas/get_values.json +0 -13
  385. package/integrations/google-sheet/schemas/get_values_by_data_filter.json +0 -17
  386. package/integrations/google-sheet/schemas/search_developer_metadata.json +0 -14
  387. package/integrations/google-slides/handlers/get_presentation.js +0 -6
@@ -1,4 +1,4 @@
1
- import { beforeAll, describe, expect, it } from 'vitest'
1
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest'
2
2
  import { IntegrationProxy } from '../../../../server/src/integrations/proxy.js'
3
3
  import { loadIntegrationTools } from '../../../../server/src/integrations/dataLoader.js'
4
4
 
@@ -13,6 +13,7 @@ interface Ctx {
13
13
  baseId?: string
14
14
  tableId?: string
15
15
  recordId?: string
16
+ ownedRecordId?: string
16
17
  }
17
18
 
18
19
  const env = process.env as Record<string, string>
@@ -26,6 +27,7 @@ const suite = hasEnv(
26
27
  suite('airtable read handlers (live)', () => {
27
28
  const ctx: Ctx = {}
28
29
  let buildHandler: (name: string) => ((input: any) => Promise<any>)
30
+ let buildWriteHandler: (name: string) => ((input: any) => Promise<any>)
29
31
 
30
32
  beforeAll(async () => {
31
33
  const credentialStore = {
@@ -56,6 +58,16 @@ suite('airtable read handlers (live)', () => {
56
58
  return build(integration) as (input: any) => Promise<any>
57
59
  }
58
60
 
61
+ buildWriteHandler = (name: string) => {
62
+ const tool = tools!.write.find(t => t.name === name)
63
+ expect(tool, `write tool ${name} exists`).toBeTruthy()
64
+ const integration = {
65
+ fetch: (path: string, init?: RequestInit) => proxy.call(integrationNode, path, init),
66
+ }
67
+ const build = new Function('integration', `return (${tool!.handlerCode});`)
68
+ return build(integration) as (input: any) => Promise<any>
69
+ }
70
+
59
71
  // Use explicit test base/table if provided, otherwise auto-discover from first base
60
72
  if (env.AIRTABLE_TEST_WRITE_BASE_ID && env.AIRTABLE_TEST_WRITE_TABLE_ID) {
61
73
  ctx.baseId = env.AIRTABLE_TEST_WRITE_BASE_ID
@@ -74,14 +86,40 @@ suite('airtable read handlers (live)', () => {
74
86
  }
75
87
  }
76
88
 
89
+ // Create a dedicated record so get_record has a stable ID that the concurrent
90
+ // write suite cannot accidentally delete out from under us.
77
91
  if (ctx.baseId && ctx.tableId) {
78
- const list_records = buildHandler('list_records')
79
- const recs = await list_records({ baseId: ctx.baseId, tableId: ctx.tableId, pageSize: 1 })
80
- const records = recs?.records || recs
81
- ctx.recordId = records?.[0]?.id
92
+ try {
93
+ const create_record = buildWriteHandler('create_record')
94
+ const created = await create_record({
95
+ baseId: ctx.baseId,
96
+ tableId: ctx.tableId,
97
+ fields: { Name: `ReadTest ${Date.now()}` },
98
+ })
99
+ const rec = created?.records?.[0] || created
100
+ ctx.ownedRecordId = rec?.id
101
+ ctx.recordId = rec?.id
102
+ }
103
+ catch {
104
+ // If create fails (e.g. no write permission), fall back to discovering a record
105
+ const list_records = buildHandler('list_records')
106
+ const recs = await list_records({ baseId: ctx.baseId, tableId: ctx.tableId, pageSize: 1 })
107
+ const records = recs?.records || recs
108
+ ctx.recordId = records?.[0]?.id
109
+ }
82
110
  }
83
111
  }, 60000)
84
112
 
113
+ afterAll(async () => {
114
+ if (ctx.ownedRecordId && ctx.baseId && ctx.tableId) {
115
+ try {
116
+ const delete_record = buildWriteHandler('delete_record')
117
+ await delete_record({ baseId: ctx.baseId, tableId: ctx.tableId, recordId: ctx.ownedRecordId })
118
+ }
119
+ catch {}
120
+ }
121
+ })
122
+
85
123
  it('list_bases returns bases', async () => {
86
124
  const handler = buildHandler('list_bases')
87
125
  const result = await handler({})
@@ -0,0 +1,25 @@
1
+ # Confluence (Confluence Cloud) live integration tests
2
+ #
3
+ # Two credential variants are supported — provide one to test that variant:
4
+ #
5
+ # ----------------------
6
+ # Variant: api_token
7
+ # ----------------------
8
+ # CONFLUENCE_DOMAIN:
9
+ # - If your site URL is https://YOUR_DOMAIN.atlassian.net/wiki, then YOUR_DOMAIN is the value.
10
+ CONFLUENCE_DOMAIN=commandable
11
+ # CONFLUENCE_EMAIL:
12
+ # - The email address of the Atlassian account that owns the API token.
13
+ CONFLUENCE_EMAIL=theo@commandable.ai
14
+ # CONFLUENCE_API_TOKEN:
15
+ # - Create an Atlassian API token at: https://id.atlassian.com/manage-profile/security/api-tokens
16
+ CONFLUENCE_API_TOKEN=ATATT3xFfGF0q1hqu1FdEJJHaLHdP6aHe2YwVWg2gu4TEBtP0ZWfFh46z7ZQDg0VHIE2PuVLw2MB7tgR-47cjuyVTXGS_UO1-VoKbODopCGCAR_BOWdcdWc5yN4QnIsU_V7LsWqj8hRNn9wEwkxthy3Um5brD26ehgEUeY9cvpjboiIqLcvEA6k=787A1BCE
17
+
18
+ #
19
+ # ----------------------
20
+ # Write test configuration
21
+ # ----------------------
22
+ # Space key to use for write tests (create/update/delete pages)
23
+ CONFLUENCE_TEST_SPACE_KEY=SD
24
+ # Optional: parent page ID under which test pages will be created
25
+ CONFLUENCE_TEST_PARENT_PAGE_ID=360450
@@ -0,0 +1,36 @@
1
+ # Confluence (Confluence Cloud) live integration tests
2
+ #
3
+ # Two credential variants are supported — provide one to test that variant:
4
+ #
5
+ # ----------------------
6
+ # Variant: api_token
7
+ # ----------------------
8
+ # CONFLUENCE_DOMAIN:
9
+ # - If your site URL is https://YOUR_DOMAIN.atlassian.net/wiki, then YOUR_DOMAIN is the value.
10
+ CONFLUENCE_DOMAIN=
11
+ # CONFLUENCE_EMAIL:
12
+ # - The email address of the Atlassian account that owns the API token.
13
+ CONFLUENCE_EMAIL=
14
+ # CONFLUENCE_API_TOKEN:
15
+ # - Create an Atlassian API token at: https://id.atlassian.com/manage-profile/security/api-tokens
16
+ CONFLUENCE_API_TOKEN=
17
+ #
18
+ # ----------------------
19
+ # Variant: oauth_token
20
+ # ----------------------
21
+ # CONFLUENCE_CLOUD_ID:
22
+ # - Your Atlassian Cloud resource ID. Discover it via:
23
+ # GET https://api.atlassian.com/oauth/token/accessible-resources (using your access token)
24
+ CONFLUENCE_CLOUD_ID=
25
+ # CONFLUENCE_TOKEN:
26
+ # - OAuth 2.0 access token with Confluence scopes
27
+ # (read:page:confluence, write:page:confluence, read:space:confluence, etc.)
28
+ CONFLUENCE_TOKEN=
29
+ #
30
+ # ----------------------
31
+ # Write test configuration
32
+ # ----------------------
33
+ # Space key to use for write tests (create/update/delete pages)
34
+ CONFLUENCE_TEST_SPACE_KEY=
35
+ # Optional: parent page ID under which test pages will be created
36
+ CONFLUENCE_TEST_PARENT_PAGE_ID=
@@ -0,0 +1,28 @@
1
+ # Confluence
2
+
3
+ **11 tools**
4
+
5
+ ![Confluence tests](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/theomccabe/771bd329f303087690c522afa1baa6f3/raw/test-confluence.json)
6
+
7
+ ## Credential variants
8
+
9
+ | Variant | Label |
10
+ |---|---|
11
+ | `api_token` | API Token (Email + Token) _(default)_ |
12
+ | `oauth_token` | OAuth Access Token (3LO) |
13
+
14
+ ## Tools
15
+
16
+ | Tool | Scope | Description |
17
+ |---|---|---|
18
+ | `list_spaces` | read | List Confluence spaces you can access. Use this to discover `spaceId`/`spaceKey` before s… |
19
+ | `get_space` | read | Get a Confluence space by `spaceId`, including its homepage and basic metadata. |
20
+ | `search_pages` | read | Search for pages using CQL (Confluence Query Language). Use this as the primary discovery… |
21
+ | `read_page` | read | Read a page and return agent-friendly Markdown extracted from Confluence storage format (… |
22
+ | `get_page_children` | read | List child content under a page (typically child pages). Use this to navigate page hierar… |
23
+ | `get_comments` | read | List footer comments for a page, optionally including their child replies. Use this to re… |
24
+ | `create_page` | write | Create a new Confluence page. Provide the body as Confluence storage format (XHTML). For … |
25
+ | `update_page` | write | Update an existing Confluence page. This tool auto-fetches the current version number and… |
26
+ | `delete_page` | write | Delete a Confluence page (moves it to trash by default). Use carefully. |
27
+ | `add_comment` | write | Add a footer comment to a Confluence page. Provide the body as Confluence storage format … |
28
+ | `add_label` | write | Add one or more labels to a Confluence page. Labels are useful for discovery via CQL (`la… |
@@ -0,0 +1,121 @@
1
+ import { beforeAll, describe, expect, it } from 'vitest'
2
+ import { createCredentialStore, createIntegrationNode, createProxy, createToolbox, hasEnv } from '../../__tests__/liveHarness.js'
3
+
4
+ // LIVE Confluence read tests using credentials
5
+ //
6
+ // Variant: api_token
7
+ // - CONFLUENCE_DOMAIN
8
+ // - CONFLUENCE_EMAIL
9
+ // - CONFLUENCE_API_TOKEN
10
+
11
+ const env = process.env as Record<string, string | undefined>
12
+
13
+ const suiteOrSkip = hasEnv('CONFLUENCE_DOMAIN', 'CONFLUENCE_EMAIL', 'CONFLUENCE_API_TOKEN') ? describe : describe.skip
14
+
15
+ suiteOrSkip('confluence read handlers (live)', () => {
16
+ describe('variant: api_token', () => {
17
+ const ctx: {
18
+ spaceId?: string
19
+ spaceKey?: string
20
+ homepageId?: string
21
+ pageId?: string
22
+ } = {}
23
+
24
+ let confluence: ReturnType<typeof createToolbox>
25
+
26
+ beforeAll(async () => {
27
+ const credentialStore = createCredentialStore(async () => ({
28
+ domain: env.CONFLUENCE_DOMAIN!,
29
+ email: env.CONFLUENCE_EMAIL!,
30
+ apiToken: env.CONFLUENCE_API_TOKEN!,
31
+ }))
32
+ const proxy = createProxy(credentialStore)
33
+ confluence = createToolbox(
34
+ 'confluence',
35
+ proxy,
36
+ createIntegrationNode('confluence', { label: 'Confluence', credentialId: 'confluence-creds', credentialVariant: 'api_token' }),
37
+ 'api_token',
38
+ )
39
+
40
+ try {
41
+ const list_spaces = confluence.read('list_spaces')
42
+ const spaces = await list_spaces({ limit: 10 })
43
+ const first = spaces?.results?.[0]
44
+ ctx.spaceId = first?.id
45
+ ctx.spaceKey = first?.key
46
+ ctx.homepageId = first?.homepageId
47
+ }
48
+ catch {}
49
+
50
+ try {
51
+ if (ctx.spaceKey) {
52
+ const search_pages = confluence.read('search_pages')
53
+ const found = await search_pages({
54
+ cql: `space = "${ctx.spaceKey}" AND type = page ORDER BY lastmodified DESC`,
55
+ limit: 5,
56
+ })
57
+ const first = found?.results?.[0]
58
+ ctx.pageId = first?.id || ctx.homepageId
59
+ }
60
+ else {
61
+ ctx.pageId = ctx.homepageId
62
+ }
63
+ }
64
+ catch {
65
+ ctx.pageId = ctx.pageId || ctx.homepageId
66
+ }
67
+ }, 60000)
68
+
69
+ it('list_spaces returns spaces', async () => {
70
+ const list_spaces = confluence.read('list_spaces')
71
+ const res = await list_spaces({ limit: 10 })
72
+ expect(Array.isArray(res?.results)).toBe(true)
73
+ }, 30000)
74
+
75
+ it('get_space returns a space when spaceId is available', async () => {
76
+ if (!ctx.spaceId)
77
+ return expect(true).toBe(true)
78
+ const get_space = confluence.read('get_space')
79
+ const res = await get_space({ spaceId: ctx.spaceId })
80
+ expect(res?.id).toBe(ctx.spaceId)
81
+ }, 30000)
82
+
83
+ it('search_pages returns results for a basic CQL query (best effort)', async () => {
84
+ if (!ctx.spaceKey)
85
+ return expect(true).toBe(true)
86
+ const search_pages = confluence.read('search_pages')
87
+ const res = await search_pages({
88
+ cql: `space = "${ctx.spaceKey}" AND type = page ORDER BY lastmodified DESC`,
89
+ limit: 5,
90
+ })
91
+ expect(Array.isArray(res?.results)).toBe(true)
92
+ }, 30000)
93
+
94
+ it('read_page returns page content (storage) when pageId is available', async () => {
95
+ if (!ctx.pageId)
96
+ return expect(true).toBe(true)
97
+ const read_page = confluence.read('read_page')
98
+ const page = await read_page({ pageId: ctx.pageId, outputMarkdown: false })
99
+ expect(page?.id).toBe(ctx.pageId)
100
+ // Can be null for unusual pages; just require a usable response.
101
+ expect(page).toBeTruthy()
102
+ }, 30000)
103
+
104
+ it('get_page_children returns an array when pageId is available (best effort)', async () => {
105
+ if (!ctx.pageId)
106
+ return expect(true).toBe(true)
107
+ const get_page_children = confluence.read('get_page_children')
108
+ const res = await get_page_children({ pageId: ctx.pageId, limit: 10 })
109
+ expect(Array.isArray(res?.results)).toBe(true)
110
+ }, 30000)
111
+
112
+ it('get_comments returns an array when pageId is available (best effort)', async () => {
113
+ if (!ctx.pageId)
114
+ return expect(true).toBe(true)
115
+ const get_comments = confluence.read('get_comments')
116
+ const res = await get_comments({ pageId: ctx.pageId, limit: 10 })
117
+ expect(Array.isArray(res?.results)).toBe(true)
118
+ }, 30000)
119
+ })
120
+ })
121
+
@@ -0,0 +1,14 @@
1
+ import { describe, expect, it } from 'vitest'
2
+ import { getMissingToolUsages } from '../../__tests__/usageParity.js'
3
+
4
+ describe('confluence static usage parity', () => {
5
+ it('every api_token tool is referenced in tests', () => {
6
+ const missing = getMissingToolUsages({
7
+ integrationName: 'confluence',
8
+ importMetaUrl: import.meta.url,
9
+ credentialVariant: 'api_token',
10
+ })
11
+ expect(missing, `Missing handler usages in tests: ${missing.join(', ')}`).toEqual([])
12
+ })
13
+ })
14
+
@@ -0,0 +1,131 @@
1
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest'
2
+ import { createCredentialStore, createIntegrationNode, createProxy, createToolbox, hasEnv, safeCleanup } from '../../__tests__/liveHarness.js'
3
+
4
+ // LIVE Confluence write tests using credentials
5
+ //
6
+ // Required for write tests:
7
+ // - CONFLUENCE_TEST_SPACE_KEY
8
+ // Optional:
9
+ // - CONFLUENCE_TEST_PARENT_PAGE_ID
10
+ //
11
+ // Variant: api_token
12
+ // - CONFLUENCE_DOMAIN
13
+ // - CONFLUENCE_EMAIL
14
+ // - CONFLUENCE_API_TOKEN
15
+
16
+ const env = process.env as Record<string, string | undefined>
17
+
18
+ const suiteOrSkip = (hasEnv('CONFLUENCE_DOMAIN', 'CONFLUENCE_EMAIL', 'CONFLUENCE_API_TOKEN') && hasEnv('CONFLUENCE_TEST_SPACE_KEY'))
19
+ ? describe
20
+ : describe.skip
21
+
22
+ suiteOrSkip('confluence write handlers (live)', () => {
23
+ describe('variant: api_token', () => {
24
+ const ctx: {
25
+ spaceId?: string
26
+ createdPageId?: string
27
+ createdLabel?: string
28
+ createdCommentId?: string
29
+ } = {}
30
+
31
+ let confluence: ReturnType<typeof createToolbox>
32
+
33
+ beforeAll(async () => {
34
+ const credentialStore = createCredentialStore(async () => ({
35
+ domain: env.CONFLUENCE_DOMAIN!,
36
+ email: env.CONFLUENCE_EMAIL!,
37
+ apiToken: env.CONFLUENCE_API_TOKEN!,
38
+ }))
39
+ const proxy = createProxy(credentialStore)
40
+ confluence = createToolbox(
41
+ 'confluence',
42
+ proxy,
43
+ createIntegrationNode('confluence', { label: 'Confluence', credentialId: 'confluence-creds', credentialVariant: 'api_token' }),
44
+ 'api_token',
45
+ )
46
+
47
+ // Resolve spaceId from configured space key.
48
+ try {
49
+ const list_spaces = confluence.read('list_spaces')
50
+ const spaces = await list_spaces({ keys: [env.CONFLUENCE_TEST_SPACE_KEY!], limit: 5 })
51
+ const first = spaces?.results?.[0]
52
+ ctx.spaceId = first?.id
53
+ }
54
+ catch {}
55
+ }, 60000)
56
+
57
+ afterAll(async () => {
58
+ await safeCleanup(async () => {
59
+ if (!ctx.createdPageId)
60
+ return
61
+ const delete_page = confluence.write('delete_page')
62
+ await delete_page({ pageId: ctx.createdPageId })
63
+ })
64
+ }, 60000)
65
+
66
+ it('create_page -> read_page -> update_page -> add_label -> add_comment -> get_comments -> delete_page roundtrip', async () => {
67
+ if (!ctx.spaceId)
68
+ return expect(true).toBe(true)
69
+
70
+ const parentId = env.CONFLUENCE_TEST_PARENT_PAGE_ID || null
71
+ const timestamp = Date.now()
72
+
73
+ const create_page = confluence.write('create_page')
74
+ const created = await create_page({
75
+ spaceId: ctx.spaceId,
76
+ parentId,
77
+ title: `CmdTest Confluence ${timestamp}`,
78
+ bodyStorage: `<p>Created by integration tests at ${timestamp}.</p>`,
79
+ })
80
+ const pageId = created?.id
81
+ expect(pageId).toBeTruthy()
82
+ ctx.createdPageId = pageId
83
+
84
+ const read_page = confluence.read('read_page')
85
+ const got = await read_page({ pageId, includeLabels: true, outputMarkdown: true })
86
+ expect(got?.id).toBe(pageId)
87
+
88
+ const update_page = confluence.write('update_page')
89
+ const updated = await update_page({
90
+ pageId,
91
+ title: `CmdTest Confluence Updated ${timestamp}`,
92
+ bodyStorage: `<p>Updated by integration tests at ${timestamp}.</p>`,
93
+ versionMessage: 'Updated by integration tests',
94
+ })
95
+ expect(updated?.id || updated?.title || updated).toBeTruthy()
96
+
97
+ const add_label = confluence.write('add_label')
98
+ const label = `cmdtest-${timestamp}`
99
+ ctx.createdLabel = label
100
+ const labelRes = await add_label({ pageId, labels: [label] })
101
+ expect(labelRes).toBeTruthy()
102
+
103
+ // Verify label via read_page (labels are included when includeLabels is true)
104
+ const afterLabel = await read_page({ pageId, includeLabels: true, outputMarkdown: false })
105
+ const labelNames = Array.isArray(afterLabel?.labels)
106
+ ? afterLabel.labels.map((l: any) => l?.name).filter(Boolean)
107
+ : []
108
+ expect(labelNames.includes(label)).toBe(true)
109
+
110
+ const add_comment = confluence.write('add_comment')
111
+ const commentText = `Test comment ${timestamp}`
112
+ const comment = await add_comment({ pageId, bodyStorage: `<p>${commentText}</p>` })
113
+ ctx.createdCommentId = comment?.id
114
+ expect(comment?.id || comment).toBeTruthy()
115
+
116
+ const get_comments = confluence.read('get_comments')
117
+ const comments = await get_comments({ pageId, limit: 50 })
118
+ const found = (comments?.results || []).some((c: any) =>
119
+ (c?.id && ctx.createdCommentId && String(c.id) === String(ctx.createdCommentId))
120
+ || (c?.body && JSON.stringify(c.body).includes(commentText)),
121
+ )
122
+ expect(found).toBe(true)
123
+
124
+ const delete_page = confluence.write('delete_page')
125
+ const deleted = await delete_page({ pageId })
126
+ expect(deleted?.ok === true || deleted).toBeTruthy()
127
+ ctx.createdPageId = undefined
128
+ }, 150000)
129
+ })
130
+ })
131
+
@@ -0,0 +1,39 @@
1
+ {
2
+ "variants": {
3
+ "api_token": {
4
+ "label": "API Token (Email + Token)",
5
+ "schema": {
6
+ "type": "object",
7
+ "properties": {
8
+ "domain": {
9
+ "type": "string",
10
+ "title": "Confluence site domain",
11
+ "description": "The subdomain of your Confluence Cloud site. Example: for https://mycompany.atlassian.net/wiki, enter 'mycompany'."
12
+ },
13
+ "email": {
14
+ "type": "string",
15
+ "title": "Atlassian account email",
16
+ "description": "Email address of the Atlassian account that owns the API token."
17
+ },
18
+ "apiToken": {
19
+ "type": "string",
20
+ "title": "Atlassian API token",
21
+ "description": "Atlassian API token for Confluence Cloud. The server will convert this into the required Basic auth header."
22
+ }
23
+ },
24
+ "required": ["domain", "email", "apiToken"],
25
+ "additionalProperties": false
26
+ },
27
+ "baseUrlTemplate": "https://{{domain}}.atlassian.net",
28
+ "injection": {
29
+ "headers": {
30
+ "Authorization": "Basic {{basicAuth}}",
31
+ "Accept": "application/json"
32
+ }
33
+ },
34
+ "preprocess": "confluence_api_token"
35
+ }
36
+ },
37
+ "default": "api_token"
38
+ }
39
+
@@ -0,0 +1,4 @@
1
+ Recommended: use **API Token (Email + Token)** unless you specifically need OAuth.
2
+
3
+ If you have multiple credential variants available, select one and follow its setup instructions.
4
+
@@ -0,0 +1,9 @@
1
+ Set up Confluence Cloud API token auth:
2
+
3
+ 1. Open your Confluence site (it looks like `https://YOUR_DOMAIN.atlassian.net/wiki`)
4
+ 2. Copy `YOUR_DOMAIN` (the subdomain) and use it as `domain`
5
+ 3. Create an Atlassian API token at `https://id.atlassian.com/manage-profile/security/api-tokens`
6
+ 4. Use the Atlassian account email as `email` and paste the token as `apiToken`
7
+
8
+ Note: The server computes the required Basic auth header for you.
9
+
@@ -0,0 +1,8 @@
1
+ Set up Confluence Cloud OAuth (3LO):
2
+
3
+ 1. Create an OAuth 2.0 (3LO) app in the Atlassian developer console
4
+ 2. Add Confluence scopes (typical minimum): read:page:confluence, write:page:confluence, read:space:confluence (plus offline_access if you want refresh tokens)
5
+ 3. Complete the OAuth flow to obtain an access token
6
+ 4. Call `GET https://api.atlassian.com/oauth/token/accessible-resources` with `Authorization: Bearer <access_token>` to get `cloudId`
7
+ 5. Paste `cloudId` and the OAuth access `token` here
8
+
@@ -0,0 +1,19 @@
1
+ async (input) => {
2
+ const body = {
3
+ pageId: String(input.pageId),
4
+ body: {
5
+ representation: 'storage',
6
+ value: String(input.bodyStorage),
7
+ },
8
+ }
9
+
10
+ if (input.parentCommentId)
11
+ body.parentCommentId = String(input.parentCommentId)
12
+
13
+ const res = await integration.fetch('/wiki/api/v2/footer-comments', {
14
+ method: 'POST',
15
+ body,
16
+ })
17
+ return await res.json()
18
+ }
19
+
@@ -0,0 +1,16 @@
1
+ async (input) => {
2
+ const pageId = encodeURIComponent(String(input.pageId))
3
+ const labels = Array.isArray(input.labels) ? input.labels : []
4
+
5
+ const body = labels
6
+ .map((name) => String(name).trim())
7
+ .filter(Boolean)
8
+ .map((name) => ({ prefix: 'global', name }))
9
+
10
+ const res = await integration.fetch(`/wiki/rest/api/content/${pageId}/label`, {
11
+ method: 'POST',
12
+ body,
13
+ })
14
+ return await res.json()
15
+ }
16
+
@@ -0,0 +1,22 @@
1
+ async (input) => {
2
+ const body = {
3
+ spaceId: String(input.spaceId),
4
+ status: input.status || 'current',
5
+ title: String(input.title),
6
+ body: {
7
+ representation: 'storage',
8
+ value: String(input.bodyStorage),
9
+ },
10
+ }
11
+
12
+ if (input.parentId)
13
+ body.parentId = String(input.parentId)
14
+
15
+ const res = await integration.fetch('/wiki/api/v2/pages', {
16
+ method: 'POST',
17
+ body,
18
+ })
19
+
20
+ return await res.json()
21
+ }
22
+
@@ -0,0 +1,17 @@
1
+ async (input) => {
2
+ const pageId = encodeURIComponent(String(input.pageId))
3
+ const params = new URLSearchParams()
4
+ if (input.purge) params.set('purge', 'true')
5
+ if (input.draft) params.set('draft', 'true')
6
+
7
+ const res = await integration.fetch(`/wiki/api/v2/pages/${pageId}${params.toString() ? `?${params}` : ''}`, {
8
+ method: 'DELETE',
9
+ })
10
+
11
+ if (res.status === 204)
12
+ return { ok: true }
13
+
14
+ // Some proxies/APIs may still return JSON; try to parse.
15
+ try { return await res.json() } catch { return { ok: res.ok, status: res.status } }
16
+ }
17
+
@@ -0,0 +1,33 @@
1
+ async (input) => {
2
+ const pageId = encodeURIComponent(String(input.pageId))
3
+ const params = new URLSearchParams()
4
+
5
+ params.set('body-format', 'STORAGE')
6
+
7
+ const limit = typeof input.limit === 'number' ? input.limit : undefined
8
+ if (limit) params.set('limit', String(limit))
9
+ if (input.cursor) params.set('cursor', String(input.cursor))
10
+
11
+ const res = await integration.fetch(`/wiki/api/v2/pages/${pageId}/footer-comments?${params}`)
12
+ const data = await res.json()
13
+
14
+ const results = Array.isArray(data?.results)
15
+ ? data.results.map((c) => ({
16
+ id: c.id,
17
+ status: c.status,
18
+ title: c.title,
19
+ pageId: c.pageId,
20
+ version: c?.version?.number,
21
+ authorId: c?.version?.authorId,
22
+ createdAt: c?.version?.createdAt,
23
+ body: c?.body,
24
+ webui: c?._links?.webui,
25
+ }))
26
+ : []
27
+
28
+ return {
29
+ results,
30
+ links: data?._links || {},
31
+ }
32
+ }
33
+
@@ -0,0 +1,30 @@
1
+ async (input) => {
2
+ const pageId = encodeURIComponent(String(input.pageId))
3
+ const params = new URLSearchParams()
4
+
5
+ const limit = typeof input.limit === 'number' ? input.limit : undefined
6
+ if (limit) params.set('limit', String(limit))
7
+ if (input.cursor) params.set('cursor', String(input.cursor))
8
+ if (typeof input.sort === 'string' && input.sort) params.set('sort', input.sort)
9
+
10
+ const res = await integration.fetch(`/wiki/api/v2/pages/${pageId}/children${params.toString() ? `?${params}` : ''}`)
11
+ const data = await res.json()
12
+
13
+ const results = Array.isArray(data?.results)
14
+ ? data.results.map((c) => ({
15
+ id: c.id,
16
+ type: c.type,
17
+ status: c.status,
18
+ title: c.title,
19
+ parentId: c.parentId,
20
+ spaceId: c.spaceId,
21
+ links: c?._links || {},
22
+ }))
23
+ : []
24
+
25
+ return {
26
+ results,
27
+ links: data?._links || {},
28
+ }
29
+ }
30
+
@@ -0,0 +1,22 @@
1
+ async (input) => {
2
+ const spaceId = encodeURIComponent(String(input.spaceId))
3
+ const params = new URLSearchParams()
4
+ if (input.includePermissions) params.set('include-permissions', 'true')
5
+
6
+ const path = `/wiki/api/v2/spaces/${spaceId}${params.toString() ? `?${params}` : ''}`
7
+ const res = await integration.fetch(path)
8
+ const data = await res.json()
9
+
10
+ return {
11
+ id: data?.id,
12
+ key: data?.key,
13
+ name: data?.name,
14
+ type: data?.type,
15
+ status: data?.status,
16
+ homepageId: data?.homepageId,
17
+ description: data?.description,
18
+ links: data?._links || {},
19
+ raw: data,
20
+ }
21
+ }
22
+