@dxos/plugin-github 0.7.4 → 0.14.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 (642) 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 +384 -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 +1506 -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 +171 -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-refresh-pull-requests.mjs +49 -0
  83. package/dist/lib/chunk-refresh-pull-requests.mjs.map +1 -0
  84. package/dist/lib/chunk-rolldown-runtime.mjs +13 -0
  85. package/dist/lib/chunk-schema.mjs +15 -0
  86. package/dist/lib/chunk-schema.mjs.map +1 -0
  87. package/dist/lib/chunk-skill-definition.mjs +10 -0
  88. package/dist/lib/chunk-skill-definition.mjs.map +1 -0
  89. package/dist/lib/chunk-submit-pull-request-approval.mjs +56 -0
  90. package/dist/lib/chunk-submit-pull-request-approval.mjs.map +1 -0
  91. package/dist/lib/chunk-sync-pull-request.mjs +26 -0
  92. package/dist/lib/chunk-sync-pull-request.mjs.map +1 -0
  93. package/dist/lib/chunk-sync.mjs +481 -0
  94. package/dist/lib/chunk-sync.mjs.map +1 -0
  95. package/dist/lib/chunk-useOpenObject.mjs +43 -0
  96. package/dist/lib/chunk-useOpenObject.mjs.map +1 -0
  97. package/dist/lib/extensions.mjs +132 -0
  98. package/dist/lib/extensions.mjs.map +1 -0
  99. package/dist/lib/index.mjs +4 -0
  100. package/dist/lib/meta.mjs +47 -0
  101. package/dist/lib/meta.mjs.map +1 -0
  102. package/dist/lib/ns/Extensions.mjs +18 -0
  103. package/dist/lib/ns/Extensions.mjs.map +1 -0
  104. package/dist/lib/operations.mjs +23 -0
  105. package/dist/lib/operations.mjs.map +1 -0
  106. package/dist/lib/plugin.mjs +9 -0
  107. package/dist/lib/plugin.mjs.map +1 -0
  108. package/dist/lib/skills.mjs +44 -0
  109. package/dist/lib/skills.mjs.map +1 -0
  110. package/dist/lib/testing.mjs +189 -0
  111. package/dist/lib/testing.mjs.map +1 -0
  112. package/dist/lib/translations.mjs +136 -0
  113. package/dist/lib/translations.mjs.map +1 -0
  114. package/dist/lib/types.mjs +5 -0
  115. package/dist/types/dx.config.d.ts +28 -0
  116. package/dist/types/dx.config.d.ts.map +1 -0
  117. package/dist/types/src/Extensions.d.ts +2 -0
  118. package/dist/types/src/Extensions.d.ts.map +1 -0
  119. package/dist/types/src/GitHubPlugin.d.ts +37 -0
  120. package/dist/types/src/GitHubPlugin.d.ts.map +1 -0
  121. package/dist/types/src/GitHubPlugin.workerd.test.d.ts +2 -0
  122. package/dist/types/src/GitHubPlugin.workerd.test.d.ts.map +1 -0
  123. package/dist/types/src/approval.d.ts +21 -0
  124. package/dist/types/src/approval.d.ts.map +1 -0
  125. package/dist/types/src/approval.test.d.ts +2 -0
  126. package/dist/types/src/approval.test.d.ts.map +1 -0
  127. package/dist/types/src/capabilities/app-graph-builder.d.ts +9 -0
  128. package/dist/types/src/capabilities/app-graph-builder.d.ts.map +1 -0
  129. package/dist/types/src/capabilities/connector.d.ts +17 -0
  130. package/dist/types/src/capabilities/connector.d.ts.map +1 -0
  131. package/dist/types/src/capabilities/gen/browser.d.ts +13 -0
  132. package/dist/types/src/capabilities/gen/browser.d.ts.map +1 -0
  133. package/dist/types/src/capabilities/gen/node.d.ts +13 -0
  134. package/dist/types/src/capabilities/gen/node.d.ts.map +1 -0
  135. package/dist/types/src/capabilities/gen/tauri.d.ts +13 -0
  136. package/dist/types/src/capabilities/gen/tauri.d.ts.map +1 -0
  137. package/dist/types/src/capabilities/gen/workerd.d.ts +13 -0
  138. package/dist/types/src/capabilities/gen/workerd.d.ts.map +1 -0
  139. package/dist/types/src/capabilities/index.d.ts +13 -0
  140. package/dist/types/src/capabilities/index.d.ts.map +1 -0
  141. package/dist/types/src/capabilities/link-resolver.d.ts +10 -0
  142. package/dist/types/src/capabilities/link-resolver.d.ts.map +1 -0
  143. package/dist/types/src/capabilities/markdown-extension.d.ts +14 -0
  144. package/dist/types/src/capabilities/markdown-extension.d.ts.map +1 -0
  145. package/dist/types/src/capabilities/operation-handler.d.ts +5 -0
  146. package/dist/types/src/capabilities/operation-handler.d.ts.map +1 -0
  147. package/dist/types/src/capabilities/page-action.d.ts +5 -0
  148. package/dist/types/src/capabilities/page-action.d.ts.map +1 -0
  149. package/dist/types/src/capabilities/react-surface.d.ts +5 -0
  150. package/dist/types/src/capabilities/react-surface.d.ts.map +1 -0
  151. package/dist/types/src/capabilities/schema.d.ts +12 -0
  152. package/dist/types/src/capabilities/schema.d.ts.map +1 -0
  153. package/dist/types/src/capabilities/skill-definition.d.ts +5 -0
  154. package/dist/types/src/capabilities/skill-definition.d.ts.map +1 -0
  155. package/dist/types/src/cards/GitHubCard.d.ts +11 -0
  156. package/dist/types/src/cards/GitHubCard.d.ts.map +1 -0
  157. package/dist/types/src/cards/GitHubCard.stories.d.ts +45 -0
  158. package/dist/types/src/cards/GitHubCard.stories.d.ts.map +1 -0
  159. package/dist/types/src/cards/PullRequestCard.d.ts +9 -0
  160. package/dist/types/src/cards/PullRequestCard.d.ts.map +1 -0
  161. package/dist/types/src/cards/index.d.ts +3 -0
  162. package/dist/types/src/cards/index.d.ts.map +1 -0
  163. package/dist/types/src/components/CommentComposer/CommentComposer.d.ts +30 -0
  164. package/dist/types/src/components/CommentComposer/CommentComposer.d.ts.map +1 -0
  165. package/dist/types/src/components/CommentComposer/index.d.ts +2 -0
  166. package/dist/types/src/components/CommentComposer/index.d.ts.map +1 -0
  167. package/dist/types/src/components/PullRequestFiles/DiffStat.d.ts +8 -0
  168. package/dist/types/src/components/PullRequestFiles/DiffStat.d.ts.map +1 -0
  169. package/dist/types/src/components/PullRequestFiles/FileTree.d.ts +17 -0
  170. package/dist/types/src/components/PullRequestFiles/FileTree.d.ts.map +1 -0
  171. package/dist/types/src/components/PullRequestFiles/PullRequestFiles.d.ts +23 -0
  172. package/dist/types/src/components/PullRequestFiles/PullRequestFiles.d.ts.map +1 -0
  173. package/dist/types/src/components/PullRequestFiles/files.d.ts +39 -0
  174. package/dist/types/src/components/PullRequestFiles/files.d.ts.map +1 -0
  175. package/dist/types/src/components/PullRequestFiles/files.test.d.ts +2 -0
  176. package/dist/types/src/components/PullRequestFiles/files.test.d.ts.map +1 -0
  177. package/dist/types/src/components/PullRequestFiles/index.d.ts +5 -0
  178. package/dist/types/src/components/PullRequestFiles/index.d.ts.map +1 -0
  179. package/dist/types/src/components/PullRequestOverview/ArtifactPill.d.ts +21 -0
  180. package/dist/types/src/components/PullRequestOverview/ArtifactPill.d.ts.map +1 -0
  181. package/dist/types/src/components/PullRequestOverview/CheckRunList.d.ts +18 -0
  182. package/dist/types/src/components/PullRequestOverview/CheckRunList.d.ts.map +1 -0
  183. package/dist/types/src/components/PullRequestOverview/CheckRunList.test.d.ts +2 -0
  184. package/dist/types/src/components/PullRequestOverview/CheckRunList.test.d.ts.map +1 -0
  185. package/dist/types/src/components/PullRequestOverview/PullRequestDetails.d.ts +10 -0
  186. package/dist/types/src/components/PullRequestOverview/PullRequestDetails.d.ts.map +1 -0
  187. package/dist/types/src/components/PullRequestOverview/PullRequestOverview.d.ts +16 -0
  188. package/dist/types/src/components/PullRequestOverview/PullRequestOverview.d.ts.map +1 -0
  189. package/dist/types/src/components/PullRequestOverview/RelatedCards.d.ts +28 -0
  190. package/dist/types/src/components/PullRequestOverview/RelatedCards.d.ts.map +1 -0
  191. package/dist/types/src/components/PullRequestOverview/index.d.ts +6 -0
  192. package/dist/types/src/components/PullRequestOverview/index.d.ts.map +1 -0
  193. package/dist/types/src/components/PullRequestStatus/PullRequestStatus.d.ts +20 -0
  194. package/dist/types/src/components/PullRequestStatus/PullRequestStatus.d.ts.map +1 -0
  195. package/dist/types/src/components/PullRequestStatus/index.d.ts +2 -0
  196. package/dist/types/src/components/PullRequestStatus/index.d.ts.map +1 -0
  197. package/dist/types/src/components/WalkthroughView/WalkthroughView.d.ts +18 -0
  198. package/dist/types/src/components/WalkthroughView/WalkthroughView.d.ts.map +1 -0
  199. package/dist/types/src/components/WalkthroughView/extensions.d.ts +16 -0
  200. package/dist/types/src/components/WalkthroughView/extensions.d.ts.map +1 -0
  201. package/dist/types/src/components/WalkthroughView/index.d.ts +3 -0
  202. package/dist/types/src/components/WalkthroughView/index.d.ts.map +1 -0
  203. package/dist/types/src/components/index.d.ts +5 -8
  204. package/dist/types/src/components/index.d.ts.map +1 -1
  205. package/dist/types/src/constants.d.ts +7 -0
  206. package/dist/types/src/constants.d.ts.map +1 -0
  207. package/dist/types/src/containers/ImportPullRequestDialog/ImportPullRequestDialog.d.ts +6 -0
  208. package/dist/types/src/containers/ImportPullRequestDialog/ImportPullRequestDialog.d.ts.map +1 -0
  209. package/dist/types/src/containers/ImportPullRequestDialog/index.d.ts +3 -0
  210. package/dist/types/src/containers/ImportPullRequestDialog/index.d.ts.map +1 -0
  211. package/dist/types/src/containers/PullRequestArticle/PullRequestArticle.d.ts +15 -0
  212. package/dist/types/src/containers/PullRequestArticle/PullRequestArticle.d.ts.map +1 -0
  213. package/dist/types/src/containers/PullRequestArticle/failure.d.ts +10 -0
  214. package/dist/types/src/containers/PullRequestArticle/failure.d.ts.map +1 -0
  215. package/dist/types/src/containers/PullRequestArticle/failure.test.d.ts +2 -0
  216. package/dist/types/src/containers/PullRequestArticle/failure.test.d.ts.map +1 -0
  217. package/dist/types/src/containers/PullRequestArticle/index.d.ts +2 -0
  218. package/dist/types/src/containers/PullRequestArticle/index.d.ts.map +1 -0
  219. package/dist/types/src/containers/PullRequestCardMenu/PullRequestCardMenu.d.ts +14 -0
  220. package/dist/types/src/containers/PullRequestCardMenu/PullRequestCardMenu.d.ts.map +1 -0
  221. package/dist/types/src/containers/PullRequestCardMenu/index.d.ts +2 -0
  222. package/dist/types/src/containers/PullRequestCardMenu/index.d.ts.map +1 -0
  223. package/dist/types/src/containers/PullRequestsArticle/PullRequestsArticle.d.ts +13 -0
  224. package/dist/types/src/containers/PullRequestsArticle/PullRequestsArticle.d.ts.map +1 -0
  225. package/dist/types/src/containers/PullRequestsArticle/arrange.d.ts +44 -0
  226. package/dist/types/src/containers/PullRequestsArticle/arrange.d.ts.map +1 -0
  227. package/dist/types/src/containers/PullRequestsArticle/arrange.test.d.ts +2 -0
  228. package/dist/types/src/containers/PullRequestsArticle/arrange.test.d.ts.map +1 -0
  229. package/dist/types/src/containers/PullRequestsArticle/format.d.ts +3 -0
  230. package/dist/types/src/containers/PullRequestsArticle/format.d.ts.map +1 -0
  231. package/dist/types/src/containers/PullRequestsArticle/index.d.ts +2 -0
  232. package/dist/types/src/containers/PullRequestsArticle/index.d.ts.map +1 -0
  233. package/dist/types/src/containers/WalkthroughArticle/WalkthroughArticle.d.ts +13 -0
  234. package/dist/types/src/containers/WalkthroughArticle/WalkthroughArticle.d.ts.map +1 -0
  235. package/dist/types/src/containers/WalkthroughArticle/index.d.ts +2 -0
  236. package/dist/types/src/containers/WalkthroughArticle/index.d.ts.map +1 -0
  237. package/dist/types/src/containers/index.d.ts +7 -0
  238. package/dist/types/src/containers/index.d.ts.map +1 -0
  239. package/dist/types/src/errors.d.ts +157 -0
  240. package/dist/types/src/errors.d.ts.map +1 -0
  241. package/dist/types/src/extensions/index.d.ts +3 -0
  242. package/dist/types/src/extensions/index.d.ts.map +1 -0
  243. package/dist/types/src/extensions/links.d.ts +21 -0
  244. package/dist/types/src/extensions/links.d.ts.map +1 -0
  245. package/dist/types/src/extensions/links.test.d.ts +2 -0
  246. package/dist/types/src/extensions/links.test.d.ts.map +1 -0
  247. package/dist/types/src/extensions/references.d.ts +23 -0
  248. package/dist/types/src/extensions/references.d.ts.map +1 -0
  249. package/dist/types/src/extensions/references.test.d.ts +2 -0
  250. package/dist/types/src/extensions/references.test.d.ts.map +1 -0
  251. package/dist/types/src/github-link.d.ts +29 -0
  252. package/dist/types/src/github-link.d.ts.map +1 -0
  253. package/dist/types/src/hooks/index.d.ts +5 -2
  254. package/dist/types/src/hooks/index.d.ts.map +1 -1
  255. package/dist/types/src/hooks/useOpenObject.d.ts +9 -0
  256. package/dist/types/src/hooks/useOpenObject.d.ts.map +1 -0
  257. package/dist/types/src/hooks/usePullRequestChecks.d.ts +10 -0
  258. package/dist/types/src/hooks/usePullRequestChecks.d.ts.map +1 -0
  259. package/dist/types/src/hooks/usePullRequestDiff.d.ts +12 -0
  260. package/dist/types/src/hooks/usePullRequestDiff.d.ts.map +1 -0
  261. package/dist/types/src/hooks/usePullRequestFiles.d.ts +22 -0
  262. package/dist/types/src/hooks/usePullRequestFiles.d.ts.map +1 -0
  263. package/dist/types/src/hooks/useSyncPullRequest.d.ts +10 -0
  264. package/dist/types/src/hooks/useSyncPullRequest.d.ts.map +1 -0
  265. package/dist/types/src/index.d.ts +3 -3
  266. package/dist/types/src/index.d.ts.map +1 -1
  267. package/dist/types/src/meta.d.ts +34 -11
  268. package/dist/types/src/meta.d.ts.map +1 -1
  269. package/dist/types/src/operations/add-pull-request-comment.d.ts +5 -0
  270. package/dist/types/src/operations/add-pull-request-comment.d.ts.map +1 -0
  271. package/dist/types/src/operations/add-pull-request-review-comment.d.ts +5 -0
  272. package/dist/types/src/operations/add-pull-request-review-comment.d.ts.map +1 -0
  273. package/dist/types/src/operations/generate-walkthrough.d.ts +11 -0
  274. package/dist/types/src/operations/generate-walkthrough.d.ts.map +1 -0
  275. package/dist/types/src/operations/get-pull-request-diff.d.ts +5 -0
  276. package/dist/types/src/operations/get-pull-request-diff.d.ts.map +1 -0
  277. package/dist/types/src/operations/get-pull-request-status.d.ts +5 -0
  278. package/dist/types/src/operations/get-pull-request-status.d.ts.map +1 -0
  279. package/dist/types/src/operations/get-repositories.d.ts +13 -0
  280. package/dist/types/src/operations/get-repositories.d.ts.map +1 -0
  281. package/dist/types/src/operations/import-pull-request-from-snapshot.d.ts +12 -0
  282. package/dist/types/src/operations/import-pull-request-from-snapshot.d.ts.map +1 -0
  283. package/dist/types/src/operations/import-pull-request.d.ts +63 -0
  284. package/dist/types/src/operations/import-pull-request.d.ts.map +1 -0
  285. package/dist/types/src/operations/import-pull-request.test.d.ts +2 -0
  286. package/dist/types/src/operations/import-pull-request.test.d.ts.map +1 -0
  287. package/dist/types/src/operations/index.d.ts +3 -0
  288. package/dist/types/src/operations/index.d.ts.map +1 -0
  289. package/dist/types/src/operations/materialize-target.d.ts +12 -0
  290. package/dist/types/src/operations/materialize-target.d.ts.map +1 -0
  291. package/dist/types/src/operations/pull-request.d.ts +48 -0
  292. package/dist/types/src/operations/pull-request.d.ts.map +1 -0
  293. package/dist/types/src/operations/pull-request.test.d.ts +2 -0
  294. package/dist/types/src/operations/pull-request.test.d.ts.map +1 -0
  295. package/dist/types/src/operations/refresh-pull-requests.d.ts +5 -0
  296. package/dist/types/src/operations/refresh-pull-requests.d.ts.map +1 -0
  297. package/dist/types/src/operations/refresh.d.ts +37 -0
  298. package/dist/types/src/operations/refresh.d.ts.map +1 -0
  299. package/dist/types/src/operations/refresh.test.d.ts +2 -0
  300. package/dist/types/src/operations/refresh.test.d.ts.map +1 -0
  301. package/dist/types/src/operations/submit-pull-request-approval.d.ts +5 -0
  302. package/dist/types/src/operations/submit-pull-request-approval.d.ts.map +1 -0
  303. package/dist/types/src/operations/sync-pull-request.d.ts +5 -0
  304. package/dist/types/src/operations/sync-pull-request.d.ts.map +1 -0
  305. package/dist/types/src/operations/sync.d.ts +123 -0
  306. package/dist/types/src/operations/sync.d.ts.map +1 -0
  307. package/dist/types/src/operations/sync.test.d.ts +2 -0
  308. package/dist/types/src/operations/sync.test.d.ts.map +1 -0
  309. package/dist/types/src/plugin.d.ts +4 -0
  310. package/dist/types/src/plugin.d.ts.map +1 -0
  311. package/dist/types/src/plugin.test.d.ts +2 -0
  312. package/dist/types/src/plugin.test.d.ts.map +1 -0
  313. package/dist/types/src/pull-request-body.d.ts +37 -0
  314. package/dist/types/src/pull-request-body.d.ts.map +1 -0
  315. package/dist/types/src/pull-request-body.test.d.ts +2 -0
  316. package/dist/types/src/pull-request-body.test.d.ts.map +1 -0
  317. package/dist/types/src/pull-request.d.ts +28 -0
  318. package/dist/types/src/pull-request.d.ts.map +1 -0
  319. package/dist/types/src/pull-request.test.d.ts +2 -0
  320. package/dist/types/src/pull-request.test.d.ts.map +1 -0
  321. package/dist/types/src/services/github-api.d.ts +332 -0
  322. package/dist/types/src/services/github-api.d.ts.map +1 -0
  323. package/dist/types/src/services/index.d.ts +2 -0
  324. package/dist/types/src/services/index.d.ts.map +1 -0
  325. package/dist/types/src/skills/GitHubSkill.d.ts +12 -0
  326. package/dist/types/src/skills/GitHubSkill.d.ts.map +1 -0
  327. package/dist/types/src/skills/index.d.ts +2 -0
  328. package/dist/types/src/skills/index.d.ts.map +1 -0
  329. package/dist/types/src/stories/Generate.stories.d.ts +27 -0
  330. package/dist/types/src/stories/Generate.stories.d.ts.map +1 -0
  331. package/dist/types/src/stories/Links.stories.d.ts +23 -0
  332. package/dist/types/src/stories/Links.stories.d.ts.map +1 -0
  333. package/dist/types/src/stories/PullRequestArticle.stories.d.ts +359 -0
  334. package/dist/types/src/stories/PullRequestArticle.stories.d.ts.map +1 -0
  335. package/dist/types/src/stories/PullRequestFiles.stories.d.ts +365 -0
  336. package/dist/types/src/stories/PullRequestFiles.stories.d.ts.map +1 -0
  337. package/dist/types/src/stories/PullRequestOverview.stories.d.ts +367 -0
  338. package/dist/types/src/stories/PullRequestOverview.stories.d.ts.map +1 -0
  339. package/dist/types/src/stories/PullRequestsArticle.stories.d.ts +357 -0
  340. package/dist/types/src/stories/PullRequestsArticle.stories.d.ts.map +1 -0
  341. package/dist/types/src/stories/Walkthrough.stories.d.ts +380 -0
  342. package/dist/types/src/stories/Walkthrough.stories.d.ts.map +1 -0
  343. package/dist/types/src/stories/github.d.ts +23 -0
  344. package/dist/types/src/stories/github.d.ts.map +1 -0
  345. package/dist/types/src/stories/github.test.d.ts +2 -0
  346. package/dist/types/src/stories/github.test.d.ts.map +1 -0
  347. package/dist/types/src/stories/walkthrough-fixture.d.ts +8 -0
  348. package/dist/types/src/stories/walkthrough-fixture.d.ts.map +1 -0
  349. package/dist/types/src/testing/fixtures.d.ts +14 -0
  350. package/dist/types/src/testing/fixtures.d.ts.map +1 -0
  351. package/dist/types/src/testing/index.d.ts +4 -0
  352. package/dist/types/src/testing/index.d.ts.map +1 -0
  353. package/dist/types/src/testing/plugin.d.ts +4 -0
  354. package/dist/types/src/testing/plugin.d.ts.map +1 -0
  355. package/dist/types/src/testing/pull-request-13348.d.ts +6 -0
  356. package/dist/types/src/testing/pull-request-13348.d.ts.map +1 -0
  357. package/dist/types/src/translations.d.ts +339 -53
  358. package/dist/types/src/translations.d.ts.map +1 -1
  359. package/dist/types/src/types/GitHubCapabilities.d.ts +13 -0
  360. package/dist/types/src/types/GitHubCapabilities.d.ts.map +1 -0
  361. package/dist/types/src/types/GitHubEvents.d.ts +8 -0
  362. package/dist/types/src/types/GitHubEvents.d.ts.map +1 -0
  363. package/dist/types/src/types/GitHubOperation.d.ts +281 -0
  364. package/dist/types/src/types/GitHubOperation.d.ts.map +1 -0
  365. package/dist/types/src/types/PullRequestsView.d.ts +35 -0
  366. package/dist/types/src/types/PullRequestsView.d.ts.map +1 -0
  367. package/dist/types/src/types/Walkthrough.d.ts +31 -0
  368. package/dist/types/src/types/Walkthrough.d.ts.map +1 -0
  369. package/dist/types/src/types/Walkthrough.test.d.ts +2 -0
  370. package/dist/types/src/types/Walkthrough.test.d.ts.map +1 -0
  371. package/dist/types/src/types/index.d.ts +5 -0
  372. package/dist/types/src/types/index.d.ts.map +1 -0
  373. package/dist/types/src/walkthrough/fill.d.ts +28 -0
  374. package/dist/types/src/walkthrough/fill.d.ts.map +1 -0
  375. package/dist/types/src/walkthrough/fill.test.d.ts +2 -0
  376. package/dist/types/src/walkthrough/fill.test.d.ts.map +1 -0
  377. package/dist/types/src/walkthrough/generate.d.ts +67 -0
  378. package/dist/types/src/walkthrough/generate.d.ts.map +1 -0
  379. package/dist/types/src/walkthrough/generate.test.d.ts +2 -0
  380. package/dist/types/src/walkthrough/generate.test.d.ts.map +1 -0
  381. package/dist/types/src/walkthrough/generated.d.ts +20 -0
  382. package/dist/types/src/walkthrough/generated.d.ts.map +1 -0
  383. package/dist/types/src/walkthrough/generated.test.d.ts +2 -0
  384. package/dist/types/src/walkthrough/generated.test.d.ts.map +1 -0
  385. package/dist/types/src/walkthrough/headings.d.ts +8 -0
  386. package/dist/types/src/walkthrough/headings.d.ts.map +1 -0
  387. package/dist/types/src/walkthrough/headings.test.d.ts +2 -0
  388. package/dist/types/src/walkthrough/headings.test.d.ts.map +1 -0
  389. package/dist/types/src/walkthrough/index.d.ts +9 -0
  390. package/dist/types/src/walkthrough/index.d.ts.map +1 -0
  391. package/dist/types/src/walkthrough/patch.d.ts +48 -0
  392. package/dist/types/src/walkthrough/patch.d.ts.map +1 -0
  393. package/dist/types/src/walkthrough/plan.d.ts +55 -0
  394. package/dist/types/src/walkthrough/plan.d.ts.map +1 -0
  395. package/dist/types/src/walkthrough/plan.test.d.ts +2 -0
  396. package/dist/types/src/walkthrough/plan.test.d.ts.map +1 -0
  397. package/dist/types/src/walkthrough/prompt.d.ts +33 -0
  398. package/dist/types/src/walkthrough/prompt.d.ts.map +1 -0
  399. package/dist/types/src/walkthrough/prompt.test.d.ts +2 -0
  400. package/dist/types/src/walkthrough/prompt.test.d.ts.map +1 -0
  401. package/dist/types/src/walkthrough/score.d.ts +43 -0
  402. package/dist/types/src/walkthrough/score.d.ts.map +1 -0
  403. package/dist/types/src/walkthrough/score.test.d.ts +2 -0
  404. package/dist/types/src/walkthrough/score.test.d.ts.map +1 -0
  405. package/dist/types/tsconfig.tsbuildinfo +1 -0
  406. package/dx.config.ts +39 -0
  407. package/package.json +167 -48
  408. package/src/Extensions.ts +7 -0
  409. package/src/GitHubPlugin.ts +15 -0
  410. package/src/GitHubPlugin.workerd.test.ts +23 -0
  411. package/src/approval.test.ts +40 -0
  412. package/src/approval.ts +39 -0
  413. package/src/capabilities/app-graph-builder.ts +47 -0
  414. package/src/capabilities/connector.ts +95 -0
  415. package/src/capabilities/gen/browser.ts +82 -0
  416. package/src/capabilities/gen/node.ts +43 -0
  417. package/src/capabilities/gen/tauri.ts +82 -0
  418. package/src/capabilities/gen/workerd.ts +43 -0
  419. package/src/capabilities/index.ts +71 -0
  420. package/src/capabilities/link-resolver.ts +137 -0
  421. package/src/capabilities/markdown-extension.ts +146 -0
  422. package/src/capabilities/operation-handler.ts +16 -0
  423. package/src/capabilities/page-action.ts +32 -0
  424. package/src/capabilities/react-surface.ts +98 -0
  425. package/src/capabilities/schema.ts +16 -0
  426. package/src/capabilities/skill-definition.ts +14 -0
  427. package/src/cards/GitHubCard.stories.tsx +165 -0
  428. package/src/cards/GitHubCard.tsx +93 -0
  429. package/src/cards/PullRequestCard.tsx +23 -0
  430. package/src/cards/index.ts +6 -0
  431. package/src/components/CommentComposer/CommentComposer.tsx +109 -0
  432. package/src/components/CommentComposer/index.ts +5 -0
  433. package/src/components/PullRequestFiles/DiffStat.tsx +15 -0
  434. package/src/components/PullRequestFiles/FileTree.tsx +102 -0
  435. package/src/components/PullRequestFiles/PullRequestFiles.tsx +87 -0
  436. package/src/components/PullRequestFiles/files.test.ts +59 -0
  437. package/src/components/PullRequestFiles/files.ts +115 -0
  438. package/src/components/PullRequestFiles/index.ts +8 -0
  439. package/src/components/PullRequestOverview/ArtifactPill.tsx +82 -0
  440. package/src/components/PullRequestOverview/CheckRunList.test.ts +29 -0
  441. package/src/components/PullRequestOverview/CheckRunList.tsx +141 -0
  442. package/src/components/PullRequestOverview/PullRequestDetails.tsx +15 -0
  443. package/src/components/PullRequestOverview/PullRequestOverview.tsx +110 -0
  444. package/src/components/PullRequestOverview/RelatedCards.tsx +147 -0
  445. package/src/components/PullRequestOverview/index.ts +9 -0
  446. package/src/components/PullRequestStatus/PullRequestStatus.tsx +84 -0
  447. package/src/components/PullRequestStatus/index.ts +5 -0
  448. package/src/components/WalkthroughView/WalkthroughView.tsx +62 -0
  449. package/src/components/WalkthroughView/extensions.ts +53 -0
  450. package/src/components/WalkthroughView/index.ts +6 -0
  451. package/src/components/index.ts +6 -9
  452. package/src/constants.ts +12 -0
  453. package/src/containers/ImportPullRequestDialog/ImportPullRequestDialog.tsx +160 -0
  454. package/src/containers/ImportPullRequestDialog/index.ts +7 -0
  455. package/src/containers/PullRequestArticle/PullRequestArticle.tsx +573 -0
  456. package/src/containers/PullRequestArticle/failure.test.ts +42 -0
  457. package/src/containers/PullRequestArticle/failure.ts +16 -0
  458. package/src/containers/PullRequestArticle/index.ts +5 -0
  459. package/src/containers/PullRequestCardMenu/PullRequestCardMenu.tsx +134 -0
  460. package/src/containers/PullRequestCardMenu/index.ts +5 -0
  461. package/src/containers/PullRequestsArticle/PullRequestsArticle.tsx +361 -0
  462. package/src/containers/PullRequestsArticle/arrange.test.ts +122 -0
  463. package/src/containers/PullRequestsArticle/arrange.ts +245 -0
  464. package/src/containers/PullRequestsArticle/format.ts +31 -0
  465. package/src/containers/PullRequestsArticle/index.ts +5 -0
  466. package/src/containers/WalkthroughArticle/WalkthroughArticle.tsx +31 -0
  467. package/src/containers/WalkthroughArticle/index.ts +5 -0
  468. package/src/containers/index.ts +11 -0
  469. package/src/errors.ts +61 -0
  470. package/src/extensions/index.ts +6 -0
  471. package/src/extensions/links.test.ts +133 -0
  472. package/src/extensions/links.ts +91 -0
  473. package/src/extensions/references.test.ts +83 -0
  474. package/src/extensions/references.ts +100 -0
  475. package/src/github-link.ts +70 -0
  476. package/src/hooks/index.ts +6 -3
  477. package/src/hooks/useOpenObject.ts +48 -0
  478. package/src/hooks/usePullRequestChecks.ts +81 -0
  479. package/src/hooks/usePullRequestDiff.ts +57 -0
  480. package/src/hooks/usePullRequestFiles.ts +98 -0
  481. package/src/hooks/useSyncPullRequest.ts +51 -0
  482. package/src/index.ts +4 -6
  483. package/src/meta.ts +8 -13
  484. package/src/operations/add-pull-request-comment.ts +31 -0
  485. package/src/operations/add-pull-request-review-comment.ts +32 -0
  486. package/src/operations/generate-walkthrough.ts +124 -0
  487. package/src/operations/get-pull-request-diff.ts +37 -0
  488. package/src/operations/get-pull-request-status.ts +44 -0
  489. package/src/operations/get-repositories.ts +53 -0
  490. package/src/operations/import-pull-request-from-snapshot.ts +48 -0
  491. package/src/operations/import-pull-request.test.ts +151 -0
  492. package/src/operations/import-pull-request.ts +149 -0
  493. package/src/operations/index.ts +30 -0
  494. package/src/operations/materialize-target.ts +60 -0
  495. package/src/operations/pull-request.test.ts +120 -0
  496. package/src/operations/pull-request.ts +141 -0
  497. package/src/operations/refresh-pull-requests.ts +69 -0
  498. package/src/operations/refresh.test.ts +112 -0
  499. package/src/operations/refresh.ts +111 -0
  500. package/src/operations/submit-pull-request-approval.ts +41 -0
  501. package/src/operations/sync-pull-request.ts +34 -0
  502. package/src/operations/sync.test.ts +453 -0
  503. package/src/operations/sync.ts +807 -0
  504. package/src/plugin.test.ts +40 -0
  505. package/src/plugin.ts +37 -0
  506. package/src/pull-request-body.test.ts +61 -0
  507. package/src/pull-request-body.ts +144 -0
  508. package/src/pull-request.test.ts +67 -0
  509. package/src/pull-request.ts +80 -0
  510. package/src/services/github-api.ts +735 -0
  511. package/src/services/index.ts +5 -0
  512. package/src/skills/GitHubSkill.ts +46 -0
  513. package/src/skills/index.ts +5 -0
  514. package/src/stories/Generate.stories.tsx +152 -0
  515. package/src/stories/Links.stories.tsx +153 -0
  516. package/src/stories/PullRequestArticle.stories.tsx +107 -0
  517. package/src/stories/PullRequestFiles.stories.tsx +69 -0
  518. package/src/stories/PullRequestOverview.stories.tsx +114 -0
  519. package/src/stories/PullRequestsArticle.stories.tsx +170 -0
  520. package/src/stories/Walkthrough.stories.tsx +110 -0
  521. package/src/stories/github.test.ts +65 -0
  522. package/src/stories/github.ts +70 -0
  523. package/src/stories/walkthrough-fixture.ts +115 -0
  524. package/src/testing/fixtures.ts +99 -0
  525. package/src/testing/index.ts +7 -0
  526. package/src/testing/plugin.ts +25 -0
  527. package/src/testing/pull-request-13348.ts +104 -0
  528. package/src/testing/pull-request-13363.patch +2981 -0
  529. package/src/translations.ts +135 -63
  530. package/src/types/GitHubCapabilities.ts +27 -0
  531. package/src/types/GitHubEvents.ts +16 -0
  532. package/src/types/GitHubOperation.ts +397 -0
  533. package/src/types/PullRequestsView.ts +45 -0
  534. package/src/types/Walkthrough.test.ts +75 -0
  535. package/src/types/Walkthrough.ts +66 -0
  536. package/src/types/index.ts +8 -0
  537. package/src/vite-env.d.ts +15 -0
  538. package/src/walkthrough/fill.test.ts +337 -0
  539. package/src/walkthrough/fill.ts +246 -0
  540. package/src/walkthrough/generate.test.ts +219 -0
  541. package/src/walkthrough/generate.ts +248 -0
  542. package/src/walkthrough/generated.test.ts +70 -0
  543. package/src/walkthrough/generated.ts +70 -0
  544. package/src/walkthrough/headings.test.ts +40 -0
  545. package/src/walkthrough/headings.ts +39 -0
  546. package/src/walkthrough/index.ts +12 -0
  547. package/src/walkthrough/patch.ts +154 -0
  548. package/src/walkthrough/plan.test.ts +178 -0
  549. package/src/walkthrough/plan.ts +251 -0
  550. package/src/walkthrough/prompt.test.ts +100 -0
  551. package/src/walkthrough/prompt.ts +147 -0
  552. package/src/walkthrough/score.test.ts +272 -0
  553. package/src/walkthrough/score.ts +430 -0
  554. package/README.md +0 -15
  555. package/dist/lib/browser/chunk-S4MPSBA5.mjs +0 -21
  556. package/dist/lib/browser/chunk-S4MPSBA5.mjs.map +0 -7
  557. package/dist/lib/browser/index.css +0 -7
  558. package/dist/lib/browser/index.css.map +0 -7
  559. package/dist/lib/browser/index.mjs +0 -1535
  560. package/dist/lib/browser/index.mjs.map +0 -7
  561. package/dist/lib/browser/meta.json +0 -1
  562. package/dist/lib/browser/meta.mjs +0 -11
  563. package/dist/lib/browser/meta.mjs.map +0 -7
  564. package/dist/types/src/GithubPlugin.d.ts +0 -4
  565. package/dist/types/src/GithubPlugin.d.ts.map +0 -1
  566. package/dist/types/src/components/EmbeddedMain/EmbeddedMain.d.ts +0 -4
  567. package/dist/types/src/components/EmbeddedMain/EmbeddedMain.d.ts.map +0 -1
  568. package/dist/types/src/components/EmbeddedMain/GfmPreview.d.ts +0 -9
  569. package/dist/types/src/components/EmbeddedMain/GfmPreview.d.ts.map +0 -1
  570. package/dist/types/src/components/EmbeddedMain/index.d.ts +0 -2
  571. package/dist/types/src/components/EmbeddedMain/index.d.ts.map +0 -1
  572. package/dist/types/src/components/ExportDialog.d.ts +0 -8
  573. package/dist/types/src/components/ExportDialog.d.ts.map +0 -1
  574. package/dist/types/src/components/GithubApiProviders/GitHubSettings.d.ts +0 -3
  575. package/dist/types/src/components/GithubApiProviders/GitHubSettings.d.ts.map +0 -1
  576. package/dist/types/src/components/GithubApiProviders/OctokitProvider.d.ts +0 -15
  577. package/dist/types/src/components/GithubApiProviders/OctokitProvider.d.ts.map +0 -1
  578. package/dist/types/src/components/GithubApiProviders/index.d.ts +0 -3
  579. package/dist/types/src/components/GithubApiProviders/index.d.ts.map +0 -1
  580. package/dist/types/src/components/GithubEchoResolverProviders/DocumentTreeItem.d.ts +0 -6
  581. package/dist/types/src/components/GithubEchoResolverProviders/DocumentTreeItem.d.ts.map +0 -1
  582. package/dist/types/src/components/GithubEchoResolverProviders/ResolverContext.d.ts +0 -7
  583. package/dist/types/src/components/GithubEchoResolverProviders/ResolverContext.d.ts.map +0 -1
  584. package/dist/types/src/components/GithubEchoResolverProviders/ResolverDialog.d.ts +0 -6
  585. package/dist/types/src/components/GithubEchoResolverProviders/ResolverDialog.d.ts.map +0 -1
  586. package/dist/types/src/components/GithubEchoResolverProviders/ResolverProps.d.ts +0 -16
  587. package/dist/types/src/components/GithubEchoResolverProviders/ResolverProps.d.ts.map +0 -1
  588. package/dist/types/src/components/GithubEchoResolverProviders/ResolverTree.d.ts +0 -3
  589. package/dist/types/src/components/GithubEchoResolverProviders/ResolverTree.d.ts.map +0 -1
  590. package/dist/types/src/components/GithubEchoResolverProviders/SpacePickerTreeItem.d.ts +0 -11
  591. package/dist/types/src/components/GithubEchoResolverProviders/SpacePickerTreeItem.d.ts.map +0 -1
  592. package/dist/types/src/components/GithubEchoResolverProviders/index.d.ts +0 -3
  593. package/dist/types/src/components/GithubEchoResolverProviders/index.d.ts.map +0 -1
  594. package/dist/types/src/components/GithubEchoResolverProviders/spaceResolvers.d.ts +0 -6
  595. package/dist/types/src/components/GithubEchoResolverProviders/spaceResolvers.d.ts.map +0 -1
  596. package/dist/types/src/components/ImportDialog.d.ts +0 -7
  597. package/dist/types/src/components/ImportDialog.d.ts.map +0 -1
  598. package/dist/types/src/components/Issue.d.ts +0 -5
  599. package/dist/types/src/components/Issue.d.ts.map +0 -1
  600. package/dist/types/src/components/Loading/Loading.d.ts +0 -15
  601. package/dist/types/src/components/Loading/Loading.d.ts.map +0 -1
  602. package/dist/types/src/components/Loading/Loading.stories.d.ts +0 -40
  603. package/dist/types/src/components/Loading/Loading.stories.d.ts.map +0 -1
  604. package/dist/types/src/components/Loading/index.d.ts +0 -2
  605. package/dist/types/src/components/Loading/index.d.ts.map +0 -1
  606. package/dist/types/src/components/MarkdownActions.d.ts +0 -7
  607. package/dist/types/src/components/MarkdownActions.d.ts.map +0 -1
  608. package/dist/types/src/components/UrlDialog.d.ts +0 -6
  609. package/dist/types/src/components/UrlDialog.d.ts.map +0 -1
  610. package/dist/types/src/hooks/useDocGhId.d.ts +0 -6
  611. package/dist/types/src/hooks/useDocGhId.d.ts.map +0 -1
  612. package/dist/types/src/hooks/useGhIdFromUrl.d.ts +0 -2
  613. package/dist/types/src/hooks/useGhIdFromUrl.d.ts.map +0 -1
  614. package/dist/types/src/types.d.ts +0 -30
  615. package/dist/types/src/types.d.ts.map +0 -1
  616. package/src/GithubPlugin.tsx +0 -127
  617. package/src/components/EmbeddedMain/EmbeddedMain.tsx +0 -294
  618. package/src/components/EmbeddedMain/GfmPreview.tsx +0 -110
  619. package/src/components/EmbeddedMain/embedded.css +0 -3
  620. package/src/components/EmbeddedMain/index.ts +0 -5
  621. package/src/components/ExportDialog.tsx +0 -157
  622. package/src/components/GithubApiProviders/GitHubSettings.tsx +0 -72
  623. package/src/components/GithubApiProviders/OctokitProvider.tsx +0 -60
  624. package/src/components/GithubApiProviders/index.ts +0 -6
  625. package/src/components/GithubEchoResolverProviders/DocumentTreeItem.tsx +0 -26
  626. package/src/components/GithubEchoResolverProviders/ResolverContext.tsx +0 -137
  627. package/src/components/GithubEchoResolverProviders/ResolverDialog.tsx +0 -34
  628. package/src/components/GithubEchoResolverProviders/ResolverProps.ts +0 -23
  629. package/src/components/GithubEchoResolverProviders/ResolverTree.tsx +0 -86
  630. package/src/components/GithubEchoResolverProviders/SpacePickerTreeItem.tsx +0 -105
  631. package/src/components/GithubEchoResolverProviders/index.ts +0 -6
  632. package/src/components/GithubEchoResolverProviders/spaceResolvers.ts +0 -86
  633. package/src/components/ImportDialog.tsx +0 -72
  634. package/src/components/Issue.tsx +0 -62
  635. package/src/components/Loading/Loading.stories.tsx +0 -32
  636. package/src/components/Loading/Loading.tsx +0 -70
  637. package/src/components/Loading/index.ts +0 -5
  638. package/src/components/MarkdownActions.tsx +0 -136
  639. package/src/components/UrlDialog.tsx +0 -52
  640. package/src/hooks/useDocGhId.ts +0 -38
  641. package/src/hooks/useGhIdFromUrl.ts +0 -26
  642. package/src/types.ts +0 -51
