@dxos/plugin-github 0.7.4 → 0.13.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 (628) hide show
  1. package/LICENSE +102 -5
  2. package/PLUGIN.mdl +784 -0
  3. package/dist/lib/GitHubCapabilities.mjs +10 -0
  4. package/dist/lib/GitHubCapabilities.mjs.map +1 -0
  5. package/dist/lib/GitHubEvents.mjs +15 -0
  6. package/dist/lib/GitHubEvents.mjs.map +1 -0
  7. package/dist/lib/GitHubOperation.mjs +358 -0
  8. package/dist/lib/GitHubOperation.mjs.map +1 -0
  9. package/dist/lib/GitHubPlugin.mjs +16 -0
  10. package/dist/lib/GitHubPlugin.mjs.map +1 -0
  11. package/dist/lib/Walkthrough.mjs +59 -0
  12. package/dist/lib/Walkthrough.mjs.map +1 -0
  13. package/dist/lib/capabilities.browser.mjs +54 -0
  14. package/dist/lib/capabilities.browser.mjs.map +1 -0
  15. package/dist/lib/capabilities.mjs +54 -0
  16. package/dist/lib/capabilities.mjs.map +1 -0
  17. package/dist/lib/capabilities.node.mjs +30 -0
  18. package/dist/lib/capabilities.node.mjs.map +1 -0
  19. package/dist/lib/capabilities.tauri.mjs +54 -0
  20. package/dist/lib/capabilities.tauri.mjs.map +1 -0
  21. package/dist/lib/capabilities.workerd.mjs +30 -0
  22. package/dist/lib/capabilities.workerd.mjs.map +1 -0
  23. package/dist/lib/chunk-ImportPullRequestDialog.mjs +116 -0
  24. package/dist/lib/chunk-ImportPullRequestDialog.mjs.map +1 -0
  25. package/dist/lib/chunk-PLUGIN.mjs +6 -0
  26. package/dist/lib/chunk-PLUGIN.mjs.map +1 -0
  27. package/dist/lib/chunk-PullRequestArticle.mjs +1486 -0
  28. package/dist/lib/chunk-PullRequestArticle.mjs.map +1 -0
  29. package/dist/lib/chunk-PullRequestArticle2.mjs +2 -0
  30. package/dist/lib/chunk-PullRequestCardMenu.mjs +123 -0
  31. package/dist/lib/chunk-PullRequestCardMenu.mjs.map +1 -0
  32. package/dist/lib/chunk-PullRequestsArticle.mjs +594 -0
  33. package/dist/lib/chunk-PullRequestsArticle.mjs.map +1 -0
  34. package/dist/lib/chunk-WalkthroughArticle.mjs +26 -0
  35. package/dist/lib/chunk-WalkthroughArticle.mjs.map +1 -0
  36. package/dist/lib/chunk-add-pull-request-comment.mjs +19 -0
  37. package/dist/lib/chunk-add-pull-request-comment.mjs.map +1 -0
  38. package/dist/lib/chunk-add-pull-request-review-comment.mjs +25 -0
  39. package/dist/lib/chunk-add-pull-request-review-comment.mjs.map +1 -0
  40. package/dist/lib/chunk-app-graph-builder.mjs +39 -0
  41. package/dist/lib/chunk-app-graph-builder.mjs.map +1 -0
  42. package/dist/lib/chunk-connector.mjs +70 -0
  43. package/dist/lib/chunk-connector.mjs.map +1 -0
  44. package/dist/lib/chunk-constants.mjs +11 -0
  45. package/dist/lib/chunk-constants.mjs.map +1 -0
  46. package/dist/lib/chunk-errors.mjs +29 -0
  47. package/dist/lib/chunk-errors.mjs.map +1 -0
  48. package/dist/lib/chunk-generate-walkthrough.mjs +86 -0
  49. package/dist/lib/chunk-generate-walkthrough.mjs.map +1 -0
  50. package/dist/lib/chunk-generate.mjs +719 -0
  51. package/dist/lib/chunk-generate.mjs.map +1 -0
  52. package/dist/lib/chunk-get-pull-request-diff.mjs +25 -0
  53. package/dist/lib/chunk-get-pull-request-diff.mjs.map +1 -0
  54. package/dist/lib/chunk-get-pull-request-status.mjs +29 -0
  55. package/dist/lib/chunk-get-pull-request-status.mjs.map +1 -0
  56. package/dist/lib/chunk-get-repositories.mjs +32 -0
  57. package/dist/lib/chunk-get-repositories.mjs.map +1 -0
  58. package/dist/lib/chunk-github-api.mjs +375 -0
  59. package/dist/lib/chunk-github-api.mjs.map +1 -0
  60. package/dist/lib/chunk-github-link.mjs +59 -0
  61. package/dist/lib/chunk-github-link.mjs.map +1 -0
  62. package/dist/lib/chunk-import-pull-request-from-snapshot.mjs +25 -0
  63. package/dist/lib/chunk-import-pull-request-from-snapshot.mjs.map +1 -0
  64. package/dist/lib/chunk-import-pull-request.mjs +96 -0
  65. package/dist/lib/chunk-import-pull-request.mjs.map +1 -0
  66. package/dist/lib/chunk-link-resolver.mjs +109 -0
  67. package/dist/lib/chunk-link-resolver.mjs.map +1 -0
  68. package/dist/lib/chunk-markdown-extension.mjs +92 -0
  69. package/dist/lib/chunk-markdown-extension.mjs.map +1 -0
  70. package/dist/lib/chunk-materialize-target.mjs +36 -0
  71. package/dist/lib/chunk-materialize-target.mjs.map +1 -0
  72. package/dist/lib/chunk-operation-handler.mjs +12 -0
  73. package/dist/lib/chunk-operation-handler.mjs.map +1 -0
  74. package/dist/lib/chunk-page-action.mjs +22 -0
  75. package/dist/lib/chunk-page-action.mjs.map +1 -0
  76. package/dist/lib/chunk-pull-request.mjs +58 -0
  77. package/dist/lib/chunk-pull-request.mjs.map +1 -0
  78. package/dist/lib/chunk-pull-request2.mjs +110 -0
  79. package/dist/lib/chunk-pull-request2.mjs.map +1 -0
  80. package/dist/lib/chunk-react-surface.mjs +233 -0
  81. package/dist/lib/chunk-react-surface.mjs.map +1 -0
  82. package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
  83. package/dist/lib/chunk-schema.mjs +15 -0
  84. package/dist/lib/chunk-schema.mjs.map +1 -0
  85. package/dist/lib/chunk-skill-definition.mjs +10 -0
  86. package/dist/lib/chunk-skill-definition.mjs.map +1 -0
  87. package/dist/lib/chunk-submit-pull-request-approval.mjs +56 -0
  88. package/dist/lib/chunk-submit-pull-request-approval.mjs.map +1 -0
  89. package/dist/lib/chunk-sync-pull-request.mjs +24 -0
  90. package/dist/lib/chunk-sync-pull-request.mjs.map +1 -0
  91. package/dist/lib/chunk-sync.mjs +481 -0
  92. package/dist/lib/chunk-sync.mjs.map +1 -0
  93. package/dist/lib/chunk-useOpenObject.mjs +43 -0
  94. package/dist/lib/chunk-useOpenObject.mjs.map +1 -0
  95. package/dist/lib/extensions.mjs +132 -0
  96. package/dist/lib/extensions.mjs.map +1 -0
  97. package/dist/lib/index.mjs +4 -0
  98. package/dist/lib/meta.mjs +47 -0
  99. package/dist/lib/meta.mjs.map +1 -0
  100. package/dist/lib/ns/Extensions.mjs +18 -0
  101. package/dist/lib/ns/Extensions.mjs.map +1 -0
  102. package/dist/lib/operations.mjs +22 -0
  103. package/dist/lib/operations.mjs.map +1 -0
  104. package/dist/lib/plugin.mjs +9 -0
  105. package/dist/lib/plugin.mjs.map +1 -0
  106. package/dist/lib/skills.mjs +44 -0
  107. package/dist/lib/skills.mjs.map +1 -0
  108. package/dist/lib/testing.mjs +189 -0
  109. package/dist/lib/testing.mjs.map +1 -0
  110. package/dist/lib/translations.mjs +136 -0
  111. package/dist/lib/translations.mjs.map +1 -0
  112. package/dist/lib/types.mjs +5 -0
  113. package/dist/types/dx.config.d.ts +28 -0
  114. package/dist/types/dx.config.d.ts.map +1 -0
  115. package/dist/types/src/Extensions.d.ts +2 -0
  116. package/dist/types/src/Extensions.d.ts.map +1 -0
  117. package/dist/types/src/GitHubPlugin.d.ts +37 -0
  118. package/dist/types/src/GitHubPlugin.d.ts.map +1 -0
  119. package/dist/types/src/GitHubPlugin.workerd.test.d.ts +2 -0
  120. package/dist/types/src/GitHubPlugin.workerd.test.d.ts.map +1 -0
  121. package/dist/types/src/approval.d.ts +21 -0
  122. package/dist/types/src/approval.d.ts.map +1 -0
  123. package/dist/types/src/approval.test.d.ts +2 -0
  124. package/dist/types/src/approval.test.d.ts.map +1 -0
  125. package/dist/types/src/capabilities/app-graph-builder.d.ts +9 -0
  126. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  127. package/dist/types/src/capabilities/connector.d.ts +17 -0
  128. package/dist/types/src/capabilities/connector.d.ts.map +1 -0
  129. package/dist/types/src/capabilities/gen/browser.d.ts +13 -0
  130. package/dist/types/src/capabilities/gen/browser.d.ts.map +1 -0
  131. package/dist/types/src/capabilities/gen/node.d.ts +13 -0
  132. package/dist/types/src/capabilities/gen/node.d.ts.map +1 -0
  133. package/dist/types/src/capabilities/gen/tauri.d.ts +13 -0
  134. package/dist/types/src/capabilities/gen/tauri.d.ts.map +1 -0
  135. package/dist/types/src/capabilities/gen/workerd.d.ts +13 -0
  136. package/dist/types/src/capabilities/gen/workerd.d.ts.map +1 -0
  137. package/dist/types/src/capabilities/index.d.ts +13 -0
  138. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  139. package/dist/types/src/capabilities/link-resolver.d.ts +10 -0
  140. package/dist/types/src/capabilities/link-resolver.d.ts.map +1 -0
  141. package/dist/types/src/capabilities/markdown-extension.d.ts +14 -0
  142. package/dist/types/src/capabilities/markdown-extension.d.ts.map +1 -0
  143. package/dist/types/src/capabilities/operation-handler.d.ts +5 -0
  144. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  145. package/dist/types/src/capabilities/page-action.d.ts +5 -0
  146. package/dist/types/src/capabilities/page-action.d.ts.map +1 -0
  147. package/dist/types/src/capabilities/react-surface.d.ts +5 -0
  148. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  149. package/dist/types/src/capabilities/schema.d.ts +12 -0
  150. package/dist/types/src/capabilities/schema.d.ts.map +1 -0
  151. package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
  152. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
  153. package/dist/types/src/cards/GitHubCard.d.ts +11 -0
  154. package/dist/types/src/cards/GitHubCard.d.ts.map +1 -0
  155. package/dist/types/src/cards/GitHubCard.stories.d.ts +45 -0
  156. package/dist/types/src/cards/GitHubCard.stories.d.ts.map +1 -0
  157. package/dist/types/src/cards/PullRequestCard.d.ts +9 -0
  158. package/dist/types/src/cards/PullRequestCard.d.ts.map +1 -0
  159. package/dist/types/src/cards/index.d.ts +3 -0
  160. package/dist/types/src/cards/index.d.ts.map +1 -0
  161. package/dist/types/src/components/CommentComposer/CommentComposer.d.ts +30 -0
  162. package/dist/types/src/components/CommentComposer/CommentComposer.d.ts.map +1 -0
  163. package/dist/types/src/components/CommentComposer/index.d.ts +2 -0
  164. package/dist/types/src/components/CommentComposer/index.d.ts.map +1 -0
  165. package/dist/types/src/components/PullRequestFiles/DiffStat.d.ts +8 -0
  166. package/dist/types/src/components/PullRequestFiles/DiffStat.d.ts.map +1 -0
  167. package/dist/types/src/components/PullRequestFiles/FileTree.d.ts +17 -0
  168. package/dist/types/src/components/PullRequestFiles/FileTree.d.ts.map +1 -0
  169. package/dist/types/src/components/PullRequestFiles/PullRequestFiles.d.ts +23 -0
  170. package/dist/types/src/components/PullRequestFiles/PullRequestFiles.d.ts.map +1 -0
  171. package/dist/types/src/components/PullRequestFiles/files.d.ts +39 -0
  172. package/dist/types/src/components/PullRequestFiles/files.d.ts.map +1 -0
  173. package/dist/types/src/components/PullRequestFiles/files.test.d.ts +2 -0
  174. package/dist/types/src/components/PullRequestFiles/files.test.d.ts.map +1 -0
  175. package/dist/types/src/components/PullRequestFiles/index.d.ts +5 -0
  176. package/dist/types/src/components/PullRequestFiles/index.d.ts.map +1 -0
  177. package/dist/types/src/components/PullRequestOverview/ArtifactPill.d.ts +21 -0
  178. package/dist/types/src/components/PullRequestOverview/ArtifactPill.d.ts.map +1 -0
  179. package/dist/types/src/components/PullRequestOverview/CheckRunList.d.ts +15 -0
  180. package/dist/types/src/components/PullRequestOverview/CheckRunList.d.ts.map +1 -0
  181. package/dist/types/src/components/PullRequestOverview/PullRequestDetails.d.ts +10 -0
  182. package/dist/types/src/components/PullRequestOverview/PullRequestDetails.d.ts.map +1 -0
  183. package/dist/types/src/components/PullRequestOverview/PullRequestOverview.d.ts +16 -0
  184. package/dist/types/src/components/PullRequestOverview/PullRequestOverview.d.ts.map +1 -0
  185. package/dist/types/src/components/PullRequestOverview/RelatedCards.d.ts +28 -0
  186. package/dist/types/src/components/PullRequestOverview/RelatedCards.d.ts.map +1 -0
  187. package/dist/types/src/components/PullRequestOverview/index.d.ts +6 -0
  188. package/dist/types/src/components/PullRequestOverview/index.d.ts.map +1 -0
  189. package/dist/types/src/components/PullRequestStatus/PullRequestStatus.d.ts +20 -0
  190. package/dist/types/src/components/PullRequestStatus/PullRequestStatus.d.ts.map +1 -0
  191. package/dist/types/src/components/PullRequestStatus/index.d.ts +2 -0
  192. package/dist/types/src/components/PullRequestStatus/index.d.ts.map +1 -0
  193. package/dist/types/src/components/WalkthroughView/WalkthroughView.d.ts +18 -0
  194. package/dist/types/src/components/WalkthroughView/WalkthroughView.d.ts.map +1 -0
  195. package/dist/types/src/components/WalkthroughView/extensions.d.ts +16 -0
  196. package/dist/types/src/components/WalkthroughView/extensions.d.ts.map +1 -0
  197. package/dist/types/src/components/WalkthroughView/index.d.ts +3 -0
  198. package/dist/types/src/components/WalkthroughView/index.d.ts.map +1 -0
  199. package/dist/types/src/components/index.d.ts +5 -8
  200. package/dist/types/src/components/index.d.ts.map +1 -1
  201. package/dist/types/src/constants.d.ts +7 -0
  202. package/dist/types/src/constants.d.ts.map +1 -0
  203. package/dist/types/src/containers/ImportPullRequestDialog/ImportPullRequestDialog.d.ts +6 -0
  204. package/dist/types/src/containers/ImportPullRequestDialog/ImportPullRequestDialog.d.ts.map +1 -0
  205. package/dist/types/src/containers/ImportPullRequestDialog/index.d.ts +3 -0
  206. package/dist/types/src/containers/ImportPullRequestDialog/index.d.ts.map +1 -0
  207. package/dist/types/src/containers/PullRequestArticle/PullRequestArticle.d.ts +15 -0
  208. package/dist/types/src/containers/PullRequestArticle/PullRequestArticle.d.ts.map +1 -0
  209. package/dist/types/src/containers/PullRequestArticle/failure.d.ts +10 -0
  210. package/dist/types/src/containers/PullRequestArticle/failure.d.ts.map +1 -0
  211. package/dist/types/src/containers/PullRequestArticle/failure.test.d.ts +2 -0
  212. package/dist/types/src/containers/PullRequestArticle/failure.test.d.ts.map +1 -0
  213. package/dist/types/src/containers/PullRequestArticle/index.d.ts +2 -0
  214. package/dist/types/src/containers/PullRequestArticle/index.d.ts.map +1 -0
  215. package/dist/types/src/containers/PullRequestCardMenu/PullRequestCardMenu.d.ts +14 -0
  216. package/dist/types/src/containers/PullRequestCardMenu/PullRequestCardMenu.d.ts.map +1 -0
  217. package/dist/types/src/containers/PullRequestCardMenu/index.d.ts +2 -0
  218. package/dist/types/src/containers/PullRequestCardMenu/index.d.ts.map +1 -0
  219. package/dist/types/src/containers/PullRequestsArticle/PullRequestsArticle.d.ts +13 -0
  220. package/dist/types/src/containers/PullRequestsArticle/PullRequestsArticle.d.ts.map +1 -0
  221. package/dist/types/src/containers/PullRequestsArticle/arrange.d.ts +44 -0
  222. package/dist/types/src/containers/PullRequestsArticle/arrange.d.ts.map +1 -0
  223. package/dist/types/src/containers/PullRequestsArticle/arrange.test.d.ts +2 -0
  224. package/dist/types/src/containers/PullRequestsArticle/arrange.test.d.ts.map +1 -0
  225. package/dist/types/src/containers/PullRequestsArticle/format.d.ts +3 -0
  226. package/dist/types/src/containers/PullRequestsArticle/format.d.ts.map +1 -0
  227. package/dist/types/src/containers/PullRequestsArticle/index.d.ts +2 -0
  228. package/dist/types/src/containers/PullRequestsArticle/index.d.ts.map +1 -0
  229. package/dist/types/src/containers/WalkthroughArticle/WalkthroughArticle.d.ts +13 -0
  230. package/dist/types/src/containers/WalkthroughArticle/WalkthroughArticle.d.ts.map +1 -0
  231. package/dist/types/src/containers/WalkthroughArticle/index.d.ts +2 -0
  232. package/dist/types/src/containers/WalkthroughArticle/index.d.ts.map +1 -0
  233. package/dist/types/src/containers/index.d.ts +7 -0
  234. package/dist/types/src/containers/index.d.ts.map +1 -0
  235. package/dist/types/src/errors.d.ts +157 -0
  236. package/dist/types/src/errors.d.ts.map +1 -0
  237. package/dist/types/src/extensions/index.d.ts +3 -0
  238. package/dist/types/src/extensions/index.d.ts.map +1 -0
  239. package/dist/types/src/extensions/links.d.ts +21 -0
  240. package/dist/types/src/extensions/links.d.ts.map +1 -0
  241. package/dist/types/src/extensions/links.test.d.ts +2 -0
  242. package/dist/types/src/extensions/links.test.d.ts.map +1 -0
  243. package/dist/types/src/extensions/references.d.ts +23 -0
  244. package/dist/types/src/extensions/references.d.ts.map +1 -0
  245. package/dist/types/src/extensions/references.test.d.ts +2 -0
  246. package/dist/types/src/extensions/references.test.d.ts.map +1 -0
  247. package/dist/types/src/github-link.d.ts +29 -0
  248. package/dist/types/src/github-link.d.ts.map +1 -0
  249. package/dist/types/src/hooks/index.d.ts +5 -2
  250. package/dist/types/src/hooks/index.d.ts.map +1 -1
  251. package/dist/types/src/hooks/useOpenObject.d.ts +9 -0
  252. package/dist/types/src/hooks/useOpenObject.d.ts.map +1 -0
  253. package/dist/types/src/hooks/usePullRequestChecks.d.ts +10 -0
  254. package/dist/types/src/hooks/usePullRequestChecks.d.ts.map +1 -0
  255. package/dist/types/src/hooks/usePullRequestDiff.d.ts +12 -0
  256. package/dist/types/src/hooks/usePullRequestDiff.d.ts.map +1 -0
  257. package/dist/types/src/hooks/usePullRequestFiles.d.ts +22 -0
  258. package/dist/types/src/hooks/usePullRequestFiles.d.ts.map +1 -0
  259. package/dist/types/src/hooks/useSyncPullRequest.d.ts +10 -0
  260. package/dist/types/src/hooks/useSyncPullRequest.d.ts.map +1 -0
  261. package/dist/types/src/index.d.ts +3 -3
  262. package/dist/types/src/index.d.ts.map +1 -1
  263. package/dist/types/src/meta.d.ts +34 -11
  264. package/dist/types/src/meta.d.ts.map +1 -1
  265. package/dist/types/src/operations/add-pull-request-comment.d.ts +5 -0
  266. package/dist/types/src/operations/add-pull-request-comment.d.ts.map +1 -0
  267. package/dist/types/src/operations/add-pull-request-review-comment.d.ts +5 -0
  268. package/dist/types/src/operations/add-pull-request-review-comment.d.ts.map +1 -0
  269. package/dist/types/src/operations/generate-walkthrough.d.ts +11 -0
  270. package/dist/types/src/operations/generate-walkthrough.d.ts.map +1 -0
  271. package/dist/types/src/operations/get-pull-request-diff.d.ts +5 -0
  272. package/dist/types/src/operations/get-pull-request-diff.d.ts.map +1 -0
  273. package/dist/types/src/operations/get-pull-request-status.d.ts +5 -0
  274. package/dist/types/src/operations/get-pull-request-status.d.ts.map +1 -0
  275. package/dist/types/src/operations/get-repositories.d.ts +13 -0
  276. package/dist/types/src/operations/get-repositories.d.ts.map +1 -0
  277. package/dist/types/src/operations/import-pull-request-from-snapshot.d.ts +12 -0
  278. package/dist/types/src/operations/import-pull-request-from-snapshot.d.ts.map +1 -0
  279. package/dist/types/src/operations/import-pull-request.d.ts +63 -0
  280. package/dist/types/src/operations/import-pull-request.d.ts.map +1 -0
  281. package/dist/types/src/operations/import-pull-request.test.d.ts +2 -0
  282. package/dist/types/src/operations/import-pull-request.test.d.ts.map +1 -0
  283. package/dist/types/src/operations/index.d.ts +3 -0
  284. package/dist/types/src/operations/index.d.ts.map +1 -0
  285. package/dist/types/src/operations/materialize-target.d.ts +12 -0
  286. package/dist/types/src/operations/materialize-target.d.ts.map +1 -0
  287. package/dist/types/src/operations/pull-request.d.ts +48 -0
  288. package/dist/types/src/operations/pull-request.d.ts.map +1 -0
  289. package/dist/types/src/operations/pull-request.test.d.ts +2 -0
  290. package/dist/types/src/operations/pull-request.test.d.ts.map +1 -0
  291. package/dist/types/src/operations/submit-pull-request-approval.d.ts +5 -0
  292. package/dist/types/src/operations/submit-pull-request-approval.d.ts.map +1 -0
  293. package/dist/types/src/operations/sync-pull-request.d.ts +5 -0
  294. package/dist/types/src/operations/sync-pull-request.d.ts.map +1 -0
  295. package/dist/types/src/operations/sync.d.ts +123 -0
  296. package/dist/types/src/operations/sync.d.ts.map +1 -0
  297. package/dist/types/src/operations/sync.test.d.ts +2 -0
  298. package/dist/types/src/operations/sync.test.d.ts.map +1 -0
  299. package/dist/types/src/plugin.d.ts +4 -0
  300. package/dist/types/src/plugin.d.ts.map +1 -0
  301. package/dist/types/src/plugin.test.d.ts +2 -0
  302. package/dist/types/src/plugin.test.d.ts.map +1 -0
  303. package/dist/types/src/pull-request-body.d.ts +37 -0
  304. package/dist/types/src/pull-request-body.d.ts.map +1 -0
  305. package/dist/types/src/pull-request-body.test.d.ts +2 -0
  306. package/dist/types/src/pull-request-body.test.d.ts.map +1 -0
  307. package/dist/types/src/pull-request.d.ts +28 -0
  308. package/dist/types/src/pull-request.d.ts.map +1 -0
  309. package/dist/types/src/pull-request.test.d.ts +2 -0
  310. package/dist/types/src/pull-request.test.d.ts.map +1 -0
  311. package/dist/types/src/services/github-api.d.ts +332 -0
  312. package/dist/types/src/services/github-api.d.ts.map +1 -0
  313. package/dist/types/src/services/index.d.ts +2 -0
  314. package/dist/types/src/services/index.d.ts.map +1 -0
  315. package/dist/types/src/skills/GitHubSkill.d.ts +12 -0
  316. package/dist/types/src/skills/GitHubSkill.d.ts.map +1 -0
  317. package/dist/types/src/skills/index.d.ts +2 -0
  318. package/dist/types/src/skills/index.d.ts.map +1 -0
  319. package/dist/types/src/stories/Generate.stories.d.ts +27 -0
  320. package/dist/types/src/stories/Generate.stories.d.ts.map +1 -0
  321. package/dist/types/src/stories/Links.stories.d.ts +23 -0
  322. package/dist/types/src/stories/Links.stories.d.ts.map +1 -0
  323. package/dist/types/src/stories/PullRequestArticle.stories.d.ts +359 -0
  324. package/dist/types/src/stories/PullRequestArticle.stories.d.ts.map +1 -0
  325. package/dist/types/src/stories/PullRequestFiles.stories.d.ts +365 -0
  326. package/dist/types/src/stories/PullRequestFiles.stories.d.ts.map +1 -0
  327. package/dist/types/src/stories/PullRequestOverview.stories.d.ts +367 -0
  328. package/dist/types/src/stories/PullRequestOverview.stories.d.ts.map +1 -0
  329. package/dist/types/src/stories/PullRequestsArticle.stories.d.ts +357 -0
  330. package/dist/types/src/stories/PullRequestsArticle.stories.d.ts.map +1 -0
  331. package/dist/types/src/stories/Walkthrough.stories.d.ts +380 -0
  332. package/dist/types/src/stories/Walkthrough.stories.d.ts.map +1 -0
  333. package/dist/types/src/stories/github.d.ts +23 -0
  334. package/dist/types/src/stories/github.d.ts.map +1 -0
  335. package/dist/types/src/stories/github.test.d.ts +2 -0
  336. package/dist/types/src/stories/github.test.d.ts.map +1 -0
  337. package/dist/types/src/stories/walkthrough-fixture.d.ts +8 -0
  338. package/dist/types/src/stories/walkthrough-fixture.d.ts.map +1 -0
  339. package/dist/types/src/testing/fixtures.d.ts +14 -0
  340. package/dist/types/src/testing/fixtures.d.ts.map +1 -0
  341. package/dist/types/src/testing/index.d.ts +4 -0
  342. package/dist/types/src/testing/index.d.ts.map +1 -0
  343. package/dist/types/src/testing/plugin.d.ts +4 -0
  344. package/dist/types/src/testing/plugin.d.ts.map +1 -0
  345. package/dist/types/src/testing/pull-request-13348.d.ts +6 -0
  346. package/dist/types/src/testing/pull-request-13348.d.ts.map +1 -0
  347. package/dist/types/src/translations.d.ts +339 -53
  348. package/dist/types/src/translations.d.ts.map +1 -1
  349. package/dist/types/src/types/GitHubCapabilities.d.ts +13 -0
  350. package/dist/types/src/types/GitHubCapabilities.d.ts.map +1 -0
  351. package/dist/types/src/types/GitHubEvents.d.ts +8 -0
  352. package/dist/types/src/types/GitHubEvents.d.ts.map +1 -0
  353. package/dist/types/src/types/GitHubOperation.d.ts +270 -0
  354. package/dist/types/src/types/GitHubOperation.d.ts.map +1 -0
  355. package/dist/types/src/types/PullRequestsView.d.ts +35 -0
  356. package/dist/types/src/types/PullRequestsView.d.ts.map +1 -0
  357. package/dist/types/src/types/Walkthrough.d.ts +31 -0
  358. package/dist/types/src/types/Walkthrough.d.ts.map +1 -0
  359. package/dist/types/src/types/Walkthrough.test.d.ts +2 -0
  360. package/dist/types/src/types/Walkthrough.test.d.ts.map +1 -0
  361. package/dist/types/src/types/index.d.ts +5 -0
  362. package/dist/types/src/types/index.d.ts.map +1 -0
  363. package/dist/types/src/walkthrough/fill.d.ts +28 -0
  364. package/dist/types/src/walkthrough/fill.d.ts.map +1 -0
  365. package/dist/types/src/walkthrough/fill.test.d.ts +2 -0
  366. package/dist/types/src/walkthrough/fill.test.d.ts.map +1 -0
  367. package/dist/types/src/walkthrough/generate.d.ts +67 -0
  368. package/dist/types/src/walkthrough/generate.d.ts.map +1 -0
  369. package/dist/types/src/walkthrough/generate.test.d.ts +2 -0
  370. package/dist/types/src/walkthrough/generate.test.d.ts.map +1 -0
  371. package/dist/types/src/walkthrough/generated.d.ts +20 -0
  372. package/dist/types/src/walkthrough/generated.d.ts.map +1 -0
  373. package/dist/types/src/walkthrough/generated.test.d.ts +2 -0
  374. package/dist/types/src/walkthrough/generated.test.d.ts.map +1 -0
  375. package/dist/types/src/walkthrough/headings.d.ts +8 -0
  376. package/dist/types/src/walkthrough/headings.d.ts.map +1 -0
  377. package/dist/types/src/walkthrough/headings.test.d.ts +2 -0
  378. package/dist/types/src/walkthrough/headings.test.d.ts.map +1 -0
  379. package/dist/types/src/walkthrough/index.d.ts +9 -0
  380. package/dist/types/src/walkthrough/index.d.ts.map +1 -0
  381. package/dist/types/src/walkthrough/patch.d.ts +48 -0
  382. package/dist/types/src/walkthrough/patch.d.ts.map +1 -0
  383. package/dist/types/src/walkthrough/plan.d.ts +55 -0
  384. package/dist/types/src/walkthrough/plan.d.ts.map +1 -0
  385. package/dist/types/src/walkthrough/plan.test.d.ts +2 -0
  386. package/dist/types/src/walkthrough/plan.test.d.ts.map +1 -0
  387. package/dist/types/src/walkthrough/prompt.d.ts +33 -0
  388. package/dist/types/src/walkthrough/prompt.d.ts.map +1 -0
  389. package/dist/types/src/walkthrough/prompt.test.d.ts +2 -0
  390. package/dist/types/src/walkthrough/prompt.test.d.ts.map +1 -0
  391. package/dist/types/src/walkthrough/score.d.ts +43 -0
  392. package/dist/types/src/walkthrough/score.d.ts.map +1 -0
  393. package/dist/types/src/walkthrough/score.test.d.ts +2 -0
  394. package/dist/types/src/walkthrough/score.test.d.ts.map +1 -0
  395. package/dist/types/tsconfig.tsbuildinfo +1 -0
  396. package/dx.config.ts +39 -0
  397. package/package.json +167 -48
  398. package/src/Extensions.ts +7 -0
  399. package/src/GitHubPlugin.ts +15 -0
  400. package/src/GitHubPlugin.workerd.test.ts +23 -0
  401. package/src/approval.test.ts +40 -0
  402. package/src/approval.ts +39 -0
  403. package/src/capabilities/app-graph-builder.ts +47 -0
  404. package/src/capabilities/connector.ts +95 -0
  405. package/src/capabilities/gen/browser.ts +82 -0
  406. package/src/capabilities/gen/node.ts +43 -0
  407. package/src/capabilities/gen/tauri.ts +82 -0
  408. package/src/capabilities/gen/workerd.ts +43 -0
  409. package/src/capabilities/index.ts +71 -0
  410. package/src/capabilities/link-resolver.ts +137 -0
  411. package/src/capabilities/markdown-extension.ts +146 -0
  412. package/src/capabilities/operation-handler.ts +16 -0
  413. package/src/capabilities/page-action.ts +32 -0
  414. package/src/capabilities/react-surface.ts +98 -0
  415. package/src/capabilities/schema.ts +16 -0
  416. package/src/capabilities/skill-definition.ts +14 -0
  417. package/src/cards/GitHubCard.stories.tsx +165 -0
  418. package/src/cards/GitHubCard.tsx +93 -0
  419. package/src/cards/PullRequestCard.tsx +23 -0
  420. package/src/cards/index.ts +6 -0
  421. package/src/components/CommentComposer/CommentComposer.tsx +109 -0
  422. package/src/components/CommentComposer/index.ts +5 -0
  423. package/src/components/PullRequestFiles/DiffStat.tsx +15 -0
  424. package/src/components/PullRequestFiles/FileTree.tsx +102 -0
  425. package/src/components/PullRequestFiles/PullRequestFiles.tsx +87 -0
  426. package/src/components/PullRequestFiles/files.test.ts +59 -0
  427. package/src/components/PullRequestFiles/files.ts +115 -0
  428. package/src/components/PullRequestFiles/index.ts +8 -0
  429. package/src/components/PullRequestOverview/ArtifactPill.tsx +82 -0
  430. package/src/components/PullRequestOverview/CheckRunList.tsx +120 -0
  431. package/src/components/PullRequestOverview/PullRequestDetails.tsx +15 -0
  432. package/src/components/PullRequestOverview/PullRequestOverview.tsx +110 -0
  433. package/src/components/PullRequestOverview/RelatedCards.tsx +147 -0
  434. package/src/components/PullRequestOverview/index.ts +9 -0
  435. package/src/components/PullRequestStatus/PullRequestStatus.tsx +81 -0
  436. package/src/components/PullRequestStatus/index.ts +5 -0
  437. package/src/components/WalkthroughView/WalkthroughView.tsx +62 -0
  438. package/src/components/WalkthroughView/extensions.ts +53 -0
  439. package/src/components/WalkthroughView/index.ts +6 -0
  440. package/src/components/index.ts +6 -9
  441. package/src/constants.ts +12 -0
  442. package/src/containers/ImportPullRequestDialog/ImportPullRequestDialog.tsx +160 -0
  443. package/src/containers/ImportPullRequestDialog/index.ts +7 -0
  444. package/src/containers/PullRequestArticle/PullRequestArticle.tsx +573 -0
  445. package/src/containers/PullRequestArticle/failure.test.ts +42 -0
  446. package/src/containers/PullRequestArticle/failure.ts +16 -0
  447. package/src/containers/PullRequestArticle/index.ts +5 -0
  448. package/src/containers/PullRequestCardMenu/PullRequestCardMenu.tsx +134 -0
  449. package/src/containers/PullRequestCardMenu/index.ts +5 -0
  450. package/src/containers/PullRequestsArticle/PullRequestsArticle.tsx +361 -0
  451. package/src/containers/PullRequestsArticle/arrange.test.ts +122 -0
  452. package/src/containers/PullRequestsArticle/arrange.ts +245 -0
  453. package/src/containers/PullRequestsArticle/format.ts +31 -0
  454. package/src/containers/PullRequestsArticle/index.ts +5 -0
  455. package/src/containers/WalkthroughArticle/WalkthroughArticle.tsx +31 -0
  456. package/src/containers/WalkthroughArticle/index.ts +5 -0
  457. package/src/containers/index.ts +11 -0
  458. package/src/errors.ts +61 -0
  459. package/src/extensions/index.ts +6 -0
  460. package/src/extensions/links.test.ts +133 -0
  461. package/src/extensions/links.ts +91 -0
  462. package/src/extensions/references.test.ts +83 -0
  463. package/src/extensions/references.ts +100 -0
  464. package/src/github-link.ts +70 -0
  465. package/src/hooks/index.ts +6 -3
  466. package/src/hooks/useOpenObject.ts +48 -0
  467. package/src/hooks/usePullRequestChecks.ts +81 -0
  468. package/src/hooks/usePullRequestDiff.ts +57 -0
  469. package/src/hooks/usePullRequestFiles.ts +98 -0
  470. package/src/hooks/useSyncPullRequest.ts +51 -0
  471. package/src/index.ts +4 -6
  472. package/src/meta.ts +8 -13
  473. package/src/operations/add-pull-request-comment.ts +31 -0
  474. package/src/operations/add-pull-request-review-comment.ts +32 -0
  475. package/src/operations/generate-walkthrough.ts +124 -0
  476. package/src/operations/get-pull-request-diff.ts +37 -0
  477. package/src/operations/get-pull-request-status.ts +44 -0
  478. package/src/operations/get-repositories.ts +53 -0
  479. package/src/operations/import-pull-request-from-snapshot.ts +48 -0
  480. package/src/operations/import-pull-request.test.ts +151 -0
  481. package/src/operations/import-pull-request.ts +141 -0
  482. package/src/operations/index.ts +29 -0
  483. package/src/operations/materialize-target.ts +60 -0
  484. package/src/operations/pull-request.test.ts +120 -0
  485. package/src/operations/pull-request.ts +141 -0
  486. package/src/operations/submit-pull-request-approval.ts +41 -0
  487. package/src/operations/sync-pull-request.ts +37 -0
  488. package/src/operations/sync.test.ts +453 -0
  489. package/src/operations/sync.ts +807 -0
  490. package/src/plugin.test.ts +40 -0
  491. package/src/plugin.ts +37 -0
  492. package/src/pull-request-body.test.ts +61 -0
  493. package/src/pull-request-body.ts +144 -0
  494. package/src/pull-request.test.ts +67 -0
  495. package/src/pull-request.ts +80 -0
  496. package/src/services/github-api.ts +735 -0
  497. package/src/services/index.ts +5 -0
  498. package/src/skills/GitHubSkill.ts +46 -0
  499. package/src/skills/index.ts +5 -0
  500. package/src/stories/Generate.stories.tsx +152 -0
  501. package/src/stories/Links.stories.tsx +153 -0
  502. package/src/stories/PullRequestArticle.stories.tsx +107 -0
  503. package/src/stories/PullRequestFiles.stories.tsx +69 -0
  504. package/src/stories/PullRequestOverview.stories.tsx +113 -0
  505. package/src/stories/PullRequestsArticle.stories.tsx +170 -0
  506. package/src/stories/Walkthrough.stories.tsx +110 -0
  507. package/src/stories/github.test.ts +65 -0
  508. package/src/stories/github.ts +70 -0
  509. package/src/stories/walkthrough-fixture.ts +115 -0
  510. package/src/testing/fixtures.ts +99 -0
  511. package/src/testing/index.ts +7 -0
  512. package/src/testing/plugin.ts +25 -0
  513. package/src/testing/pull-request-13348.ts +104 -0
  514. package/src/testing/pull-request-13363.patch +2981 -0
  515. package/src/translations.ts +135 -63
  516. package/src/types/GitHubCapabilities.ts +27 -0
  517. package/src/types/GitHubEvents.ts +16 -0
  518. package/src/types/GitHubOperation.ts +371 -0
  519. package/src/types/PullRequestsView.ts +45 -0
  520. package/src/types/Walkthrough.test.ts +75 -0
  521. package/src/types/Walkthrough.ts +66 -0
  522. package/src/types/index.ts +8 -0
  523. package/src/vite-env.d.ts +15 -0
  524. package/src/walkthrough/fill.test.ts +337 -0
  525. package/src/walkthrough/fill.ts +246 -0
  526. package/src/walkthrough/generate.test.ts +219 -0
  527. package/src/walkthrough/generate.ts +248 -0
  528. package/src/walkthrough/generated.test.ts +70 -0
  529. package/src/walkthrough/generated.ts +70 -0
  530. package/src/walkthrough/headings.test.ts +40 -0
  531. package/src/walkthrough/headings.ts +39 -0
  532. package/src/walkthrough/index.ts +12 -0
  533. package/src/walkthrough/patch.ts +154 -0
  534. package/src/walkthrough/plan.test.ts +178 -0
  535. package/src/walkthrough/plan.ts +251 -0
  536. package/src/walkthrough/prompt.test.ts +100 -0
  537. package/src/walkthrough/prompt.ts +147 -0
  538. package/src/walkthrough/score.test.ts +272 -0
  539. package/src/walkthrough/score.ts +430 -0
  540. package/README.md +0 -15
  541. package/dist/lib/browser/chunk-S4MPSBA5.mjs +0 -21
  542. package/dist/lib/browser/chunk-S4MPSBA5.mjs.map +0 -7
  543. package/dist/lib/browser/index.css +0 -7
  544. package/dist/lib/browser/index.css.map +0 -7
  545. package/dist/lib/browser/index.mjs +0 -1535
  546. package/dist/lib/browser/index.mjs.map +0 -7
  547. package/dist/lib/browser/meta.json +0 -1
  548. package/dist/lib/browser/meta.mjs +0 -11
  549. package/dist/lib/browser/meta.mjs.map +0 -7
  550. package/dist/types/src/GithubPlugin.d.ts +0 -4
  551. package/dist/types/src/GithubPlugin.d.ts.map +0 -1
  552. package/dist/types/src/components/EmbeddedMain/EmbeddedMain.d.ts +0 -4
  553. package/dist/types/src/components/EmbeddedMain/EmbeddedMain.d.ts.map +0 -1
  554. package/dist/types/src/components/EmbeddedMain/GfmPreview.d.ts +0 -9
  555. package/dist/types/src/components/EmbeddedMain/GfmPreview.d.ts.map +0 -1
  556. package/dist/types/src/components/EmbeddedMain/index.d.ts +0 -2
  557. package/dist/types/src/components/EmbeddedMain/index.d.ts.map +0 -1
  558. package/dist/types/src/components/ExportDialog.d.ts +0 -8
  559. package/dist/types/src/components/ExportDialog.d.ts.map +0 -1
  560. package/dist/types/src/components/GithubApiProviders/GitHubSettings.d.ts +0 -3
  561. package/dist/types/src/components/GithubApiProviders/GitHubSettings.d.ts.map +0 -1
  562. package/dist/types/src/components/GithubApiProviders/OctokitProvider.d.ts +0 -15
  563. package/dist/types/src/components/GithubApiProviders/OctokitProvider.d.ts.map +0 -1
  564. package/dist/types/src/components/GithubApiProviders/index.d.ts +0 -3
  565. package/dist/types/src/components/GithubApiProviders/index.d.ts.map +0 -1
  566. package/dist/types/src/components/GithubEchoResolverProviders/DocumentTreeItem.d.ts +0 -6
  567. package/dist/types/src/components/GithubEchoResolverProviders/DocumentTreeItem.d.ts.map +0 -1
  568. package/dist/types/src/components/GithubEchoResolverProviders/ResolverContext.d.ts +0 -7
  569. package/dist/types/src/components/GithubEchoResolverProviders/ResolverContext.d.ts.map +0 -1
  570. package/dist/types/src/components/GithubEchoResolverProviders/ResolverDialog.d.ts +0 -6
  571. package/dist/types/src/components/GithubEchoResolverProviders/ResolverDialog.d.ts.map +0 -1
  572. package/dist/types/src/components/GithubEchoResolverProviders/ResolverProps.d.ts +0 -16
  573. package/dist/types/src/components/GithubEchoResolverProviders/ResolverProps.d.ts.map +0 -1
  574. package/dist/types/src/components/GithubEchoResolverProviders/ResolverTree.d.ts +0 -3
  575. package/dist/types/src/components/GithubEchoResolverProviders/ResolverTree.d.ts.map +0 -1
  576. package/dist/types/src/components/GithubEchoResolverProviders/SpacePickerTreeItem.d.ts +0 -11
  577. package/dist/types/src/components/GithubEchoResolverProviders/SpacePickerTreeItem.d.ts.map +0 -1
  578. package/dist/types/src/components/GithubEchoResolverProviders/index.d.ts +0 -3
  579. package/dist/types/src/components/GithubEchoResolverProviders/index.d.ts.map +0 -1
  580. package/dist/types/src/components/GithubEchoResolverProviders/spaceResolvers.d.ts +0 -6
  581. package/dist/types/src/components/GithubEchoResolverProviders/spaceResolvers.d.ts.map +0 -1
  582. package/dist/types/src/components/ImportDialog.d.ts +0 -7
  583. package/dist/types/src/components/ImportDialog.d.ts.map +0 -1
  584. package/dist/types/src/components/Issue.d.ts +0 -5
  585. package/dist/types/src/components/Issue.d.ts.map +0 -1
  586. package/dist/types/src/components/Loading/Loading.d.ts +0 -15
  587. package/dist/types/src/components/Loading/Loading.d.ts.map +0 -1
  588. package/dist/types/src/components/Loading/Loading.stories.d.ts +0 -40
  589. package/dist/types/src/components/Loading/Loading.stories.d.ts.map +0 -1
  590. package/dist/types/src/components/Loading/index.d.ts +0 -2
  591. package/dist/types/src/components/Loading/index.d.ts.map +0 -1
  592. package/dist/types/src/components/MarkdownActions.d.ts +0 -7
  593. package/dist/types/src/components/MarkdownActions.d.ts.map +0 -1
  594. package/dist/types/src/components/UrlDialog.d.ts +0 -6
  595. package/dist/types/src/components/UrlDialog.d.ts.map +0 -1
  596. package/dist/types/src/hooks/useDocGhId.d.ts +0 -6
  597. package/dist/types/src/hooks/useDocGhId.d.ts.map +0 -1
  598. package/dist/types/src/hooks/useGhIdFromUrl.d.ts +0 -2
  599. package/dist/types/src/hooks/useGhIdFromUrl.d.ts.map +0 -1
  600. package/dist/types/src/types.d.ts +0 -30
  601. package/dist/types/src/types.d.ts.map +0 -1
  602. package/src/GithubPlugin.tsx +0 -127
  603. package/src/components/EmbeddedMain/EmbeddedMain.tsx +0 -294
  604. package/src/components/EmbeddedMain/GfmPreview.tsx +0 -110
  605. package/src/components/EmbeddedMain/embedded.css +0 -3
  606. package/src/components/EmbeddedMain/index.ts +0 -5
  607. package/src/components/ExportDialog.tsx +0 -157
  608. package/src/components/GithubApiProviders/GitHubSettings.tsx +0 -72
  609. package/src/components/GithubApiProviders/OctokitProvider.tsx +0 -60
  610. package/src/components/GithubApiProviders/index.ts +0 -6
  611. package/src/components/GithubEchoResolverProviders/DocumentTreeItem.tsx +0 -26
  612. package/src/components/GithubEchoResolverProviders/ResolverContext.tsx +0 -137
  613. package/src/components/GithubEchoResolverProviders/ResolverDialog.tsx +0 -34
  614. package/src/components/GithubEchoResolverProviders/ResolverProps.ts +0 -23
  615. package/src/components/GithubEchoResolverProviders/ResolverTree.tsx +0 -86
  616. package/src/components/GithubEchoResolverProviders/SpacePickerTreeItem.tsx +0 -105
  617. package/src/components/GithubEchoResolverProviders/index.ts +0 -6
  618. package/src/components/GithubEchoResolverProviders/spaceResolvers.ts +0 -86
  619. package/src/components/ImportDialog.tsx +0 -72
  620. package/src/components/Issue.tsx +0 -62
  621. package/src/components/Loading/Loading.stories.tsx +0 -32
  622. package/src/components/Loading/Loading.tsx +0 -70
  623. package/src/components/Loading/index.ts +0 -5
  624. package/src/components/MarkdownActions.tsx +0 -136
  625. package/src/components/UrlDialog.tsx +0 -52
  626. package/src/hooks/useDocGhId.ts +0 -38
  627. package/src/hooks/useGhIdFromUrl.ts +0 -26
  628. package/src/types.ts +0 -51
@@ -0,0 +1,83 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+ // @vitest-environment happy-dom
5
+
6
+ import { EditorState } from '@codemirror/state';
7
+ import { EditorView } from '@codemirror/view';
8
+ import { describe, test } from 'vitest';
9
+
10
+ import { Repo } from '@dxos/types';
11
+ import { createMarkdownExtensions } from '@dxos/ui-editor';
12
+
13
+ import { type GitHubReferenceResolver, githubReferences, referenceUrl } from './references.ts';
14
+
15
+ const REPO = 'dxos/dxos';
16
+
17
+ const createView = (doc: string, resolve: GitHubReferenceResolver = (number) => referenceUrl(REPO, number)) => {
18
+ const parent = document.createElement('div');
19
+ return new EditorView({
20
+ state: EditorState.create({
21
+ doc,
22
+ extensions: [createMarkdownExtensions(), githubReferences({ resolve }), EditorView.editable.of(false)],
23
+ }),
24
+ parent,
25
+ });
26
+ };
27
+
28
+ const links = (view: EditorView): { text: string; href: string }[] =>
29
+ Array.from(view.dom.querySelectorAll('a.cm-link')).map((anchor) => ({
30
+ text: anchor.textContent ?? '',
31
+ href: anchor.getAttribute('href') ?? '',
32
+ }));
33
+
34
+ describe('github references', () => {
35
+ test('decorates a reference as a link to the repository', ({ expect }) => {
36
+ const view = createView('Blocked on #12752 until Friday.');
37
+ expect(links(view)).toEqual([{ text: '#12752', href: 'https://github.com/dxos/dxos/issues/12752' }]);
38
+ view.destroy();
39
+ });
40
+
41
+ test('decorates every reference in the document', ({ expect }) => {
42
+ const view = createView('Supersedes #1 and #22; see #333.');
43
+ expect(links(view).map(({ text }) => text)).toEqual(['#1', '#22', '#333']);
44
+ view.destroy();
45
+ });
46
+
47
+ test('leaves a reference alone when the repository is unknown', ({ expect }) => {
48
+ const view = createView('Blocked on #12752.', () => undefined);
49
+ expect(links(view)).toEqual([]);
50
+ view.destroy();
51
+ });
52
+
53
+ test('ignores a `#` that is not a reference', ({ expect }) => {
54
+ const view = createView('# Heading\n\nColour #ff0000, anchor page#42, and a hash#tag.');
55
+ expect(links(view)).toEqual([]);
56
+ view.destroy();
57
+ });
58
+
59
+ test('ignores references inside code', ({ expect }) => {
60
+ const view = createView('Inline `#12752` and\n\n```\nconst id = #99;\n```\n');
61
+ expect(links(view)).toEqual([]);
62
+ view.destroy();
63
+ });
64
+
65
+ test('ignores a reference inside a link target', ({ expect }) => {
66
+ const view = createView('[the PR](https://github.com/dxos/dxos/pull/12752#issuecomment-1)');
67
+ expect(links(view).map(({ href }) => href)).not.toContain('https://github.com/dxos/dxos/issues/1');
68
+ view.destroy();
69
+ });
70
+
71
+ test('a repo object supplies the target', ({ expect }) => {
72
+ const repo = Repo.make({ name: 'dxos', owner: 'dxos', url: 'https://github.com/dxos/dxos' });
73
+ const view = createView('Blocked on #12752.', (number) => referenceUrl(Repo.fullName(repo), number));
74
+ expect(links(view)).toEqual([{ text: '#12752', href: 'https://github.com/dxos/dxos/issues/12752' }]);
75
+ view.destroy();
76
+ });
77
+
78
+ test('a heading still carries references in its prose', ({ expect }) => {
79
+ const view = createView('## Notes on #7');
80
+ expect(links(view)).toEqual([{ text: '#7', href: 'https://github.com/dxos/dxos/issues/7' }]);
81
+ view.destroy();
82
+ });
83
+ });
@@ -0,0 +1,100 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { syntaxTree } from '@codemirror/language';
6
+ import { type Extension, type Range } from '@codemirror/state';
7
+ import { Decoration, type DecorationSet, type EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';
8
+
9
+ /** `#123` — a GitHub issue or pull-request reference. GitHub itself caps numbers well below this. */
10
+ const REFERENCE = /(^|[^\w#/])#(\d{1,9})\b/g;
11
+
12
+ /**
13
+ * Nodes whose text is not prose: a `#` inside them is a fragment, a colour, or code — never a
14
+ * reference. A heading is deliberately absent: `## Notes on #123` is prose after the marker.
15
+ */
16
+ const OPAQUE_NODES = new Set(['InlineCode', 'CodeText', 'FencedCode', 'CodeBlock', 'URL', 'Link', 'Autolink']);
17
+
18
+ export type GitHubReferenceResolver = (number: number) => string | undefined;
19
+
20
+ export type GitHubReferencesOptions = {
21
+ /**
22
+ * Target for a reference, or `undefined` to leave it undecorated — which is the answer whenever
23
+ * the repository is unknown, since `#123` means nothing without one.
24
+ */
25
+ resolve: GitHubReferenceResolver;
26
+ };
27
+
28
+ /**
29
+ * Decorates `#123` as a link to the issue or pull request.
30
+ *
31
+ * Contributed by this plugin rather than built into the editor: the number resolves against the
32
+ * repository the space is bound to, which is GitHub-specific knowledge, and a document with no
33
+ * GitHub binding must render the text unchanged.
34
+ */
35
+ export const githubReferences = ({ resolve }: GitHubReferencesOptions): Extension =>
36
+ ViewPlugin.fromClass(
37
+ class {
38
+ decorations: DecorationSet;
39
+
40
+ constructor(view: EditorView) {
41
+ this.decorations = build(view, resolve);
42
+ }
43
+
44
+ update(update: ViewUpdate) {
45
+ if (update.docChanged || update.viewportChanged) {
46
+ this.decorations = build(update.view, resolve);
47
+ }
48
+ }
49
+ },
50
+ {
51
+ decorations: (instance) => instance.decorations,
52
+ },
53
+ );
54
+
55
+ /** Only the visible ranges: a long document would otherwise re-scan in full on every keystroke. */
56
+ const build = (view: EditorView, resolve: GitHubReferenceResolver): DecorationSet => {
57
+ const ranges: Range<Decoration>[] = [];
58
+ const tree = syntaxTree(view.state);
59
+ for (const { from, to } of view.visibleRanges) {
60
+ const text = view.state.sliceDoc(from, to);
61
+ REFERENCE.lastIndex = 0;
62
+ let match: RegExpExecArray | null;
63
+ while ((match = REFERENCE.exec(text))) {
64
+ const start = from + match.index + match[1].length;
65
+ const end = start + match[2].length + 1;
66
+ if (isOpaque(tree, start)) {
67
+ continue;
68
+ }
69
+ const url = resolve(Number(match[2]));
70
+ if (!url) {
71
+ continue;
72
+ }
73
+ ranges.push(
74
+ Decoration.mark({
75
+ tagName: 'a',
76
+ attributes: { class: 'cm-link', href: url, rel: 'noreferrer', target: '_blank' },
77
+ }).range(start, end),
78
+ );
79
+ }
80
+ }
81
+
82
+ return Decoration.set(ranges, true);
83
+ };
84
+
85
+ const isOpaque = (tree: ReturnType<typeof syntaxTree>, position: number): boolean => {
86
+ let node = tree.resolveInner(position, 1);
87
+ while (node.parent) {
88
+ if (OPAQUE_NODES.has(node.name)) {
89
+ return true;
90
+ }
91
+ node = node.parent;
92
+ }
93
+ return OPAQUE_NODES.has(node.name);
94
+ };
95
+
96
+ /**
97
+ * The canonical target for a reference. `issues/<n>` is deliberate: GitHub redirects it to the pull
98
+ * request when the number is one, so a single URL serves both without asking which it is.
99
+ */
100
+ export const referenceUrl = (repo: string, number: number): string => `https://github.com/${repo}/issues/${number}`;
@@ -0,0 +1,70 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ // The shapes a GitHub reference takes, and nothing else: the operations that read one run in node
6
+ // and workerd, where importing the editor's link widget would drag React into the plugin's entry
7
+ // (`plugin-github:check-module-structure` fails on exactly that).
8
+
9
+ /**
10
+ * `https://github.com/owner/repo`, `/pull/123` or `/issues/123`, with an optional trailing slash,
11
+ * fragment or query. A path below the repository (`/blob/…`, `/actions`) is a page, not an object.
12
+ */
13
+ export const GITHUB_LINK =
14
+ /^https:\/\/github\.com\/([^/\s?#]+)\/([^/\s?#]+)(?:\/(pull|issues)\/(\d+)(?:[/?#]\S*)?|\/?(?:[?#]\S*)?)$/;
15
+
16
+ export type GitHubLink = {
17
+ owner: string;
18
+ repo: string;
19
+ kind: 'repo' | 'pull' | 'issue';
20
+ /** Absent for a repository. */
21
+ number?: number;
22
+ url: string;
23
+ };
24
+
25
+ /** The parts of a pull request or issue URL, or undefined for any other URL. */
26
+ export const parseGitHubLink = (url: string): GitHubLink | undefined => {
27
+ const match = GITHUB_LINK.exec(url);
28
+ if (!match) {
29
+ return undefined;
30
+ }
31
+ const [, owner, repo, kind, number] = match;
32
+ if (!kind) {
33
+ return { owner, repo, kind: 'repo', url };
34
+ }
35
+ return { owner, repo, kind: kind === 'pull' ? 'pull' : 'issue', number: Number(number), url };
36
+ };
37
+
38
+ /**
39
+ * `owner/repo#123` — how a pull request is written where a URL would be noise, and the one form a
40
+ * reviewer can type from memory.
41
+ */
42
+ const PULL_REQUEST_SHORTHAND = /^([\w.-]+)\/([\w.-]+)#(\d+)$/;
43
+
44
+ /** A pull request named by its coordinates, however the user wrote it. */
45
+ export type PullRequestReference = {
46
+ owner: string;
47
+ repo: string;
48
+ number: number;
49
+ };
50
+
51
+ /**
52
+ * The pull request a user's text names: a github.com URL or `owner/repo#123`.
53
+ *
54
+ * An `/issues/123` URL is accepted alongside `/pull/123` because GitHub itself serves a pull
55
+ * request under both, and a reader who copied the wrong one still means the same change.
56
+ */
57
+ export const parsePullRequestReference = (value: string): PullRequestReference | undefined => {
58
+ const text = value.trim();
59
+ const shorthand = PULL_REQUEST_SHORTHAND.exec(text);
60
+ if (shorthand) {
61
+ const [, owner, repo, number] = shorthand;
62
+ return { owner, repo, number: Number(number) };
63
+ }
64
+
65
+ const link = parseGitHubLink(text);
66
+ if (!link || link.number === undefined) {
67
+ return undefined;
68
+ }
69
+ return { owner: link.owner, repo: link.repo, number: link.number };
70
+ };
@@ -1,6 +1,9 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- export * from './useDocGhId';
6
- export * from './useGhIdFromUrl';
5
+ export * from './useOpenObject.ts';
6
+ export * from './usePullRequestFiles.ts';
7
+ export * from './usePullRequestDiff.ts';
8
+ export * from './useSyncPullRequest.ts';
9
+ export * from './usePullRequestChecks.ts';
@@ -0,0 +1,48 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import { useCallback } from 'react';
7
+
8
+ import * as Hooks from '@dxos/app-framework/Hooks';
9
+ import * as AppGraph from '@dxos/app-graph/AppGraph';
10
+ import * as GraphPath from '@dxos/app-toolkit/GraphPath';
11
+ import * as ToolkitHooks from '@dxos/app-toolkit/Hooks';
12
+ import * as LayoutOperation from '@dxos/app-toolkit/LayoutOperation';
13
+ import * as NavigationOperation from '@dxos/app-toolkit/NavigationOperation';
14
+ import { Obj } from '@dxos/echo';
15
+ import * as EffectEx from '@dxos/effect/EffectEx';
16
+ import { EID } from '@dxos/keys';
17
+
18
+ /** How long to wait for a just-stored object to appear in the app graph before opening anyway. */
19
+ const GRAPH_NODE_TIMEOUT = '10 seconds';
20
+
21
+ /**
22
+ * Opens a stored object as a plank.
23
+ *
24
+ * An object stored moments ago has no graph node yet, and the deck cannot open a node it cannot
25
+ * find; expanding only asks the connectors, so wait for the node to land.
26
+ */
27
+ export const useOpenObject = (): ((object: Obj.Any) => Promise<void>) => {
28
+ const { invokePromise } = Hooks.useOperationInvoker();
29
+ const { graph } = ToolkitHooks.useAppGraph();
30
+
31
+ return useCallback(
32
+ async (object: Obj.Any) => {
33
+ const db = Obj.getDatabase(object);
34
+ if (!db) {
35
+ return;
36
+ }
37
+
38
+ const { data } = await invokePromise(NavigationOperation.ResolveNavigationTargets, {
39
+ query: { uri: EID.make({ spaceId: db.spaceId, entityId: object.id }) },
40
+ });
41
+ const path = data?.targets[0]?.path ?? GraphPath.getObjectPathFromObject(object);
42
+ AppGraph.expandPath(graph, path);
43
+ await EffectEx.runPromise(AppGraph.waitFor(graph, path).pipe(Effect.timeout(GRAPH_NODE_TIMEOUT), Effect.ignore));
44
+ await invokePromise(LayoutOperation.Open, { subject: [path], disposition: 'add' });
45
+ },
46
+ [invokePromise, graph],
47
+ );
48
+ };
@@ -0,0 +1,81 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { useEffect, useState } from 'react';
6
+
7
+ import * as Hooks from '@dxos/app-framework/Hooks';
8
+ import { Ref } from '@dxos/echo';
9
+ import { type SpaceId } from '@dxos/keys';
10
+ import { log } from '@dxos/log';
11
+ import { type PullRequest } from '@dxos/types';
12
+
13
+ import { GitHubOperation } from '#types';
14
+
15
+ import { type PullRequestChecks } from '../containers/PullRequestsArticle/arrange.ts';
16
+
17
+ /** How long a pull request's checks stand before they are read from GitHub again. */
18
+ const CHECKS_INTERVAL = 5 * 60_000;
19
+
20
+ /** Status reads in flight at once: each costs three GitHub requests, and a list can hold hundreds. */
21
+ const CONCURRENCY = 4;
22
+
23
+ // Keyed by object id and shared across mounts, so reopening the list within the interval costs nothing.
24
+ const cache = new Map<string, { at: number; checks: PullRequestChecks }>();
25
+
26
+ /** Whether a pull request's checks still change; a merged or closed one's head is settled. */
27
+ const isLive = (pullRequest: PullRequest.PullRequest) => pullRequest.state === 'open' || pullRequest.state === 'draft';
28
+
29
+ /**
30
+ * The CI and review standing of every live pull request in `pullRequests`, keyed by object id and
31
+ * filled in as each read lands. Finished pull requests are not read: their checks no longer ask
32
+ * anything of the reader.
33
+ */
34
+ export const usePullRequestChecks = (
35
+ pullRequests: readonly PullRequest.PullRequest[],
36
+ spaceId: SpaceId | undefined,
37
+ ): ReadonlyMap<string, PullRequestChecks> => {
38
+ const { invokePromise } = Hooks.useOperationInvoker();
39
+ const [checks, setChecks] = useState<ReadonlyMap<string, PullRequestChecks>>(
40
+ () => new Map([...cache].map(([id, { checks }]) => [id, checks])),
41
+ );
42
+
43
+ useEffect(() => {
44
+ if (!spaceId) {
45
+ return;
46
+ }
47
+
48
+ let cancelled = false;
49
+ const now = Date.now();
50
+ const queue = pullRequests.filter(
51
+ (pullRequest) => isLive(pullRequest) && now - (cache.get(pullRequest.id)?.at ?? 0) >= CHECKS_INTERVAL,
52
+ );
53
+
54
+ const worker = async () => {
55
+ for (let pullRequest = queue.shift(); pullRequest && !cancelled; pullRequest = queue.shift()) {
56
+ const { data, error } = await invokePromise(
57
+ GitHubOperation.GetPullRequestStatus,
58
+ { pullRequest: Ref.make(pullRequest) },
59
+ { spaceId },
60
+ );
61
+ if (error || !data) {
62
+ log.warn('pull request checks failed', { pullRequest: pullRequest.id, error });
63
+ continue;
64
+ }
65
+ const next = { ci: data.ci, checks: data.checks, review: data.review, approvals: data.approvals };
66
+ cache.set(pullRequest.id, { at: Date.now(), checks: next });
67
+ // Set even once cancelled: the next run skips this pull request as freshly cached, so a read
68
+ // that lands across a re-run would otherwise never reach the list.
69
+ const id = pullRequest.id;
70
+ setChecks((previous) => new Map(previous).set(id, next));
71
+ }
72
+ };
73
+
74
+ void Promise.all(Array.from({ length: Math.min(CONCURRENCY, queue.length) }, worker));
75
+ return () => {
76
+ cancelled = true;
77
+ };
78
+ }, [invokePromise, pullRequests, spaceId]);
79
+
80
+ return checks;
81
+ };
@@ -0,0 +1,57 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { useEffect, useState } from 'react';
6
+
7
+ import * as Hooks from '@dxos/app-framework/Hooks';
8
+ import { type Ref } from '@dxos/echo';
9
+ import { type SpaceId } from '@dxos/keys';
10
+ import { log } from '@dxos/log';
11
+ import { type PullRequest } from '@dxos/types';
12
+
13
+ import { GitHubOperation } from '#types';
14
+
15
+ export type PullRequestDiff = {
16
+ diff?: string;
17
+ /** Head commit the diff was read at, which a line comment on it must name. */
18
+ commit?: string;
19
+ error?: Error;
20
+ };
21
+
22
+ /** Reads a pull request's diff through the space's GitHub connection, once `enabled` first turns true. */
23
+ export const usePullRequestDiff = (
24
+ pullRequest: Ref.Ref<PullRequest.PullRequest>,
25
+ spaceId: SpaceId | undefined,
26
+ enabled: boolean,
27
+ ): PullRequestDiff => {
28
+ const { invokePromise } = Hooks.useOperationInvoker();
29
+ const [result, setResult] = useState<PullRequestDiff>({});
30
+ const [requested, setRequested] = useState(false);
31
+ useEffect(() => {
32
+ if (enabled) {
33
+ setRequested(true);
34
+ }
35
+ }, [enabled]);
36
+
37
+ useEffect(() => {
38
+ if (!requested) {
39
+ return;
40
+ }
41
+ let cancelled = false;
42
+ void invokePromise(GitHubOperation.GetPullRequestDiff, { pullRequest }, { spaceId }).then(({ data, error }) => {
43
+ if (cancelled) {
44
+ return;
45
+ }
46
+ if (error) {
47
+ log.warn('pull request diff failed', { error });
48
+ }
49
+ setResult({ diff: data?.diff, commit: data?.commit, error });
50
+ });
51
+ return () => {
52
+ cancelled = true;
53
+ };
54
+ }, [requested, invokePromise, pullRequest, spaceId]);
55
+
56
+ return result;
57
+ };
@@ -0,0 +1,98 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { useCallback, useEffect, useMemo, useState } from 'react';
6
+
7
+ import { log } from '@dxos/log';
8
+
9
+ import { type FileNode, buildFileTree, fileSignature, flattenFiles } from '../components/PullRequestFiles/files.ts';
10
+ import { type PatchFile, parsePatch } from '../walkthrough/patch.ts';
11
+
12
+ export type PullRequestFiles = {
13
+ tree?: FileNode;
14
+ files: PatchFile[];
15
+ /** The file on screen. */
16
+ file?: PatchFile;
17
+ reviewed: ReadonlySet<string>;
18
+ select: (path: string) => void;
19
+ /** Moves to the file `delta` places away in tree order; a no-op past either end. */
20
+ step: (delta: number) => void;
21
+ setReviewed: (path: string, reviewed: boolean) => void;
22
+ };
23
+
24
+ /** Paths the reader checked off, each at the signature of the change they reviewed. */
25
+ type ReviewedRecord = Record<string, string>;
26
+
27
+ const readRecord = (key: string): ReviewedRecord => {
28
+ try {
29
+ const value = localStorage.getItem(key);
30
+ return value ? JSON.parse(value) : {};
31
+ } catch (error) {
32
+ // Blocked or cleared storage leaves the reader with nothing checked, which is recoverable.
33
+ log.warn('reviewed files unreadable', { error });
34
+ return {};
35
+ }
36
+ };
37
+
38
+ const writeRecord = (key: string, record: ReviewedRecord): void => {
39
+ try {
40
+ localStorage.setItem(key, JSON.stringify(record));
41
+ } catch (error) {
42
+ log.warn('reviewed files not saved', { error });
43
+ }
44
+ };
45
+
46
+ /**
47
+ * A pull request's changed files, the one on screen, and which the reader has reviewed.
48
+ *
49
+ * Reviewed state is the reader's own, so it lives in their browser under `storageKey` rather than in
50
+ * the space. A file is reviewed at the change it had when checked: a push that changes it unchecks
51
+ * it, as GitHub's "Viewed" does.
52
+ */
53
+ export const usePullRequestFiles = (diff: string | undefined, storageKey: string): PullRequestFiles => {
54
+ const files = useMemo(() => (diff === undefined ? [] : parsePatch(diff)), [diff]);
55
+ const tree = useMemo(() => (diff === undefined ? undefined : buildFileTree(files)), [diff, files]);
56
+ const order = useMemo(() => (tree ? flattenFiles(tree) : []), [tree]);
57
+ const signatures = useMemo(() => new Map(files.map((file) => [file.path, fileSignature(file)])), [files]);
58
+
59
+ const [record, setRecord] = useState<ReviewedRecord>(() => readRecord(storageKey));
60
+ useEffect(() => setRecord(readRecord(storageKey)), [storageKey]);
61
+
62
+ const reviewed = useMemo(
63
+ () => new Set(Object.keys(record).filter((path) => signatures.get(path) === record[path])),
64
+ [record, signatures],
65
+ );
66
+
67
+ const setReviewed = useCallback(
68
+ (path: string, value: boolean) => {
69
+ setRecord((previous) => {
70
+ const next = { ...previous };
71
+ const signature = signatures.get(path);
72
+ if (value && signature) {
73
+ next[path] = signature;
74
+ } else {
75
+ delete next[path];
76
+ }
77
+ writeRecord(storageKey, next);
78
+ return next;
79
+ });
80
+ },
81
+ [signatures, storageKey],
82
+ );
83
+
84
+ const [selected, setSelected] = useState<string>();
85
+ const file = order.find((candidate) => candidate.path === selected) ?? order[0];
86
+ const step = useCallback(
87
+ (delta: number) => {
88
+ const index = order.findIndex((candidate) => candidate.path === file?.path);
89
+ const next = order[index + delta];
90
+ if (next) {
91
+ setSelected(next.path);
92
+ }
93
+ },
94
+ [order, file],
95
+ );
96
+
97
+ return { tree, files, file, reviewed, select: setSelected, step, setReviewed };
98
+ };
@@ -0,0 +1,51 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { useEffect } from 'react';
6
+
7
+ import * as Hooks from '@dxos/app-framework/Hooks';
8
+ import { Obj, Ref } from '@dxos/echo';
9
+ import { log } from '@dxos/log';
10
+ import { type PullRequest } from '@dxos/types';
11
+
12
+ import { GitHubOperation } from '#types';
13
+
14
+ /** How long a re-sync stands before the pull request is read from GitHub again. */
15
+ const SYNC_INTERVAL = 5 * 60_000;
16
+
17
+ // Keyed by object id: a board of pull request cards would otherwise spend one GitHub request per
18
+ // card each time it mounts, and an anonymous caller has only 60 an hour. Entries past the interval
19
+ // are pruned on every write, so the map holds only pull requests synced within it.
20
+ const lastSynced = new Map<string, number>();
21
+
22
+ const markSynced = (id: string, now: number) => {
23
+ for (const [key, syncedAt] of lastSynced) {
24
+ if (now - syncedAt >= SYNC_INTERVAL) {
25
+ lastSynced.delete(key);
26
+ }
27
+ }
28
+ lastSynced.set(id, now);
29
+ };
30
+
31
+ /**
32
+ * Refreshes a stored pull request from GitHub when it is shown, since whatever shows it is the moment
33
+ * its fields are worth trusting: a repository sync may be days old, and an import is never re-synced.
34
+ *
35
+ * A pull request held by no database (a link preview) is skipped, as there is nothing to write back to,
36
+ * and one synced within {@link SYNC_INTERVAL} is skipped too.
37
+ */
38
+ export const useSyncPullRequest = (pullRequest: PullRequest.PullRequest): void => {
39
+ const { invokePromise } = Hooks.useOperationInvoker();
40
+ const spaceId = Obj.getDatabase(pullRequest)?.spaceId;
41
+ useEffect(() => {
42
+ const now = Date.now();
43
+ if (!spaceId || now - (lastSynced.get(pullRequest.id) ?? 0) < SYNC_INTERVAL) {
44
+ return;
45
+ }
46
+ markSynced(pullRequest.id, now);
47
+ void invokePromise(GitHubOperation.SyncPullRequest, { pullRequest: Ref.make(pullRequest) }, { spaceId }).then(
48
+ ({ error }) => error && log.warn('pull request sync failed', { error }),
49
+ );
50
+ }, [invokePromise, pullRequest, spaceId]);
51
+ };
package/src/index.ts CHANGED
@@ -1,9 +1,7 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- import { GithubPlugin } from './GithubPlugin';
6
-
7
- export default GithubPlugin;
8
-
9
- export * from './GithubPlugin';
5
+ export * as GitHubPlugin from './GitHubPlugin.ts';
6
+ export * from '#types';
7
+ export * as Extensions from './Extensions.ts';
package/src/meta.ts CHANGED
@@ -1,18 +1,13 @@
1
1
  //
2
- // Copyright 2023 DXOS.org
2
+ // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- import { type PluginMeta } from '@dxos/app-framework';
5
+ import * as Plugin from '@dxos/app-framework/Plugin';
6
+ import { DXN } from '@dxos/keys';
6
7
 
7
- export const GITHUB_PLUGIN = 'dxos.org/plugin/github';
8
- export const GITHUB_PLUGIN_SHORT_ID = 'github';
8
+ import config from '../dx.config.ts';
9
9
 
10
- export default {
11
- id: GITHUB_PLUGIN,
12
- shortId: GITHUB_PLUGIN_SHORT_ID,
13
- name: 'GitHub',
14
- description: 'GitHub integration.',
15
- icon: 'ph--github-logo--regular',
16
- source: 'https://github.com/dxos/dxos/tree/main/packages/plugins/experimental/plugin-github',
17
- tags: ['experimental'],
18
- } satisfies PluginMeta;
10
+ export const meta = Plugin.getMetaFromConfig(config);
11
+
12
+ /** The dialog behind the "Import pull request" command. */
13
+ export const IMPORT_PULL_REQUEST_DIALOG = DXN.make(`${meta.profile.key}.importPullRequestDialog`);
@@ -0,0 +1,31 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import * as Effect from 'effect/Effect';
6
+ import * as FetchHttpClient from 'effect/http/FetchHttpClient';
7
+
8
+ import * as Operation from '@dxos/compute/Operation';
9
+
10
+ import { GitHubOperation } from '#types';
11
+
12
+ import { GitHubApi } from '../services/index.ts';
13
+ import { resolvePullRequest } from './pull-request.ts';
14
+
15
+ const handler: Operation.WithHandler<typeof GitHubOperation.AddPullRequestComment> =
16
+ GitHubOperation.AddPullRequestComment.pipe(
17
+ Operation.withHandler(
18
+ Effect.fn(function* ({ pullRequest: ref, body }) {
19
+ const { pullRequest, credentials } = yield* resolvePullRequest(ref);
20
+ const comment = yield* GitHubApi.createIssueComment(
21
+ pullRequest.owner,
22
+ pullRequest.repo,
23
+ pullRequest.number,
24
+ body,
25
+ ).pipe(Effect.provide(credentials));
26
+ return { commentId: comment.id, url: comment.html_url ?? undefined };
27
+ }, Effect.provide(FetchHttpClient.layer)),
28
+ ),
29
+ );
30
+
31
+ export default handler;