package/PLUGIN.mdl ADDED
@@ -0,0 +1,784 @@
1
+ ---
2
+ id: org.dxos.plugin.github
3
+ name: GitHubPlugin
4
+ version: 0.1.0
5
+ ---
6
+
7
+ Bidirectional GitHub integration for DXOS Composer.
8
+
9
+ Connects one or more GitHub OAuth integrations to a space and keeps
10
+ organizations, people, repositories, issues, and pull requests
11
+ synchronized with ECHO. Users select repositories as sync targets; owning
12
+ organizations and their members are pulled automatically. Local edits to
13
+ issue title, description, and open/closed status are pushed back to GitHub
14
+ via snapshot-diff reconciliation.
15
+
16
+ ## Extensions
17
+
18
+ The following extension dialects are used in this document.
19
+ Each extension is defined in the Appendix or resolved via its URI.
20
+
21
+ | Term | URI |
22
+ |-------------|--------------------------------|
23
+ | `type` | `org.dxos.mdl.type@1.0` |
24
+ | `feat` | `org.dxos.mdl.feat@1.0` |
25
+ | `scenario` | `org.dxos.mdl.scenario@1.0` |
26
+ | `component` | `org.dxos.mdl.component@1.0` |
27
+ | `op` | `org.dxos.mdl.op@1.1` |
28
+ | `test` | `org.dxos.mdl.test@1.0` |
29
+
30
+ ## Types
31
+
32
+ ```mdl
33
+ type SyncTargetDescriptor
34
+ desc: Lightweight descriptor returned by GetGitHubRepositories; never stored in ECHO directly.
35
+ fields:
36
+ id: string # stringified GitHub numeric repo id
37
+ name: string # full_name e.g. "acme/anvil"
38
+ description?: string
39
+ ```
40
+
41
+ ```mdl
42
+ type SyncOptions
43
+ desc: Per-target sync tuning knobs stored on Integration.targets[i].options.
44
+ fields:
45
+ maxDaysBack?: number # pull issues/PRs updated within this many days; omit for full history
46
+ ```
47
+
48
+ ```mdl
49
+ type GitHubUser
50
+ desc: Subset of the GitHub REST user object consumed by the sync service.
51
+ fields:
52
+ id: number
53
+ login: string
54
+ name?: string
55
+ email?: string
56
+ avatar_url?: string
57
+ html_url?: string
58
+ ```
59
+
60
+ ```mdl
61
+ type GitHubOrg
62
+ desc: Subset of the GitHub REST org object.
63
+ fields:
64
+ id: number
65
+ login: string
66
+ name?: string
67
+ description?: string
68
+ blog?: string
69
+ avatar_url?: string
70
+ html_url?: string
71
+ ```
72
+
73
+ ```mdl
74
+ type GitHubRepo
75
+ desc: Subset of the GitHub REST repo object.
76
+ fields:
77
+ id: number
78
+ name: string
79
+ full_name: string
80
+ description?: string
81
+ html_url?: string
82
+ archived?: boolean
83
+ owner: GitHubUser # owner.login used to derive org lookup
84
+ ```
85
+
86
+ ```mdl
87
+ type GitHubIssue
88
+ desc: Subset of the GitHub REST issue object; PRs appear here with a non-null pull_request field.
89
+ fields:
90
+ id: number
91
+ number: number
92
+ title: string
93
+ body?: string
94
+ state: open | closed
95
+ assignees?: GitHubUser[]
96
+ labels?: GitHubLabel[]
97
+ pull_request?: GitHubPullRef # non-null → this item is a PR
98
+ created_at?: string
99
+ updated_at?: string
100
+ closed_at?: string
101
+ ```
102
+
103
+ ```mdl
104
+ type GitHubLabel
105
+ fields:
106
+ name: string
107
+ ```
108
+
109
+ ```mdl
110
+ type GitHubPullRef
111
+ desc: Minimal PR marker stored inline on a GitHubIssue.
112
+ fields:
113
+ url: string
114
+ merged_at?: string
115
+ ```
116
+
117
+ ```mdl
118
+ type GitHubComment
119
+ fields:
120
+ id: number
121
+ body?: string
122
+ user?: GitHubUser
123
+ created_at?: string
124
+ updated_at?: string
125
+ html_url?: string
126
+ ```
127
+
128
+ ```mdl
129
+ type ProjectSnapshot
130
+ desc: Fields recorded on Integration.snapshots after each pull; used to detect local divergence on push.
131
+ fields:
132
+ name: string # recorded but push is intentionally disabled
133
+ description: string
134
+ ```
135
+
136
+ ```mdl
137
+ type TaskSnapshot
138
+ desc: Fields recorded on Integration.snapshots after each pull; used to detect local divergence on push.
139
+ fields:
140
+ title: string
141
+ description: string
142
+ status: todo | done # collapsed from GitHub open/closed
143
+ ```
144
+
145
+ ```mdl
146
+ type SyncResult
147
+ desc: Counters returned by SyncGitHubRepositories.
148
+ fields:
149
+ pulled:
150
+ organizations: number
151
+ people: number
152
+ projects: number
153
+ tasks: number
154
+ comments: number
155
+ ```
156
+
157
+ ## Operations
158
+
159
+ Discovery operations — read-only, no local writes.
160
+
161
+ ```mdl
162
+ op GetGitHubRepositories
163
+ key: org.dxos.operation.github.getRepositories
164
+ desc: |
165
+ List GitHub repositories reachable from an integration token.
166
+ Read-only: no local objects are created. Orgs are NOT listed here;
167
+ they are auto-pulled during SyncGitHubRepositories.
168
+ input:
169
+ connection: Ref<Connection> # renamed from `integration`; see plugin-connector's ConnectorSpec
170
+ output: GetSyncTargetsOutput
171
+ effects: [http]
172
+ errors:
173
+ Unauthorized: token missing or revoked
174
+ NetworkError: transient HTTP failure after retries
175
+ ```
176
+
177
+ ```mdl
178
+ op MaterializeGitHubTarget
179
+ key: org.dxos.operation.github.materializeTarget
180
+ desc: |
181
+ Find-or-create the empty local root Project bound to a selected GitHub repo, keyed by the
182
+ repo's foreign id, so a Cursor can reference it as its `spec.target`.
183
+ input:
184
+ connection: Ref<Connection>
185
+ remoteTarget?: RemoteTarget
186
+ output: { target: Ref<Obj> }
187
+ effects: [echo:write]
188
+ ```
189
+
190
+ Effectful sync operations — pull from GitHub, push diverged fields back.
191
+
192
+ ```mdl
193
+ op SyncGitHubRepositories
194
+ key: org.dxos.operation.github.syncRepositories
195
+ desc: |
196
+ Reconcile selected GitHub repositories plus their owning organizations,
197
+ members, issues, PRs, and (future) comments with ECHO.
198
+ Pull direction: upserts Organization, Person, Project, Task via foreign-key.
199
+ Push direction: snapshot-diffs Project.description and Task title /
200
+ description / status and PATCHes diverged fields back to GitHub.
201
+ PR status is pull-only (push is intentionally disabled).
202
+ Updates Integration.targets[i].lastSyncAt / lastError per target.
203
+ input:
204
+ connection: Ref<Connection> # renamed from `integration`; every binding of the connection is synced
205
+ priority?: string # cursor id to sync first
206
+ output: SyncResult
207
+ effects: [echo:read, echo:write, http]
208
+ errors:
209
+ Unauthorized: token missing or revoked
210
+ NetworkError: transient HTTP failure after retries
211
+ RepositoryNotAccessible: token cannot see one or more selected repos
212
+ note: |
213
+ Parallelism: up to 4 repos concurrently (REPO_CONCURRENCY); up to 4
214
+ issues per repo (ISSUE_CONCURRENCY). Person upserts are serialized via
215
+ a semaphore + login-keyed cache to prevent duplicates across fibers.
216
+ Pagination: up to 10 pages per paginated endpoint (1 000 items max).
217
+ ```
218
+
219
+ ```mdl
220
+ op ImportPullRequest
221
+ key: org.dxos.operation.github.importPullRequest
222
+ desc: |
223
+ Add one pull request to the space, named by a github.com URL or `owner/repo#number`,
224
+ so a reviewer with a link in hand need not sync the whole repository first.
225
+ Idempotent by owner/repo/number: a pull request the space already holds is returned
226
+ as it stands. The object is filed via SpaceOperation.AddObject, not merely added.
227
+ input:
228
+ reference: string # https://github.com/owner/repo/pull/123, or owner/repo#123
229
+ output: { pullRequest: Ref<PullRequest>, imported: boolean }
230
+ effects: [echo:read, echo:write, http]
231
+ errors:
232
+ GitHubPullRequestReferenceError: the text names no pull request
233
+ NetworkError: transient HTTP failure after retries
234
+
235
+ ```
236
+
237
+ ```mdl
238
+ op ImportPullRequestFromSnapshot
239
+ key: org.dxos.operation.github.importPullRequestFromSnapshot
240
+ desc: |
241
+ The browser extension's page action: import the pull request the open page shows.
242
+ Nothing is extracted from the DOM — the snapshot's `source.url` names the pull request
243
+ and ImportPullRequest does the rest, so the anonymous-read fallback and the
244
+ already-held check are shared. Answers with the object's id, which is the shape the
245
+ extension bridge acks and the Composer side opens.
246
+ input:
247
+ snapshot: PageAction.Snapshot # the extension's generic page snapshot; only source.url is read
248
+ target: Database # the active space's database
249
+ output: { id: string }
250
+ effects: [echo:read, echo:write, http]
251
+ errors:
252
+ GitHubPullRequestReferenceError: the page's URL names no pull request
253
+ ```
254
+
255
+ ```mdl
256
+ op SubmitPullRequestApproval
257
+ key: org.dxos.operation.github.submitPullRequestApproval
258
+ desc: |
259
+ Approve a pull request as the space's GitHub connection. Where GitHub refuses the
260
+ review -- 422 on the author's own pull request, 403 on a token without review
261
+ permission -- the approval is posted as a conversation comment carrying the
262
+ `<!-- dxos:approval state=approved -->` marker instead, so the verdict is recorded
263
+ and an agent polling the conversation can still read "good to land". Any other
264
+ failure (401, network) surfaces rather than becoming a comment.
265
+ input:
266
+ pullRequest: Ref<PullRequest>
267
+ body?: string # review summary, kept above the marker in the comment
268
+ output: { reviewId?: number, commentId?: number, url?: string, commented: boolean }
269
+ effects: [echo:read, http]
270
+ errors:
271
+ Unauthorized: token missing or revoked
272
+ ```
273
+
274
+ ## Features
275
+
276
+ ```mdl
277
+ feat F-1: OAuth Integration
278
+
279
+ req F-1.1:
280
+ when: user connects a GitHub integration
281
+ then: plugin-connector OAuth flow redirects to GitHub for authorization
282
+
283
+ req F-1.2:
284
+ when: OAuth callback completes
285
+ then: accessToken stored in ECHO; fetchUser called to set accessToken.account to user login
286
+
287
+ req F-1.3: Integration source is "github.com"; provider id is "github".
288
+ ```
289
+
290
+ ```mdl
291
+ feat F-2: Repository Discovery
292
+
293
+ req F-2.1:
294
+ when: user opens the integration target picker
295
+ then: GetGitHubRepositories returns all repos visible to the token sorted by full_name (case-insensitive)
296
+
297
+ req F-2.2: No local ECHO objects are created during discovery.
298
+
299
+ req F-2.3: Owner, collaborator, and org-member repo affiliations are included.
300
+ ```
301
+
302
+ ```mdl
303
+ feat F-3: Pull — Organizations and People
304
+
305
+ req F-3.1:
306
+ when: a selected repo is owned by a GitHub organization
307
+ then: that org is upserted as an Organization in ECHO (name, description, website, image)
308
+
309
+ req F-3.2:
310
+ when: org is synced
311
+ then: org members are upserted as Person objects linked to the Organization
312
+
313
+ req F-3.3: Personal-account repos (owner is not an org) skip org/member pull without error.
314
+
315
+ req F-3.4: A single org is pulled at most once per sync pass regardless of how many repos it owns.
316
+ ```
317
+
318
+ ```mdl
319
+ feat F-4: Pull — Repositories as Projects
320
+
321
+ req F-4.1:
322
+ when: a selected repo does not yet have a local mirror
323
+ then: Project created in ECHO with foreign key [source: "github.com", id: String(repo.id)]
324
+
325
+ req F-4.2:
326
+ when: a selected repo already has a local mirror
327
+ then: Project fields updated via three-way merge against the stored snapshot
328
+
329
+ req F-4.3:
330
+ when: Integration.targets[i].object is missing or points at a different Project
331
+ then: target.object is rewired to the upserted Project
332
+ ```
333
+
334
+ ```mdl
335
+ feat F-5: Pull — Issues and PRs as Tasks
336
+
337
+ req F-5.1:
338
+ when: issue/PR does not yet have a local mirror
339
+ then: Task created with fields title, description, status (open→todo, closed→done), assignee, project ref
340
+
341
+ req F-5.2:
342
+ when: issue/PR already has a local mirror
343
+ then: Task fields updated via three-way merge against stored snapshot
344
+
345
+ req F-5.3: PRs are treated identically to issues on pull; pull_request field marks them as PRs.
346
+
347
+ req F-5.4:
348
+ when: maxDaysBack is set on a target
349
+ then: only issues/PRs updated within that window are fetched from GitHub
350
+ ```
351
+
352
+ ```mdl
353
+ feat F-6: Push — Local Edits Back to GitHub
354
+
355
+ req F-6.1:
356
+ when: Project.description diverges from the last pulled snapshot
357
+ then: PATCH /repos/{owner}/{repo} sends the new description
358
+
359
+ req F-6.2:
360
+ when: Task.title or Task.description diverges from snapshot
361
+ then: PATCH /repos/{owner}/{repo}/issues/{number} sends the updated fields
362
+
363
+ req F-6.3:
364
+ when: Task.status diverges from snapshot and the issue is not a PR
365
+ then: PATCH sends state: open or closed accordingly
366
+
367
+ req F-6.4:
368
+ when: PR status diverges locally
369
+ then: divergence is logged; push is skipped (PRs are pull-only for status)
370
+
371
+ req F-6.5: Project.name (repo rename) divergence is logged but never pushed.
372
+ ```
373
+
374
+ ```mdl
375
+ feat F-7: Error Handling and Resilience
376
+
377
+ req F-7.1:
378
+ when: a per-target sync fails
379
+ then: lastError is set on that target; other targets continue
380
+
381
+ req F-7.2:
382
+ when: a repo is inaccessible to the integration token
383
+ then: lastError is set to "Repository not accessible to integration token"
384
+
385
+ req F-7.3:
386
+ when: an HTTP request returns 429 or 5xx
387
+ then: request is retried with exponential backoff + jitter (max 3 retries, 500 ms base)
388
+
389
+ req F-7.4:
390
+ when: sync succeeds
391
+ then: LayoutOperation.AddToast fires a success notification
392
+
393
+ req F-7.5:
394
+ when: sync fails
395
+ then: LayoutOperation.AddToast fires an error notification with a human-readable message
396
+ ```
397
+
398
+ ```mdl
399
+ feat F-8: Link Previews
400
+
401
+ req F-8.1:
402
+ when: a document contains a repository, pull-request or issue URL
403
+ then: githubLinks (contributed via MarkdownCapabilities.ExtensionProvider) renders it as an anchor chip
404
+
405
+ req F-8.2:
406
+ when: the chip is activated
407
+ then: the plugin's PreviewCapabilities.LinkResolver answers with an in-memory Repo, PullRequest or Issue (@dxos/types), never stored
408
+
409
+ req F-8.3: The object comes from a contributed GitHubCapabilities.LinkSource when a host provides one; otherwise it is fetched from the GitHub API with the space's connection token, or anonymously when the space has none.
410
+
411
+ req F-8.4: GitHubCard is the CardContent surface for Repo, Issue and PullRequest, so the popover shows reference, state, author, diff size (or default branch) and a link out.
412
+ ```
413
+
414
+ ```mdl
415
+ feat F-9: Pull Request Review
416
+
417
+ req F-9.1:
418
+ when: the user runs the "Import pull request" command and names a pull request
419
+ then: ImportPullRequest files it in the active space and the deck opens it
420
+
421
+ req F-9.2: The article's subject is the PullRequest, not its walkthrough — so a pull request with no narration yet opens, showing its state, CI outcome and a "Generate walkthrough" action.
422
+
423
+ req F-9.3:
424
+ when: the space holds a walkthrough of the open pull request
425
+ then: the article's Walkthrough tab renders its prose and diff chunks, and the toolbar action regenerates rather than generates
426
+
427
+ req F-9.4: A Walkthrough opened by id resolves to the same article, through the pull request it narrates.
428
+
429
+ req F-9.5:
430
+ when: the user clicks "Open PR in Composer" in the browser extension on a github.com pull
431
+ request page
432
+ then: ImportPullRequestFromSnapshot files that pull request in the active space, and the
433
+ extension's auto-open setting opens it in the deck
434
+
435
+ req F-9.6: The article opens on an Overview tab showing the pull request's live description as markdown, with the harness's Claude Code footer and CI's Composer preview block taken out of the prose.
436
+
437
+ req F-9.7: A link into the agent-artifacts R2 bucket renders as a pill that previews its image or video in place, and each such artifact, the Composer preview and the Claude Code session are listed as related cards in a masonry grid.
438
+
439
+ req F-9.8: The Overview lists every check run on the head commit, failures first, with its outcome, duration and a link to the provider's logs.
440
+
441
+ req F-9.9: The Overview shows the pull request's reference, state, CI outcome and branches as a read-only form in a details card.
442
+
443
+ req F-9.10: A Files tab shows one changed file at a time as the walkthrough's own diff chunk, beside a tree of every changed file with its change counts; the toolbar steps to the previous or next file.
444
+
445
+ req F-9.11:
446
+ when: the reader checks a file off, in the tree or with the toolbar's Reviewed action
447
+ then: the file counts as reviewed in that browser until a push changes it, and the toolbar action moves on to the next file
448
+ ```
449
+
450
+ ## Acceptance
451
+
452
+ ```mdl
453
+ scenario T-1: Token account populated on connect
454
+ given: user completes GitHub OAuth
455
+ when: onTokenCreated fires
456
+ then:
457
+ - GET /user is called with the new token
458
+ - accessToken.account === user.login
459
+ ```
460
+
461
+ ```mdl
462
+ scenario T-2: Repository discovery is read-only
463
+ given: valid GitHub integration
464
+ when: GetGitHubRepositories is invoked
465
+ then:
466
+ - list of SyncTargetDescriptor returned sorted by full_name
467
+ - no Organization, Person, Project, or Task objects are created in ECHO
468
+ ```
469
+
470
+ ```mdl
471
+ scenario T-3: First sync — create Project and Tasks
472
+ given: integration with one selected repo (no prior local mirror)
473
+ when: SyncGitHubRepositories runs
474
+ then:
475
+ - Project created with foreign key for the repo
476
+ - one Task created per issue/PR
477
+ - open issues map to status todo; closed issues map to status done
478
+ - ProjectSnapshot and TaskSnapshot written for each object
479
+ ```
480
+
481
+ ```mdl
482
+ scenario T-4: Incremental pull — remote-wins merge
483
+ given: integration with a previously synced repo; remote title changed
484
+ when: SyncGitHubRepositories runs
485
+ then:
486
+ - Task.title updated to remote value
487
+ - TaskSnapshot.title updated to match
488
+ ```
489
+
490
+ ```mdl
491
+ scenario T-5: Push issue edit
492
+ given: Task.description differs from TaskSnapshot.description; issue is not a PR
493
+ when: SyncGitHubRepositories runs
494
+ then:
495
+ - PATCH /repos/{owner}/{repo}/issues/{number} called with new body
496
+ - TaskSnapshot.description updated to sent value
497
+ ```
498
+
499
+ ```mdl
500
+ scenario T-6: PR status not pushed
501
+ given: Task (backed by a PR) status differs from snapshot
502
+ when: SyncGitHubRepositories runs
503
+ then:
504
+ - no PATCH issued for that task's status
505
+ - divergence logged at warn level
506
+ ```
507
+
508
+ ```mdl
509
+ scenario T-7: Inaccessible repo error surfaced
510
+ given: integration target whose repo id is not in fetchUserRepos response
511
+ when: SyncGitHubRepositories runs
512
+ then:
513
+ - target.lastError === "Repository not accessible to integration token"
514
+ - other targets continue and complete normally
515
+ ```
516
+
517
+ ```mdl
518
+ scenario T-8: Org deduplication
519
+ given: two selected repos with the same owner org
520
+ when: SyncGitHubRepositories runs
521
+ then:
522
+ - fetchOrg called once for that owner
523
+ - exactly one Organization upserted
524
+ ```
525
+
526
+ ```mdl
527
+ scenario T-9: Personal-account owner skips org pull
528
+ given: selected repo owned by a GitHub user (not an org)
529
+ when: SyncGitHubRepositories runs
530
+ then:
531
+ - org lookup returns 404
532
+ - no Organization created; sync continues without error
533
+ ```
534
+
535
+ ```mdl
536
+ scenario T-10: maxDaysBack filters issue window
537
+ given: target with maxDaysBack = 7
538
+ when: SyncGitHubRepositories runs
539
+ then:
540
+ - fetchRepoIssues called with since = (now − 7 days).toISOString()
541
+ - issues older than the window are not fetched
542
+ ```
543
+
544
+ ---
545
+
546
+ ## QA
547
+
548
+ Executable tests. Each step carries a human instruction (`do`) and, where the step maps to an
549
+ invocable operation, an agent binding (`invoke`). Report failures by test and step number.
550
+
551
+ ```mdl
552
+ test QA-1: Connect, select a repository, and sync
553
+ desc: The core round-trip — authorize a GitHub connection, discover repos, materialize and sync one as a Project with its issues as Tasks.
554
+ actors: both
555
+ covers: [F-1.1, F-1.2, F-2.1, F-2.2, F-4.1, F-5.1, T-2, T-3]
556
+ status: unverified
557
+ given:
558
+ - an identity exists
559
+ - space: a space is open
560
+ - a GitHub account reachable for OAuth, owning at least one repo with at least one open issue
561
+ - no Project with foreign key [source: "github.com", id: <that repo's numeric id>] exists —
562
+ ABORT rather than reusing a Project this test did not create
563
+ steps:
564
+ - name: Connect a GitHub account
565
+ id: connect
566
+ do: Open the GitHub connector panel (Settings -> Connectors -> GitHub) and complete the OAuth authorization test.
567
+ capture: connection
568
+ expect: a Connection object exists with accessToken.account set to the authorized user's GitHub login
569
+ note: |
570
+ NO `invoke` — the OAuth redirect and callback are real browser navigation through GitHub's
571
+ consent screen; the debug port cannot drive it. This step is human-only for any account
572
+ that has not already authorized the app.
573
+ - name: Discover repositories
574
+ do: Open the target picker for the new connection.
575
+ invoke: [op:GetGitHubRepositories] { connection: $connection.connection }
576
+ capture: targets
577
+ expect: the picker lists repos visible to the token, sorted by full_name, and no Organization/Person/Project/Task objects are created yet
578
+ assert: return $result.targets.length > 0 && !$result.targets.some((t) => /^\d+$/.test(t.id) === false)
579
+ - name: Select the repository as a sync target
580
+ do: Pick the target repo from the list and confirm.
581
+ invoke: [op:MaterializeGitHubTarget] { connection: $connection.connection, remoteTarget: $targets.targets[0] }
582
+ capture: materialized
583
+ expect: an empty local root Project now exists, bound to the selected repo
584
+ assert: return !!$materialized.target
585
+ - name: Sync the connection
586
+ do: Click "Sync now" on the connection (or wait for the scheduled sync).
587
+ invoke: [op:SyncGitHubRepositories] { connection: $connection.connection }
588
+ capture: synced
589
+ expect: the Project's fields are populated from the repo, and one Task exists per open/closed issue and PR in that repo
590
+ assert: return $synced.pulled.projects >= 1 && $synced.pulled.tasks >= 1
591
+ after:
592
+ - name: Remove the synced Project and its Tasks
593
+ do: Right-click the Project in the navtree and choose Delete, then repeat for each Task it produced (or delete the containing collection).
594
+ invoke: org.dxos.operation.space.removeObjects { objects: [$materialized.target] }
595
+ expect: the Project and its Tasks leave the navtree; the underlying GitHub repo and issues are untouched
596
+ - name: Disconnect the GitHub account
597
+ do: In Settings -> Connectors -> GitHub, remove the connection.
598
+ expect: the Connection object and its stored access token are removed
599
+ ```
600
+
601
+ ```mdl
602
+ test QA-2: Local edit pushes back to GitHub
603
+ desc: A push-direction check — editing a synced Task's title round-trips to the GitHub issue via PATCH.
604
+ actors: human
605
+ covers: [F-6.2, T-5]
606
+ status: unverified
607
+ given:
608
+ - an identity exists
609
+ - space: a space is open
610
+ - a GitHub account reachable for OAuth, with write access to a repo owning at least one open
611
+ (non-PR) issue
612
+ - no Project with foreign key [source: "github.com", id: <that repo's numeric id>] exists —
613
+ ABORT rather than reusing a Project this test did not create
614
+ - connection: a fresh GitHub Connection, authorized against that account (same human-only
615
+ OAuth step as QA-1's "Connect a GitHub account")
616
+ - materialized: the target repo materialized and synced as a Project via
617
+ op:MaterializeGitHubTarget then op:SyncGitHubRepositories (same steps as QA-1), leaving at
618
+ least one open (non-PR) Task
619
+ steps:
620
+ - name: Edit the task title
621
+ do: Open the synced Task and change its title.
622
+ expect: the edit is saved locally
623
+ note: NO `invoke` — this is an ordinary field edit through the Task surface, not a github operation.
624
+ - name: Re-sync
625
+ do: Click "Sync now" on the connection again.
626
+ invoke: [op:SyncGitHubRepositories] { connection: $given.connection }
627
+ expect: GitHub shows the issue's title updated to match, and the local TaskSnapshot.title now matches the new value
628
+ note: |
629
+ Verify by opening the issue on github.com — SyncGitHubRepositories's snapshot-diff push has
630
+ no separate read-back operation in this document, so the effect is checked against GitHub
631
+ itself (Execution Rule 3).
632
+ after:
633
+ - name: Revert the title on GitHub
634
+ do: Edit the issue's title back to its original value directly on github.com, then re-sync.
635
+ invoke: [op:SyncGitHubRepositories] { connection: $given.connection }
636
+ expect: the local Task.title reflects the reverted value
637
+ - name: Remove the synced Project and its Tasks
638
+ do: Right-click the Project in the navtree and choose Delete, then repeat for each Task it
639
+ produced (or delete the containing collection).
640
+ invoke: |
641
+ org.dxos.operation.space.removeObjects {
642
+ refs: [$given.materialized.target,
643
+ ...(await space.db.query(dxos.Filter.type(dxos.DXN.make('org.dxos.type.task'))).run()).objects
644
+ .filter((task) => task.project?.target?.id === $given.materialized.target.target?.id)
645
+ .map((task) => window.__echo.Ref.make(task))]
646
+ }
647
+ note: |
648
+ `materialized.target` is a Ref, so it travels in `refs`, not `objects`; the synced Tasks
649
+ are resolved separately because removing the Project does not cascade to them.
650
+ expect: the Project and its Tasks leave the navtree; the underlying GitHub repo and issues are untouched
651
+ - name: Disconnect the GitHub account
652
+ do: In Settings -> Connectors -> GitHub, remove the connection.
653
+ expect: the Connection object and its stored access token are removed
654
+ ```
655
+
656
+ ```mdl
657
+ test QA-3: Open a pull request from the browser extension
658
+ desc: |
659
+ The plugin-crx page action, end to end through the operation it names. Uses a public pull
660
+ request so no GitHub connection is needed — the import falls back to an anonymous read.
661
+ actors: both
662
+ covers: [F-9.5, F-9.3]
663
+ status: unverified
664
+ automated:
665
+ - composer-e2e:crx.spec.ts#Extension page actions › contributes the pull request action to the extension registry
666
+ - composer-e2e:crx.spec.ts#Extension page actions › imports the pull request the page names
667
+ - composer-e2e:crx-extension.spec.ts#Extension › opens the pull request the toolbar action is clicked on
668
+ given:
669
+ - an identity exists
670
+ - space: a space is open
671
+ - no PullRequest with owner "dxos", repo "dxos", number 1 exists — ABORT rather than
672
+ deleting one this test did not create
673
+ steps:
674
+ - name: Open the pull request from the extension
675
+ do: |
676
+ On https://github.com/dxos/dxos/pull/1, open the Composer extension side panel and click
677
+ "Open PR in Composer". The extension captures the page snapshot and invokes the operation
678
+ against the active space.
679
+ invoke: |
680
+ org.dxos.operation.github.importPullRequestFromSnapshot {
681
+ snapshot: { source: { url: "https://github.com/dxos/dxos/pull/1", title: "chore: release 1.0.0 by github-actions[bot] - Pull Request #1 - dxos/dxos", clippedAt: "2026-09-22T00:00:00Z" } },
682
+ target: $given.space.db
683
+ }
684
+ capture: imported
685
+ expect: a PullRequest titled "chore: release 1.0.0" now exists in the space
686
+ assert: return !!$imported.id
687
+ note: |
688
+ Only `source.url` is read — the page title above is ignored, which is the point of the
689
+ operation taking a snapshot rather than an extraction.
690
+ - name: Re-invoke on the same pull request
691
+ do: Click "Open PR in Composer" again on the same page.
692
+ invoke: |
693
+ org.dxos.operation.github.importPullRequestFromSnapshot {
694
+ snapshot: { source: { url: "https://github.com/dxos/dxos/pull/1", title: "chore: release 1.0.0", clippedAt: "2026-09-22T00:00:00Z" } },
695
+ target: $given.space.db
696
+ }
697
+ expect: the same object is returned and the space still holds exactly one copy
698
+ assert: return $result.id === $imported.id
699
+ - name: Generate its walkthrough
700
+ do: Open the imported pull request and click "Generate walkthrough" in the article toolbar.
701
+ invoke: |
702
+ org.dxos.operation.github.generateWalkthrough { pullRequest: { "/": "echo://$given.space.id/$imported.id" } }
703
+ expect: the article renders narrated prose with the change's diff chunks spliced in
704
+ assert: return !!$result.walkthrough
705
+ note: |
706
+ Needs an AI provider configured — the only step here that does. GitHub itself is still read
707
+ anonymously, so no GitHub connection is required.
708
+ after:
709
+ - name: Delete the imported pull request
710
+ do: Right-click the pull request in the navtree and choose Delete.
711
+ invoke: |
712
+ org.dxos.operation.space.removeObjects { objects: [{ "/": "echo://$given.space.id/$imported.id" }], target: $given.space.db }
713
+ expect: the pull request no longer appears in the space
714
+ ```
715
+
716
+ ---
717
+
718
+ ## Appendix: Extension Definitions
719
+
720
+ Extension block types used in this document are defined below using
721
+ the core `ext` primitive — the only construct the base language provides.
722
+
723
+ ```mdl
724
+ ext type
725
+ uri: org.dxos.mdl.type@1.0
726
+ desc: A named data structure with typed fields and optional literals.
727
+ fields:
728
+ desc?: Prose
729
+ fields?: FieldMap # name[?]: TypeExpr (# inline comment)
730
+ literals?: UnionList # a | b | c
731
+ extends?: TypeRef[]
732
+ ```
733
+
734
+ ```mdl
735
+ ext feat
736
+ uri: org.dxos.mdl.feat@1.0
737
+ desc: A named feature grouping one or more requirements.
738
+ fields:
739
+ desc?: Prose
740
+ req: RequirementList
741
+ nesting: self # feat blocks may contain feat blocks
742
+ ```
743
+
744
+ ```mdl
745
+ ext scenario
746
+ uri: org.dxos.mdl.scenario@1.0
747
+ desc: An acceptance scenario expressed as given / when / then steps.
748
+ fields:
749
+ given?: Step | Step[]
750
+ when?: Step | Step[]
751
+ then: Step | Step[]
752
+ tags?: TagList
753
+ ```
754
+
755
+ ```mdl
756
+ ext component
757
+ uri: org.dxos.mdl.component@1.0
758
+ desc: A UI component with props, internal state, slots, actions, and events.
759
+ fields:
760
+ desc?: Prose
761
+ props?: FieldMap # external inputs (immutable inside component)
762
+ state?: FieldMap # internal reactive state
763
+ slots?: FieldMap # named ReactNode injection points
764
+ actions?: ActionMap # methods the component exposes or handles
765
+ emits?: EventMap # events the component raises to its parent
766
+ layout?: CodeBlock # ASCII sketch of visual structure (non-normative)
767
+ ```
768
+
769
+ ```mdl
770
+ ext op
771
+ uri: org.dxos.mdl.op@1.1
772
+ desc: |
773
+ A named operation with typed inputs, outputs, and declared errors.
774
+ Pure ops have no effects or requires. Effectful ops declare both.
775
+ fields:
776
+ key?: NSID # runtime operation key — what the invoker receives
777
+ desc?: Prose
778
+ input?: FieldMap # named input parameters
779
+ output?: TypeExpr # return type
780
+ errors?: ErrorMap # name: Prose (when this error occurs)
781
+ effects?: EffectList # echo:read | echo:write | http | fs | ...
782
+ requires?: ServiceList # injected service dependencies
783
+ note?: Prose # implementation guidance (non-normative)
784
+ ```