@enbox/gitd 0.0.1

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 (502) hide show
  1. package/LICENSE +177 -0
  2. package/README.md +134 -0
  3. package/dist/esm/ci.js +76 -0
  4. package/dist/esm/ci.js.map +1 -0
  5. package/dist/esm/cli/agent.js +86 -0
  6. package/dist/esm/cli/agent.js.map +1 -0
  7. package/dist/esm/cli/commands/ci.js +278 -0
  8. package/dist/esm/cli/commands/ci.js.map +1 -0
  9. package/dist/esm/cli/commands/clone.js +77 -0
  10. package/dist/esm/cli/commands/clone.js.map +1 -0
  11. package/dist/esm/cli/commands/daemon.js +132 -0
  12. package/dist/esm/cli/commands/daemon.js.map +1 -0
  13. package/dist/esm/cli/commands/github-api.js +36 -0
  14. package/dist/esm/cli/commands/github-api.js.map +1 -0
  15. package/dist/esm/cli/commands/init.js +69 -0
  16. package/dist/esm/cli/commands/init.js.map +1 -0
  17. package/dist/esm/cli/commands/issue.js +293 -0
  18. package/dist/esm/cli/commands/issue.js.map +1 -0
  19. package/dist/esm/cli/commands/log.js +90 -0
  20. package/dist/esm/cli/commands/log.js.map +1 -0
  21. package/dist/esm/cli/commands/migrate.js +444 -0
  22. package/dist/esm/cli/commands/migrate.js.map +1 -0
  23. package/dist/esm/cli/commands/notification.js +141 -0
  24. package/dist/esm/cli/commands/notification.js.map +1 -0
  25. package/dist/esm/cli/commands/org.js +353 -0
  26. package/dist/esm/cli/commands/org.js.map +1 -0
  27. package/dist/esm/cli/commands/patch.js +375 -0
  28. package/dist/esm/cli/commands/patch.js.map +1 -0
  29. package/dist/esm/cli/commands/registry.js +501 -0
  30. package/dist/esm/cli/commands/registry.js.map +1 -0
  31. package/dist/esm/cli/commands/release.js +197 -0
  32. package/dist/esm/cli/commands/release.js.map +1 -0
  33. package/dist/esm/cli/commands/repo.js +148 -0
  34. package/dist/esm/cli/commands/repo.js.map +1 -0
  35. package/dist/esm/cli/commands/serve.js +148 -0
  36. package/dist/esm/cli/commands/serve.js.map +1 -0
  37. package/dist/esm/cli/commands/setup.js +92 -0
  38. package/dist/esm/cli/commands/setup.js.map +1 -0
  39. package/dist/esm/cli/commands/shim.js +75 -0
  40. package/dist/esm/cli/commands/shim.js.map +1 -0
  41. package/dist/esm/cli/commands/social.js +206 -0
  42. package/dist/esm/cli/commands/social.js.map +1 -0
  43. package/dist/esm/cli/commands/web.js +36 -0
  44. package/dist/esm/cli/commands/web.js.map +1 -0
  45. package/dist/esm/cli/commands/wiki.js +185 -0
  46. package/dist/esm/cli/commands/wiki.js.map +1 -0
  47. package/dist/esm/cli/flags.js +29 -0
  48. package/dist/esm/cli/flags.js.map +1 -0
  49. package/dist/esm/cli/main.js +331 -0
  50. package/dist/esm/cli/main.js.map +1 -0
  51. package/dist/esm/cli/repo-context.js +53 -0
  52. package/dist/esm/cli/repo-context.js.map +1 -0
  53. package/dist/esm/daemon/adapter.js +18 -0
  54. package/dist/esm/daemon/adapter.js.map +1 -0
  55. package/dist/esm/daemon/adapters/github.js +112 -0
  56. package/dist/esm/daemon/adapters/github.js.map +1 -0
  57. package/dist/esm/daemon/adapters/go.js +51 -0
  58. package/dist/esm/daemon/adapters/go.js.map +1 -0
  59. package/dist/esm/daemon/adapters/index.js +32 -0
  60. package/dist/esm/daemon/adapters/index.js.map +1 -0
  61. package/dist/esm/daemon/adapters/npm.js +51 -0
  62. package/dist/esm/daemon/adapters/npm.js.map +1 -0
  63. package/dist/esm/daemon/adapters/oci.js +62 -0
  64. package/dist/esm/daemon/adapters/oci.js.map +1 -0
  65. package/dist/esm/daemon/index.js +12 -0
  66. package/dist/esm/daemon/index.js.map +1 -0
  67. package/dist/esm/daemon/server.js +167 -0
  68. package/dist/esm/daemon/server.js.map +1 -0
  69. package/dist/esm/git-remote/credential-helper.js +106 -0
  70. package/dist/esm/git-remote/credential-helper.js.map +1 -0
  71. package/dist/esm/git-remote/credential-main.js +109 -0
  72. package/dist/esm/git-remote/credential-main.js.map +1 -0
  73. package/dist/esm/git-remote/index.js +10 -0
  74. package/dist/esm/git-remote/index.js.map +1 -0
  75. package/dist/esm/git-remote/main.js +78 -0
  76. package/dist/esm/git-remote/main.js.map +1 -0
  77. package/dist/esm/git-remote/parse-url.js +60 -0
  78. package/dist/esm/git-remote/parse-url.js.map +1 -0
  79. package/dist/esm/git-remote/resolve.js +175 -0
  80. package/dist/esm/git-remote/resolve.js.map +1 -0
  81. package/dist/esm/git-remote/service.js +82 -0
  82. package/dist/esm/git-remote/service.js.map +1 -0
  83. package/dist/esm/git-server/auth.js +211 -0
  84. package/dist/esm/git-server/auth.js.map +1 -0
  85. package/dist/esm/git-server/bundle-restore.js +180 -0
  86. package/dist/esm/git-server/bundle-restore.js.map +1 -0
  87. package/dist/esm/git-server/bundle-sync.js +233 -0
  88. package/dist/esm/git-server/bundle-sync.js.map +1 -0
  89. package/dist/esm/git-server/did-service.js +73 -0
  90. package/dist/esm/git-server/did-service.js.map +1 -0
  91. package/dist/esm/git-server/git-backend.js +186 -0
  92. package/dist/esm/git-server/git-backend.js.map +1 -0
  93. package/dist/esm/git-server/http-handler.js +295 -0
  94. package/dist/esm/git-server/http-handler.js.map +1 -0
  95. package/dist/esm/git-server/index.js +16 -0
  96. package/dist/esm/git-server/index.js.map +1 -0
  97. package/dist/esm/git-server/push-authorizer.js +62 -0
  98. package/dist/esm/git-server/push-authorizer.js.map +1 -0
  99. package/dist/esm/git-server/ref-sync.js +132 -0
  100. package/dist/esm/git-server/ref-sync.js.map +1 -0
  101. package/dist/esm/git-server/server.js +185 -0
  102. package/dist/esm/git-server/server.js.map +1 -0
  103. package/dist/esm/git-server/verify.js +109 -0
  104. package/dist/esm/git-server/verify.js.map +1 -0
  105. package/dist/esm/github-shim/helpers.js +273 -0
  106. package/dist/esm/github-shim/helpers.js.map +1 -0
  107. package/dist/esm/github-shim/index.js +13 -0
  108. package/dist/esm/github-shim/index.js.map +1 -0
  109. package/dist/esm/github-shim/issues.js +318 -0
  110. package/dist/esm/github-shim/issues.js.map +1 -0
  111. package/dist/esm/github-shim/pulls.js +423 -0
  112. package/dist/esm/github-shim/pulls.js.map +1 -0
  113. package/dist/esm/github-shim/releases.js +154 -0
  114. package/dist/esm/github-shim/releases.js.map +1 -0
  115. package/dist/esm/github-shim/repos.js +86 -0
  116. package/dist/esm/github-shim/repos.js.map +1 -0
  117. package/dist/esm/github-shim/server.js +351 -0
  118. package/dist/esm/github-shim/server.js.map +1 -0
  119. package/dist/esm/github-shim/users.js +61 -0
  120. package/dist/esm/github-shim/users.js.map +1 -0
  121. package/dist/esm/index.js +26 -0
  122. package/dist/esm/index.js.map +1 -0
  123. package/dist/esm/indexer/api.js +132 -0
  124. package/dist/esm/indexer/api.js.map +1 -0
  125. package/dist/esm/indexer/crawler.js +256 -0
  126. package/dist/esm/indexer/crawler.js.map +1 -0
  127. package/dist/esm/indexer/index.js +9 -0
  128. package/dist/esm/indexer/index.js.map +1 -0
  129. package/dist/esm/indexer/main.js +76 -0
  130. package/dist/esm/indexer/main.js.map +1 -0
  131. package/dist/esm/indexer/store.js +334 -0
  132. package/dist/esm/indexer/store.js.map +1 -0
  133. package/dist/esm/issues.js +133 -0
  134. package/dist/esm/issues.js.map +1 -0
  135. package/dist/esm/notifications.js +47 -0
  136. package/dist/esm/notifications.js.map +1 -0
  137. package/dist/esm/org.js +90 -0
  138. package/dist/esm/org.js.map +1 -0
  139. package/dist/esm/patches.js +136 -0
  140. package/dist/esm/patches.js.map +1 -0
  141. package/dist/esm/refs.js +54 -0
  142. package/dist/esm/refs.js.map +1 -0
  143. package/dist/esm/registry.js +81 -0
  144. package/dist/esm/registry.js.map +1 -0
  145. package/dist/esm/releases.js +78 -0
  146. package/dist/esm/releases.js.map +1 -0
  147. package/dist/esm/repo.js +150 -0
  148. package/dist/esm/repo.js.map +1 -0
  149. package/dist/esm/resolver/index.js +10 -0
  150. package/dist/esm/resolver/index.js.map +1 -0
  151. package/dist/esm/resolver/resolve.js +189 -0
  152. package/dist/esm/resolver/resolve.js.map +1 -0
  153. package/dist/esm/resolver/trust-chain.js +155 -0
  154. package/dist/esm/resolver/trust-chain.js.map +1 -0
  155. package/dist/esm/resolver/verify.js +186 -0
  156. package/dist/esm/resolver/verify.js.map +1 -0
  157. package/dist/esm/shims/go/index.js +9 -0
  158. package/dist/esm/shims/go/index.js.map +1 -0
  159. package/dist/esm/shims/go/proxy.js +275 -0
  160. package/dist/esm/shims/go/proxy.js.map +1 -0
  161. package/dist/esm/shims/go/server.js +70 -0
  162. package/dist/esm/shims/go/server.js.map +1 -0
  163. package/dist/esm/shims/index.js +15 -0
  164. package/dist/esm/shims/index.js.map +1 -0
  165. package/dist/esm/shims/npm/index.js +9 -0
  166. package/dist/esm/shims/npm/index.js.map +1 -0
  167. package/dist/esm/shims/npm/registry.js +234 -0
  168. package/dist/esm/shims/npm/registry.js.map +1 -0
  169. package/dist/esm/shims/npm/server.js +72 -0
  170. package/dist/esm/shims/npm/server.js.map +1 -0
  171. package/dist/esm/shims/oci/index.js +9 -0
  172. package/dist/esm/shims/oci/index.js.map +1 -0
  173. package/dist/esm/shims/oci/registry.js +276 -0
  174. package/dist/esm/shims/oci/registry.js.map +1 -0
  175. package/dist/esm/shims/oci/server.js +82 -0
  176. package/dist/esm/shims/oci/server.js.map +1 -0
  177. package/dist/esm/social.js +70 -0
  178. package/dist/esm/social.js.map +1 -0
  179. package/dist/esm/web/html.js +123 -0
  180. package/dist/esm/web/html.js.map +1 -0
  181. package/dist/esm/web/index.js +7 -0
  182. package/dist/esm/web/index.js.map +1 -0
  183. package/dist/esm/web/routes.js +420 -0
  184. package/dist/esm/web/routes.js.map +1 -0
  185. package/dist/esm/web/server.js +225 -0
  186. package/dist/esm/web/server.js.map +1 -0
  187. package/dist/esm/wiki.js +63 -0
  188. package/dist/esm/wiki.js.map +1 -0
  189. package/dist/types/ci.d.ts +203 -0
  190. package/dist/types/ci.d.ts.map +1 -0
  191. package/dist/types/cli/agent.d.ts +59 -0
  192. package/dist/types/cli/agent.d.ts.map +1 -0
  193. package/dist/types/cli/commands/ci.d.ts +16 -0
  194. package/dist/types/cli/commands/ci.d.ts.map +1 -0
  195. package/dist/types/cli/commands/clone.d.ts +13 -0
  196. package/dist/types/cli/commands/clone.d.ts.map +1 -0
  197. package/dist/types/cli/commands/daemon.d.ts +29 -0
  198. package/dist/types/cli/commands/daemon.d.ts.map +1 -0
  199. package/dist/types/cli/commands/github-api.d.ts +14 -0
  200. package/dist/types/cli/commands/github-api.d.ts.map +1 -0
  201. package/dist/types/cli/commands/init.d.ts +11 -0
  202. package/dist/types/cli/commands/init.d.ts.map +1 -0
  203. package/dist/types/cli/commands/issue.d.ts +16 -0
  204. package/dist/types/cli/commands/issue.d.ts.map +1 -0
  205. package/dist/types/cli/commands/log.d.ts +13 -0
  206. package/dist/types/cli/commands/log.d.ts.map +1 -0
  207. package/dist/types/cli/commands/migrate.d.ts +19 -0
  208. package/dist/types/cli/commands/migrate.d.ts.map +1 -0
  209. package/dist/types/cli/commands/notification.d.ts +16 -0
  210. package/dist/types/cli/commands/notification.d.ts.map +1 -0
  211. package/dist/types/cli/commands/org.d.ts +19 -0
  212. package/dist/types/cli/commands/org.d.ts.map +1 -0
  213. package/dist/types/cli/commands/patch.d.ts +17 -0
  214. package/dist/types/cli/commands/patch.d.ts.map +1 -0
  215. package/dist/types/cli/commands/registry.d.ts +25 -0
  216. package/dist/types/cli/commands/registry.d.ts.map +1 -0
  217. package/dist/types/cli/commands/release.d.ts +13 -0
  218. package/dist/types/cli/commands/release.d.ts.map +1 -0
  219. package/dist/types/cli/commands/repo.d.ts +15 -0
  220. package/dist/types/cli/commands/repo.d.ts.map +1 -0
  221. package/dist/types/cli/commands/serve.d.ts +22 -0
  222. package/dist/types/cli/commands/serve.d.ts.map +1 -0
  223. package/dist/types/cli/commands/setup.d.ts +16 -0
  224. package/dist/types/cli/commands/setup.d.ts.map +1 -0
  225. package/dist/types/cli/commands/shim.d.ts +16 -0
  226. package/dist/types/cli/commands/shim.d.ts.map +1 -0
  227. package/dist/types/cli/commands/social.d.ts +19 -0
  228. package/dist/types/cli/commands/social.d.ts.map +1 -0
  229. package/dist/types/cli/commands/web.d.ts +14 -0
  230. package/dist/types/cli/commands/web.d.ts.map +1 -0
  231. package/dist/types/cli/commands/wiki.d.ts +14 -0
  232. package/dist/types/cli/commands/wiki.d.ts.map +1 -0
  233. package/dist/types/cli/flags.d.ts +16 -0
  234. package/dist/types/cli/flags.d.ts.map +1 -0
  235. package/dist/types/cli/main.d.ts +69 -0
  236. package/dist/types/cli/main.d.ts.map +1 -0
  237. package/dist/types/cli/repo-context.d.ts +30 -0
  238. package/dist/types/cli/repo-context.d.ts.map +1 -0
  239. package/dist/types/daemon/adapter.d.ts +74 -0
  240. package/dist/types/daemon/adapter.d.ts.map +1 -0
  241. package/dist/types/daemon/adapters/github.d.ts +10 -0
  242. package/dist/types/daemon/adapters/github.d.ts.map +1 -0
  243. package/dist/types/daemon/adapters/go.d.ts +10 -0
  244. package/dist/types/daemon/adapters/go.d.ts.map +1 -0
  245. package/dist/types/daemon/adapters/index.d.ts +22 -0
  246. package/dist/types/daemon/adapters/index.d.ts.map +1 -0
  247. package/dist/types/daemon/adapters/npm.d.ts +10 -0
  248. package/dist/types/daemon/adapters/npm.d.ts.map +1 -0
  249. package/dist/types/daemon/adapters/oci.d.ts +10 -0
  250. package/dist/types/daemon/adapters/oci.d.ts.map +1 -0
  251. package/dist/types/daemon/index.d.ts +14 -0
  252. package/dist/types/daemon/index.d.ts.map +1 -0
  253. package/dist/types/daemon/server.d.ts +55 -0
  254. package/dist/types/daemon/server.d.ts.map +1 -0
  255. package/dist/types/git-remote/credential-helper.d.ts +49 -0
  256. package/dist/types/git-remote/credential-helper.d.ts.map +1 -0
  257. package/dist/types/git-remote/credential-main.d.ts +24 -0
  258. package/dist/types/git-remote/credential-main.d.ts.map +1 -0
  259. package/dist/types/git-remote/index.d.ts +10 -0
  260. package/dist/types/git-remote/index.d.ts.map +1 -0
  261. package/dist/types/git-remote/main.d.ts +23 -0
  262. package/dist/types/git-remote/main.d.ts.map +1 -0
  263. package/dist/types/git-remote/parse-url.d.ts +32 -0
  264. package/dist/types/git-remote/parse-url.d.ts.map +1 -0
  265. package/dist/types/git-remote/resolve.d.ts +30 -0
  266. package/dist/types/git-remote/resolve.d.ts.map +1 -0
  267. package/dist/types/git-remote/service.d.ts +75 -0
  268. package/dist/types/git-remote/service.d.ts.map +1 -0
  269. package/dist/types/git-server/auth.d.ts +129 -0
  270. package/dist/types/git-server/auth.d.ts.map +1 -0
  271. package/dist/types/git-server/bundle-restore.d.ts +48 -0
  272. package/dist/types/git-server/bundle-restore.d.ts.map +1 -0
  273. package/dist/types/git-server/bundle-sync.d.ts +90 -0
  274. package/dist/types/git-server/bundle-sync.d.ts.map +1 -0
  275. package/dist/types/git-server/did-service.d.ts +26 -0
  276. package/dist/types/git-server/did-service.d.ts.map +1 -0
  277. package/dist/types/git-server/git-backend.d.ts +84 -0
  278. package/dist/types/git-server/git-backend.d.ts.map +1 -0
  279. package/dist/types/git-server/http-handler.d.ts +73 -0
  280. package/dist/types/git-server/http-handler.d.ts.map +1 -0
  281. package/dist/types/git-server/index.d.ts +16 -0
  282. package/dist/types/git-server/index.d.ts.map +1 -0
  283. package/dist/types/git-server/push-authorizer.d.ts +38 -0
  284. package/dist/types/git-server/push-authorizer.d.ts.map +1 -0
  285. package/dist/types/git-server/ref-sync.d.ts +52 -0
  286. package/dist/types/git-server/ref-sync.d.ts.map +1 -0
  287. package/dist/types/git-server/server.d.ts +70 -0
  288. package/dist/types/git-server/server.d.ts.map +1 -0
  289. package/dist/types/git-server/verify.d.ts +12 -0
  290. package/dist/types/git-server/verify.d.ts.map +1 -0
  291. package/dist/types/github-shim/helpers.d.ts +108 -0
  292. package/dist/types/github-shim/helpers.d.ts.map +1 -0
  293. package/dist/types/github-shim/index.d.ts +15 -0
  294. package/dist/types/github-shim/index.d.ts.map +1 -0
  295. package/dist/types/github-shim/issues.d.ts +24 -0
  296. package/dist/types/github-shim/issues.d.ts.map +1 -0
  297. package/dist/types/github-shim/pulls.d.ts +31 -0
  298. package/dist/types/github-shim/pulls.d.ts.map +1 -0
  299. package/dist/types/github-shim/releases.d.ts +18 -0
  300. package/dist/types/github-shim/releases.d.ts.map +1 -0
  301. package/dist/types/github-shim/repos.d.ts +21 -0
  302. package/dist/types/github-shim/repos.d.ts.map +1 -0
  303. package/dist/types/github-shim/server.d.ts +53 -0
  304. package/dist/types/github-shim/server.d.ts.map +1 -0
  305. package/dist/types/github-shim/users.d.ts +17 -0
  306. package/dist/types/github-shim/users.d.ts.map +1 -0
  307. package/dist/types/index.d.ts +26 -0
  308. package/dist/types/index.d.ts.map +1 -0
  309. package/dist/types/indexer/api.d.ts +32 -0
  310. package/dist/types/indexer/api.d.ts.map +1 -0
  311. package/dist/types/indexer/crawler.d.ts +72 -0
  312. package/dist/types/indexer/crawler.d.ts.map +1 -0
  313. package/dist/types/indexer/index.d.ts +12 -0
  314. package/dist/types/indexer/index.d.ts.map +1 -0
  315. package/dist/types/indexer/main.d.ts +21 -0
  316. package/dist/types/indexer/main.d.ts.map +1 -0
  317. package/dist/types/indexer/store.d.ts +168 -0
  318. package/dist/types/indexer/store.d.ts.map +1 -0
  319. package/dist/types/issues.d.ts +395 -0
  320. package/dist/types/issues.d.ts.map +1 -0
  321. package/dist/types/notifications.d.ts +93 -0
  322. package/dist/types/notifications.d.ts.map +1 -0
  323. package/dist/types/org.d.ts +232 -0
  324. package/dist/types/org.d.ts.map +1 -0
  325. package/dist/types/patches.d.ts +410 -0
  326. package/dist/types/patches.d.ts.map +1 -0
  327. package/dist/types/refs.d.ts +114 -0
  328. package/dist/types/refs.d.ts.map +1 -0
  329. package/dist/types/registry.d.ts +212 -0
  330. package/dist/types/registry.d.ts.map +1 -0
  331. package/dist/types/releases.d.ts +204 -0
  332. package/dist/types/releases.d.ts.map +1 -0
  333. package/dist/types/repo.d.ts +450 -0
  334. package/dist/types/repo.d.ts.map +1 -0
  335. package/dist/types/resolver/index.d.ts +13 -0
  336. package/dist/types/resolver/index.d.ts.map +1 -0
  337. package/dist/types/resolver/resolve.d.ts +80 -0
  338. package/dist/types/resolver/resolve.d.ts.map +1 -0
  339. package/dist/types/resolver/trust-chain.d.ts +54 -0
  340. package/dist/types/resolver/trust-chain.d.ts.map +1 -0
  341. package/dist/types/resolver/verify.d.ts +62 -0
  342. package/dist/types/resolver/verify.d.ts.map +1 -0
  343. package/dist/types/shims/go/index.d.ts +11 -0
  344. package/dist/types/shims/go/index.d.ts.map +1 -0
  345. package/dist/types/shims/go/proxy.d.ts +51 -0
  346. package/dist/types/shims/go/proxy.d.ts.map +1 -0
  347. package/dist/types/shims/go/server.d.ts +23 -0
  348. package/dist/types/shims/go/server.d.ts.map +1 -0
  349. package/dist/types/shims/index.d.ts +18 -0
  350. package/dist/types/shims/index.d.ts.map +1 -0
  351. package/dist/types/shims/npm/index.d.ts +11 -0
  352. package/dist/types/shims/npm/index.d.ts.map +1 -0
  353. package/dist/types/shims/npm/registry.d.ts +46 -0
  354. package/dist/types/shims/npm/registry.d.ts.map +1 -0
  355. package/dist/types/shims/npm/server.d.ts +23 -0
  356. package/dist/types/shims/npm/server.d.ts.map +1 -0
  357. package/dist/types/shims/oci/index.d.ts +11 -0
  358. package/dist/types/shims/oci/index.d.ts.map +1 -0
  359. package/dist/types/shims/oci/registry.d.ts +56 -0
  360. package/dist/types/shims/oci/registry.d.ts.map +1 -0
  361. package/dist/types/shims/oci/server.d.ts +23 -0
  362. package/dist/types/shims/oci/server.d.ts.map +1 -0
  363. package/dist/types/social.d.ts +162 -0
  364. package/dist/types/social.d.ts.map +1 -0
  365. package/dist/types/web/html.d.ts +23 -0
  366. package/dist/types/web/html.d.ts.map +1 -0
  367. package/dist/types/web/index.d.ts +8 -0
  368. package/dist/types/web/index.d.ts.map +1 -0
  369. package/dist/types/web/routes.d.ts +21 -0
  370. package/dist/types/web/routes.d.ts.map +1 -0
  371. package/dist/types/web/server.d.ts +38 -0
  372. package/dist/types/web/server.d.ts.map +1 -0
  373. package/dist/types/wiki.d.ts +143 -0
  374. package/dist/types/wiki.d.ts.map +1 -0
  375. package/package.json +108 -0
  376. package/schemas/ci/check-run.json +23 -0
  377. package/schemas/ci/check-suite.json +23 -0
  378. package/schemas/issues/assignment.json +17 -0
  379. package/schemas/issues/comment.json +14 -0
  380. package/schemas/issues/issue.json +20 -0
  381. package/schemas/issues/label.json +17 -0
  382. package/schemas/issues/reaction.json +14 -0
  383. package/schemas/issues/status-change.json +14 -0
  384. package/schemas/notifications/notification.json +20 -0
  385. package/schemas/org/org-member.json +17 -0
  386. package/schemas/org/org.json +26 -0
  387. package/schemas/org/team-member.json +17 -0
  388. package/schemas/org/team.json +17 -0
  389. package/schemas/patches/merge-result.json +14 -0
  390. package/schemas/patches/patch-status-change.json +14 -0
  391. package/schemas/patches/patch.json +20 -0
  392. package/schemas/patches/review-comment.json +17 -0
  393. package/schemas/patches/review.json +14 -0
  394. package/schemas/patches/revision.json +30 -0
  395. package/schemas/refs/git-ref.json +32 -0
  396. package/schemas/registry/attestation.json +23 -0
  397. package/schemas/registry/package-version.json +23 -0
  398. package/schemas/registry/package.json +32 -0
  399. package/schemas/releases/release.json +17 -0
  400. package/schemas/repo/collaborator.json +17 -0
  401. package/schemas/repo/repo.json +35 -0
  402. package/schemas/repo/settings.json +39 -0
  403. package/schemas/repo/topic.json +14 -0
  404. package/schemas/repo/webhook.json +26 -0
  405. package/schemas/social/activity.json +23 -0
  406. package/schemas/social/follow.json +17 -0
  407. package/schemas/social/star.json +20 -0
  408. package/schemas/wiki/wiki-history.json +20 -0
  409. package/schemas/wiki/wiki-page.json +17 -0
  410. package/src/ci.ts +118 -0
  411. package/src/cli/agent.ts +117 -0
  412. package/src/cli/commands/ci.ts +300 -0
  413. package/src/cli/commands/clone.ts +78 -0
  414. package/src/cli/commands/daemon.ts +129 -0
  415. package/src/cli/commands/github-api.ts +30 -0
  416. package/src/cli/commands/init.ts +69 -0
  417. package/src/cli/commands/issue.ts +321 -0
  418. package/src/cli/commands/log.ts +106 -0
  419. package/src/cli/commands/migrate.ts +525 -0
  420. package/src/cli/commands/notification.ts +148 -0
  421. package/src/cli/commands/org.ts +381 -0
  422. package/src/cli/commands/patch.ts +413 -0
  423. package/src/cli/commands/registry.ts +542 -0
  424. package/src/cli/commands/release.ts +189 -0
  425. package/src/cli/commands/repo.ts +160 -0
  426. package/src/cli/commands/serve.ts +153 -0
  427. package/src/cli/commands/setup.ts +97 -0
  428. package/src/cli/commands/shim.ts +79 -0
  429. package/src/cli/commands/social.ts +221 -0
  430. package/src/cli/commands/web.ts +30 -0
  431. package/src/cli/commands/wiki.ts +199 -0
  432. package/src/cli/flags.ts +28 -0
  433. package/src/cli/main.ts +350 -0
  434. package/src/cli/repo-context.ts +55 -0
  435. package/src/daemon/adapter.ts +95 -0
  436. package/src/daemon/adapters/github.ts +86 -0
  437. package/src/daemon/adapters/go.ts +47 -0
  438. package/src/daemon/adapters/index.ts +36 -0
  439. package/src/daemon/adapters/npm.ts +47 -0
  440. package/src/daemon/adapters/oci.ts +59 -0
  441. package/src/daemon/index.ts +16 -0
  442. package/src/daemon/server.ts +204 -0
  443. package/src/git-remote/credential-helper.ts +114 -0
  444. package/src/git-remote/credential-main.ts +118 -0
  445. package/src/git-remote/index.ts +10 -0
  446. package/src/git-remote/main.ts +74 -0
  447. package/src/git-remote/parse-url.ts +81 -0
  448. package/src/git-remote/resolve.ts +207 -0
  449. package/src/git-remote/service.ts +126 -0
  450. package/src/git-server/auth.ts +308 -0
  451. package/src/git-server/bundle-restore.ts +217 -0
  452. package/src/git-server/bundle-sync.ts +300 -0
  453. package/src/git-server/did-service.ts +77 -0
  454. package/src/git-server/git-backend.ts +222 -0
  455. package/src/git-server/http-handler.ts +386 -0
  456. package/src/git-server/index.ts +16 -0
  457. package/src/git-server/push-authorizer.ts +77 -0
  458. package/src/git-server/ref-sync.ts +166 -0
  459. package/src/git-server/server.ts +236 -0
  460. package/src/git-server/verify.ts +116 -0
  461. package/src/github-shim/helpers.ts +311 -0
  462. package/src/github-shim/index.ts +35 -0
  463. package/src/github-shim/issues.ts +389 -0
  464. package/src/github-shim/pulls.ts +500 -0
  465. package/src/github-shim/releases.ts +185 -0
  466. package/src/github-shim/repos.ts +95 -0
  467. package/src/github-shim/server.ts +334 -0
  468. package/src/github-shim/users.ts +63 -0
  469. package/src/index.ts +26 -0
  470. package/src/indexer/api.ts +162 -0
  471. package/src/indexer/crawler.ts +290 -0
  472. package/src/indexer/index.ts +22 -0
  473. package/src/indexer/main.ts +83 -0
  474. package/src/indexer/store.ts +408 -0
  475. package/src/issues.ts +200 -0
  476. package/src/notifications.ts +80 -0
  477. package/src/org.ts +147 -0
  478. package/src/patches.ts +203 -0
  479. package/src/refs.ts +94 -0
  480. package/src/registry.ts +132 -0
  481. package/src/releases.ts +124 -0
  482. package/src/repo.ts +234 -0
  483. package/src/resolver/index.ts +42 -0
  484. package/src/resolver/resolve.ts +244 -0
  485. package/src/resolver/trust-chain.ts +217 -0
  486. package/src/resolver/verify.ts +237 -0
  487. package/src/shims/go/index.ts +14 -0
  488. package/src/shims/go/proxy.ts +336 -0
  489. package/src/shims/go/server.ts +82 -0
  490. package/src/shims/index.ts +20 -0
  491. package/src/shims/npm/index.ts +14 -0
  492. package/src/shims/npm/registry.ts +288 -0
  493. package/src/shims/npm/server.ts +84 -0
  494. package/src/shims/oci/index.ts +14 -0
  495. package/src/shims/oci/registry.ts +334 -0
  496. package/src/shims/oci/server.ts +94 -0
  497. package/src/social.ts +116 -0
  498. package/src/web/html.ts +120 -0
  499. package/src/web/index.ts +8 -0
  500. package/src/web/routes.ts +449 -0
  501. package/src/web/server.ts +256 -0
  502. package/src/wiki.ts +102 -0
@@ -0,0 +1,500 @@
1
+ /**
2
+ * GitHub API shim — `/repos/:did/:repo/pulls` endpoints.
3
+ *
4
+ * Maps DWN patch records to GitHub REST API v3 pull request responses.
5
+ *
6
+ * Endpoints:
7
+ * GET /repos/:did/:repo/pulls List pull requests
8
+ * GET /repos/:did/:repo/pulls/:number Pull request detail
9
+ * GET /repos/:did/:repo/pulls/:number/reviews Pull request reviews
10
+ * POST /repos/:did/:repo/pulls Create pull request
11
+ * PATCH /repos/:did/:repo/pulls/:number Update pull request
12
+ * PUT /repos/:did/:repo/pulls/:number/merge Merge pull request
13
+ * POST /repos/:did/:repo/pulls/:number/reviews Create review
14
+ *
15
+ * Status mapping:
16
+ * - `open` -> state: "open"
17
+ * - `closed` -> state: "closed", merged: false
18
+ * - `merged` -> state: "closed", merged: true
19
+ *
20
+ * @module
21
+ */
22
+
23
+ import type { AgentContext } from '../cli/agent.js';
24
+ import type { JsonResponse } from './helpers.js';
25
+
26
+ import { DateSort } from '@enbox/dwn-sdk-js';
27
+
28
+ import {
29
+ buildApiUrl,
30
+ buildLinkHeader,
31
+ buildOwner,
32
+ fromOpt,
33
+ getNextPatchNumber,
34
+ getRepoRecord,
35
+ jsonCreated,
36
+ jsonMethodNotAllowed,
37
+ jsonNotFound,
38
+ jsonOk,
39
+ jsonValidationError,
40
+ numericId,
41
+ paginate,
42
+ parsePagination,
43
+ toISODate,
44
+ } from './helpers.js';
45
+
46
+ // ---------------------------------------------------------------------------
47
+ // Verdict -> GitHub review state mapping
48
+ // ---------------------------------------------------------------------------
49
+
50
+ const VERDICT_MAP: Record<string, string> = {
51
+ approve : 'APPROVED',
52
+ reject : 'CHANGES_REQUESTED',
53
+ comment : 'COMMENTED',
54
+ };
55
+
56
+ // ---------------------------------------------------------------------------
57
+ // Pull request object builder
58
+ // ---------------------------------------------------------------------------
59
+
60
+ function buildPullResponse(
61
+ rec: any, data: any, tags: Record<string, string>,
62
+ targetDid: string, repoName: string, baseUrl: string,
63
+ ): Record<string, unknown> {
64
+ const owner = buildOwner(targetDid, baseUrl);
65
+ const number = parseInt(tags.number ?? data.number ?? '0', 10);
66
+ const dwnStatus = tags.status ?? 'open';
67
+ const merged = dwnStatus === 'merged';
68
+ const state = dwnStatus === 'open' ? 'open' : 'closed';
69
+ const baseBranch = tags.baseBranch ?? 'main';
70
+ const headBranch = tags.headBranch ?? '';
71
+
72
+ return {
73
+ id : numericId(rec.id ?? ''),
74
+ node_id : rec.id ?? '',
75
+ url : `${baseUrl}/repos/${targetDid}/${repoName}/pulls/${number}`,
76
+ html_url : `${baseUrl}/repos/${targetDid}/${repoName}/pulls/${number}`,
77
+ diff_url : `${baseUrl}/repos/${targetDid}/${repoName}/pulls/${number}.diff`,
78
+ patch_url : `${baseUrl}/repos/${targetDid}/${repoName}/pulls/${number}.patch`,
79
+ issue_url : `${baseUrl}/repos/${targetDid}/${repoName}/issues/${number}`,
80
+ commits_url : `${baseUrl}/repos/${targetDid}/${repoName}/pulls/${number}/commits`,
81
+ review_comments_url : `${baseUrl}/repos/${targetDid}/${repoName}/pulls/${number}/comments`,
82
+ comments_url : `${baseUrl}/repos/${targetDid}/${repoName}/issues/${number}/comments`,
83
+ number,
84
+ title : data.title ?? '',
85
+ body : data.body ?? null,
86
+ state,
87
+ locked : false,
88
+ merged,
89
+ mergeable : state === 'open' ? true : null,
90
+ merge_commit_sha : merged ? '0000000000000000000000000000000000000000' : null,
91
+ merged_at : merged ? toISODate(rec.timestamp) : null,
92
+ merged_by : merged ? owner : null,
93
+ created_at : toISODate(rec.dateCreated),
94
+ updated_at : toISODate(rec.timestamp),
95
+ closed_at : state === 'closed' ? toISODate(rec.timestamp) : null,
96
+ user : owner,
97
+ author_association : 'OWNER',
98
+ draft : false,
99
+ head : {
100
+ label : `${targetDid}:${headBranch}`,
101
+ ref : headBranch,
102
+ sha : '',
103
+ },
104
+ base: {
105
+ label : `${targetDid}:${baseBranch}`,
106
+ ref : baseBranch,
107
+ sha : '',
108
+ },
109
+ labels : [],
110
+ assignees : [],
111
+ milestone : null,
112
+ requested_reviewers : [],
113
+ commits : 0,
114
+ additions : 0,
115
+ deletions : 0,
116
+ changed_files : 0,
117
+ };
118
+ }
119
+
120
+ // ---------------------------------------------------------------------------
121
+ // GET /repos/:did/:repo/pulls
122
+ // ---------------------------------------------------------------------------
123
+
124
+ export async function handleListPulls(
125
+ ctx: AgentContext, targetDid: string, repoName: string, url: URL,
126
+ ): Promise<JsonResponse> {
127
+ const repo = await getRepoRecord(ctx, targetDid);
128
+ if (!repo) {
129
+ return jsonNotFound(`Repository '${repoName}' not found for DID '${targetDid}'.`);
130
+ }
131
+
132
+ const from = fromOpt(ctx, targetDid);
133
+ const baseUrl = buildApiUrl(url);
134
+
135
+ const stateFilter = url.searchParams.get('state') ?? 'open';
136
+ const direction = url.searchParams.get('direction') ?? 'desc';
137
+ const pagination = parsePagination(url);
138
+
139
+ const dateSort = direction === 'asc'
140
+ ? DateSort.CreatedAscending
141
+ : DateSort.CreatedDescending;
142
+
143
+ const { records } = await ctx.patches.records.query('repo/patch', {
144
+ from,
145
+ filter: { contextId: repo.contextId },
146
+ dateSort,
147
+ });
148
+
149
+ // Filter by state — GitHub treats `closed` as "closed or merged".
150
+ let filtered = records;
151
+ if (stateFilter !== 'all') {
152
+ filtered = records.filter((r) => {
153
+ const t = r.tags as Record<string, string> | undefined;
154
+ const s = t?.status ?? 'open';
155
+ if (stateFilter === 'open') { return s === 'open'; }
156
+ // 'closed' includes both closed and merged.
157
+ return s === 'closed' || s === 'merged';
158
+ });
159
+ }
160
+
161
+ const page = paginate(filtered, pagination);
162
+
163
+ const items: Record<string, unknown>[] = [];
164
+ for (const rec of page) {
165
+ const data = await rec.data.json();
166
+ const tags = (rec.tags as Record<string, string> | undefined) ?? {};
167
+ items.push(buildPullResponse(rec, data, tags, targetDid, repoName, baseUrl));
168
+ }
169
+
170
+ const linkHeader = buildLinkHeader(
171
+ baseUrl, `/repos/${targetDid}/${repoName}/pulls`,
172
+ pagination.page, pagination.perPage, filtered.length,
173
+ );
174
+ const extraHeaders: Record<string, string> = {};
175
+ if (linkHeader) { extraHeaders['Link'] = linkHeader; }
176
+
177
+ return jsonOk(items, extraHeaders);
178
+ }
179
+
180
+ // ---------------------------------------------------------------------------
181
+ // GET /repos/:did/:repo/pulls/:number
182
+ // ---------------------------------------------------------------------------
183
+
184
+ export async function handleGetPull(
185
+ ctx: AgentContext, targetDid: string, repoName: string, number: string, url: URL,
186
+ ): Promise<JsonResponse> {
187
+ const repo = await getRepoRecord(ctx, targetDid);
188
+ if (!repo) {
189
+ return jsonNotFound(`Repository '${repoName}' not found for DID '${targetDid}'.`);
190
+ }
191
+
192
+ const from = fromOpt(ctx, targetDid);
193
+ const baseUrl = buildApiUrl(url);
194
+
195
+ const { records } = await ctx.patches.records.query('repo/patch', {
196
+ from,
197
+ filter: { contextId: repo.contextId, tags: { number } },
198
+ });
199
+
200
+ if (records.length === 0) {
201
+ return jsonNotFound(`Pull request #${number} not found.`);
202
+ }
203
+
204
+ const rec = records[0];
205
+ const data = await rec.data.json();
206
+ const tags = (rec.tags as Record<string, string> | undefined) ?? {};
207
+
208
+ return jsonOk(buildPullResponse(rec, data, tags, targetDid, repoName, baseUrl));
209
+ }
210
+
211
+ // ---------------------------------------------------------------------------
212
+ // GET /repos/:did/:repo/pulls/:number/reviews
213
+ // ---------------------------------------------------------------------------
214
+
215
+ export async function handleListPullReviews(
216
+ ctx: AgentContext, targetDid: string, repoName: string, number: string, url: URL,
217
+ ): Promise<JsonResponse> {
218
+ const repo = await getRepoRecord(ctx, targetDid);
219
+ if (!repo) {
220
+ return jsonNotFound(`Repository '${repoName}' not found for DID '${targetDid}'.`);
221
+ }
222
+
223
+ const from = fromOpt(ctx, targetDid);
224
+ const baseUrl = buildApiUrl(url);
225
+ const pagination = parsePagination(url);
226
+
227
+ // Find the patch first.
228
+ const { records: patches } = await ctx.patches.records.query('repo/patch', {
229
+ from,
230
+ filter: { contextId: repo.contextId, tags: { number } },
231
+ });
232
+
233
+ if (patches.length === 0) {
234
+ return jsonNotFound(`Pull request #${number} not found.`);
235
+ }
236
+
237
+ const patchRec = patches[0];
238
+ const owner = buildOwner(targetDid, baseUrl);
239
+
240
+ // Fetch reviews.
241
+ const { records: reviews } = await ctx.patches.records.query('repo/patch/review' as any, {
242
+ from,
243
+ filter : { contextId: patchRec.contextId },
244
+ dateSort : DateSort.CreatedAscending,
245
+ });
246
+
247
+ const paged = paginate(reviews, pagination);
248
+
249
+ const items: Record<string, unknown>[] = [];
250
+ for (const review of paged) {
251
+ const rData = await review.data.json();
252
+ const rTags = (review.tags as Record<string, string> | undefined) ?? {};
253
+ const verdict = rTags.verdict ?? 'comment';
254
+
255
+ items.push({
256
+ id : numericId(review.id ?? ''),
257
+ node_id : review.id ?? '',
258
+ user : owner,
259
+ body : rData.body ?? '',
260
+ state : VERDICT_MAP[verdict] ?? 'COMMENTED',
261
+ html_url : `${baseUrl}/repos/${targetDid}/${repoName}/pulls/${number}#pullrequestreview-${numericId(review.id ?? '')}`,
262
+ pull_request_url : `${baseUrl}/repos/${targetDid}/${repoName}/pulls/${number}`,
263
+ submitted_at : toISODate(review.dateCreated),
264
+ commit_id : '',
265
+ author_association : 'OWNER',
266
+ });
267
+ }
268
+
269
+ const linkHeader = buildLinkHeader(
270
+ baseUrl, `/repos/${targetDid}/${repoName}/pulls/${number}/reviews`,
271
+ pagination.page, pagination.perPage, reviews.length,
272
+ );
273
+ const extraHeaders: Record<string, string> = {};
274
+ if (linkHeader) { extraHeaders['Link'] = linkHeader; }
275
+
276
+ return jsonOk(items, extraHeaders);
277
+ }
278
+
279
+ // ---------------------------------------------------------------------------
280
+ // POST /repos/:did/:repo/pulls — create pull request
281
+ // ---------------------------------------------------------------------------
282
+
283
+ export async function handleCreatePull(
284
+ ctx: AgentContext, targetDid: string, repoName: string,
285
+ reqBody: Record<string, unknown>, url: URL,
286
+ ): Promise<JsonResponse> {
287
+ const repo = await getRepoRecord(ctx, targetDid);
288
+ if (!repo) {
289
+ return jsonNotFound(`Repository '${repoName}' not found for DID '${targetDid}'.`);
290
+ }
291
+
292
+ const title = reqBody.title as string | undefined;
293
+ if (!title) {
294
+ return jsonValidationError('Validation Failed: title is required.');
295
+ }
296
+
297
+ const body = (reqBody.body as string) ?? '';
298
+ const baseBranch = (reqBody.base as string) ?? 'main';
299
+ const headBranch = (reqBody.head as string) ?? '';
300
+ const baseUrl = buildApiUrl(url);
301
+ const number = await getNextPatchNumber(ctx, repo.contextId);
302
+
303
+ const tags: Record<string, string> = {
304
+ status : 'open',
305
+ baseBranch,
306
+ number : String(number),
307
+ };
308
+ if (headBranch) { tags.headBranch = headBranch; }
309
+
310
+ const { status, record } = await ctx.patches.records.create('repo/patch', {
311
+ data : { title, body, number },
312
+ tags,
313
+ parentContextId : repo.contextId,
314
+ });
315
+
316
+ if (status.code >= 300) {
317
+ return jsonValidationError(`Failed to create pull request: ${status.detail}`);
318
+ }
319
+
320
+ const recTags = (record.tags as Record<string, string> | undefined) ?? {};
321
+ const data = await record.data.json();
322
+ const pr = buildPullResponse(record, data, recTags, targetDid, repoName, baseUrl);
323
+
324
+ return jsonCreated(pr);
325
+ }
326
+
327
+ // ---------------------------------------------------------------------------
328
+ // PATCH /repos/:did/:repo/pulls/:number — update pull request
329
+ // ---------------------------------------------------------------------------
330
+
331
+ export async function handleUpdatePull(
332
+ ctx: AgentContext, targetDid: string, repoName: string,
333
+ number: string, reqBody: Record<string, unknown>, url: URL,
334
+ ): Promise<JsonResponse> {
335
+ const repo = await getRepoRecord(ctx, targetDid);
336
+ if (!repo) {
337
+ return jsonNotFound(`Repository '${repoName}' not found for DID '${targetDid}'.`);
338
+ }
339
+
340
+ const baseUrl = buildApiUrl(url);
341
+
342
+ const { records } = await ctx.patches.records.query('repo/patch', {
343
+ filter: { contextId: repo.contextId, tags: { number } },
344
+ });
345
+
346
+ if (records.length === 0) {
347
+ return jsonNotFound(`Pull request #${number} not found.`);
348
+ }
349
+
350
+ const rec = records[0];
351
+ const data = await rec.data.json();
352
+ const tags = (rec.tags as Record<string, string> | undefined) ?? {};
353
+
354
+ // Apply updates.
355
+ const newTitle = (reqBody.title as string | undefined) ?? data.title;
356
+ const newBody = (reqBody.body as string | undefined) ?? data.body;
357
+ const newBase = (reqBody.base as string | undefined) ?? tags.baseBranch;
358
+
359
+ // GitHub API uses "state" (open/closed), DWN uses "status" tag.
360
+ let newStatus = tags.status ?? 'open';
361
+ if (reqBody.state === 'closed') { newStatus = 'closed'; }
362
+ if (reqBody.state === 'open') { newStatus = 'open'; }
363
+
364
+ const newTags: Record<string, string> = { ...tags, status: newStatus };
365
+ if (newBase) { newTags.baseBranch = newBase; }
366
+
367
+ const { status } = await rec.update({
368
+ data : { title: newTitle, body: newBody, number: data.number },
369
+ tags : newTags,
370
+ });
371
+
372
+ if (status.code >= 300) {
373
+ return jsonValidationError(`Failed to update pull request: ${status.detail}`);
374
+ }
375
+
376
+ const updatedData = { title: newTitle, body: newBody, number: data.number };
377
+ const pr = buildPullResponse(rec, updatedData, newTags, targetDid, repoName, baseUrl);
378
+
379
+ return jsonOk(pr);
380
+ }
381
+
382
+ // ---------------------------------------------------------------------------
383
+ // PUT /repos/:did/:repo/pulls/:number/merge — merge pull request
384
+ // ---------------------------------------------------------------------------
385
+
386
+ export async function handleMergePull(
387
+ ctx: AgentContext, targetDid: string, repoName: string,
388
+ number: string, reqBody: Record<string, unknown>, _url: URL,
389
+ ): Promise<JsonResponse> {
390
+ const repo = await getRepoRecord(ctx, targetDid);
391
+ if (!repo) {
392
+ return jsonNotFound(`Repository '${repoName}' not found for DID '${targetDid}'.`);
393
+ }
394
+
395
+ const { records } = await ctx.patches.records.query('repo/patch', {
396
+ filter: { contextId: repo.contextId, tags: { number } },
397
+ });
398
+
399
+ if (records.length === 0) {
400
+ return jsonNotFound(`Pull request #${number} not found.`);
401
+ }
402
+
403
+ const rec = records[0];
404
+ const data = await rec.data.json();
405
+ const tags = (rec.tags as Record<string, string> | undefined) ?? {};
406
+
407
+ if (tags.status === 'merged') {
408
+ return jsonMethodNotAllowed(`Pull request #${number} is already merged.`);
409
+ }
410
+
411
+ if (tags.status === 'closed') {
412
+ return jsonMethodNotAllowed(`Pull request #${number} is closed. Reopen it before merging.`);
413
+ }
414
+
415
+ // Update the patch status to merged.
416
+ const mergeStrategy = (reqBody.merge_method as string) ?? 'merge';
417
+
418
+ const { status } = await rec.update({
419
+ data : data,
420
+ tags : { ...tags, status: 'merged' },
421
+ });
422
+
423
+ if (status.code >= 300) {
424
+ return jsonValidationError(`Failed to merge pull request: ${status.detail}`);
425
+ }
426
+
427
+ // Create a merge result record.
428
+ await ctx.patches.records.create('repo/patch/mergeResult' as any, {
429
+ data : { mergedBy: ctx.did },
430
+ tags : { mergeCommit: 'pending', strategy: mergeStrategy },
431
+ parentContextId : rec.contextId,
432
+ } as any);
433
+
434
+ // GitHub returns a merge result object.
435
+ return jsonOk({
436
+ sha : '0000000000000000000000000000000000000000',
437
+ merged : true,
438
+ message : `Pull request #${number} merged successfully.`,
439
+ });
440
+ }
441
+
442
+ // ---------------------------------------------------------------------------
443
+ // POST /repos/:did/:repo/pulls/:number/reviews — create review
444
+ // ---------------------------------------------------------------------------
445
+
446
+ export async function handleCreatePullReview(
447
+ ctx: AgentContext, targetDid: string, repoName: string,
448
+ number: string, reqBody: Record<string, unknown>, url: URL,
449
+ ): Promise<JsonResponse> {
450
+ const repo = await getRepoRecord(ctx, targetDid);
451
+ if (!repo) {
452
+ return jsonNotFound(`Repository '${repoName}' not found for DID '${targetDid}'.`);
453
+ }
454
+
455
+ const baseUrl = buildApiUrl(url);
456
+
457
+ // Find the patch.
458
+ const { records: patches } = await ctx.patches.records.query('repo/patch', {
459
+ filter: { contextId: repo.contextId, tags: { number } },
460
+ });
461
+
462
+ if (patches.length === 0) {
463
+ return jsonNotFound(`Pull request #${number} not found.`);
464
+ }
465
+
466
+ const patchRec = patches[0];
467
+ const reviewBody = (reqBody.body as string) ?? '';
468
+
469
+ // GitHub API uses "event" field: APPROVE, REQUEST_CHANGES, COMMENT.
470
+ // Map to DWN verdict tags.
471
+ const event = (reqBody.event as string | undefined)?.toUpperCase() ?? 'COMMENT';
472
+ let verdict = 'comment';
473
+ if (event === 'APPROVE') { verdict = 'approve'; }
474
+ if (event === 'REQUEST_CHANGES') { verdict = 'reject'; }
475
+
476
+ const { status, record: reviewRec } = await ctx.patches.records.create('repo/patch/review' as any, {
477
+ data : { body: reviewBody },
478
+ tags : { verdict },
479
+ parentContextId : patchRec.contextId,
480
+ } as any);
481
+
482
+ if (status.code >= 300) {
483
+ return jsonValidationError(`Failed to create review: ${status.detail}`);
484
+ }
485
+
486
+ const owner = buildOwner(targetDid, baseUrl);
487
+
488
+ return jsonCreated({
489
+ id : numericId(reviewRec.id ?? ''),
490
+ node_id : reviewRec.id ?? '',
491
+ user : owner,
492
+ body : reviewBody,
493
+ state : VERDICT_MAP[verdict] ?? 'COMMENTED',
494
+ html_url : `${baseUrl}/repos/${targetDid}/${repoName}/pulls/${number}#pullrequestreview-${numericId(reviewRec.id ?? '')}`,
495
+ pull_request_url : `${baseUrl}/repos/${targetDid}/${repoName}/pulls/${number}`,
496
+ submitted_at : toISODate(reviewRec.dateCreated),
497
+ commit_id : '',
498
+ author_association : 'OWNER',
499
+ });
500
+ }
@@ -0,0 +1,185 @@
1
+ /**
2
+ * GitHub API shim — `/repos/:did/:repo/releases` endpoints.
3
+ *
4
+ * Maps DWN release records to GitHub REST API v3 release responses.
5
+ *
6
+ * Endpoints:
7
+ * GET /repos/:did/:repo/releases List releases
8
+ * GET /repos/:did/:repo/releases/tags/:tag Release by tag name
9
+ * POST /repos/:did/:repo/releases Create release
10
+ *
11
+ * @module
12
+ */
13
+
14
+ import type { AgentContext } from '../cli/agent.js';
15
+ import type { JsonResponse } from './helpers.js';
16
+
17
+ import { DateSort } from '@enbox/dwn-sdk-js';
18
+
19
+ import {
20
+ buildApiUrl,
21
+ buildLinkHeader,
22
+ buildOwner,
23
+ fromOpt,
24
+ getRepoRecord,
25
+ jsonCreated,
26
+ jsonNotFound,
27
+ jsonOk,
28
+ jsonValidationError,
29
+ numericId,
30
+ paginate,
31
+ parsePagination,
32
+ toISODate,
33
+ } from './helpers.js';
34
+
35
+ // ---------------------------------------------------------------------------
36
+ // Release object builder
37
+ // ---------------------------------------------------------------------------
38
+
39
+ function buildReleaseResponse(
40
+ rec: any, data: any, tags: Record<string, unknown>,
41
+ targetDid: string, repoName: string, baseUrl: string,
42
+ ): Record<string, unknown> {
43
+ const owner = buildOwner(targetDid, baseUrl);
44
+ const tagName = (tags.tagName as string) ?? '';
45
+ const prerelease = tags.prerelease === true;
46
+ const draft = tags.draft === true;
47
+ const id = numericId(rec.id ?? '');
48
+
49
+ return {
50
+ id,
51
+ node_id : rec.id ?? '',
52
+ url : `${baseUrl}/repos/${targetDid}/${repoName}/releases/${id}`,
53
+ html_url : `${baseUrl}/repos/${targetDid}/${repoName}/releases/tags/${tagName}`,
54
+ assets_url : `${baseUrl}/repos/${targetDid}/${repoName}/releases/${id}/assets`,
55
+ upload_url : `${baseUrl}/repos/${targetDid}/${repoName}/releases/${id}/assets{?name,label}`,
56
+ tarball_url : `${baseUrl}/repos/${targetDid}/${repoName}/tarball/${tagName}`,
57
+ zipball_url : `${baseUrl}/repos/${targetDid}/${repoName}/zipball/${tagName}`,
58
+ tag_name : tagName,
59
+ target_commitish : 'main',
60
+ name : data.name ?? tagName,
61
+ body : data.body ?? '',
62
+ draft,
63
+ prerelease,
64
+ created_at : toISODate(rec.dateCreated),
65
+ published_at : toISODate(rec.dateCreated),
66
+ author : owner,
67
+ assets : [],
68
+ };
69
+ }
70
+
71
+ // ---------------------------------------------------------------------------
72
+ // GET /repos/:did/:repo/releases
73
+ // ---------------------------------------------------------------------------
74
+
75
+ export async function handleListReleases(
76
+ ctx: AgentContext, targetDid: string, repoName: string, url: URL,
77
+ ): Promise<JsonResponse> {
78
+ const repo = await getRepoRecord(ctx, targetDid);
79
+ if (!repo) {
80
+ return jsonNotFound(`Repository '${repoName}' not found for DID '${targetDid}'.`);
81
+ }
82
+
83
+ const from = fromOpt(ctx, targetDid);
84
+ const baseUrl = buildApiUrl(url);
85
+ const pagination = parsePagination(url);
86
+
87
+ const { records } = await ctx.releases.records.query('repo/release' as any, {
88
+ from,
89
+ filter : { contextId: repo.contextId },
90
+ dateSort : DateSort.CreatedDescending,
91
+ });
92
+
93
+ const paged = paginate(records, pagination);
94
+
95
+ const items: Record<string, unknown>[] = [];
96
+ for (const rec of paged) {
97
+ const data = await rec.data.json();
98
+ const tags = (rec.tags as Record<string, unknown> | undefined) ?? {};
99
+ items.push(buildReleaseResponse(rec, data, tags, targetDid, repoName, baseUrl));
100
+ }
101
+
102
+ const linkHeader = buildLinkHeader(
103
+ baseUrl, `/repos/${targetDid}/${repoName}/releases`,
104
+ pagination.page, pagination.perPage, records.length,
105
+ );
106
+ const extraHeaders: Record<string, string> = {};
107
+ if (linkHeader) { extraHeaders['Link'] = linkHeader; }
108
+
109
+ return jsonOk(items, extraHeaders);
110
+ }
111
+
112
+ // ---------------------------------------------------------------------------
113
+ // GET /repos/:did/:repo/releases/tags/:tag
114
+ // ---------------------------------------------------------------------------
115
+
116
+ export async function handleGetReleaseByTag(
117
+ ctx: AgentContext, targetDid: string, repoName: string, tag: string, url: URL,
118
+ ): Promise<JsonResponse> {
119
+ const repo = await getRepoRecord(ctx, targetDid);
120
+ if (!repo) {
121
+ return jsonNotFound(`Repository '${repoName}' not found for DID '${targetDid}'.`);
122
+ }
123
+
124
+ const from = fromOpt(ctx, targetDid);
125
+ const baseUrl = buildApiUrl(url);
126
+
127
+ const { records } = await ctx.releases.records.query('repo/release' as any, {
128
+ from,
129
+ filter: { contextId: repo.contextId, tags: { tagName: tag } },
130
+ });
131
+
132
+ if (records.length === 0) {
133
+ return jsonNotFound(`Release with tag '${tag}' not found.`);
134
+ }
135
+
136
+ const rec = records[0];
137
+ const data = await rec.data.json();
138
+ const tags = (rec.tags as Record<string, unknown> | undefined) ?? {};
139
+
140
+ return jsonOk(buildReleaseResponse(rec, data, tags, targetDid, repoName, baseUrl));
141
+ }
142
+
143
+ // ---------------------------------------------------------------------------
144
+ // POST /repos/:did/:repo/releases — create release
145
+ // ---------------------------------------------------------------------------
146
+
147
+ export async function handleCreateRelease(
148
+ ctx: AgentContext, targetDid: string, repoName: string,
149
+ reqBody: Record<string, unknown>, url: URL,
150
+ ): Promise<JsonResponse> {
151
+ const repo = await getRepoRecord(ctx, targetDid);
152
+ if (!repo) {
153
+ return jsonNotFound(`Repository '${repoName}' not found for DID '${targetDid}'.`);
154
+ }
155
+
156
+ const tagName = reqBody.tag_name as string | undefined;
157
+ if (!tagName) {
158
+ return jsonValidationError('Validation Failed: tag_name is required.');
159
+ }
160
+
161
+ const name = (reqBody.name as string) ?? tagName;
162
+ const body = (reqBody.body as string) ?? '';
163
+ const baseUrl = buildApiUrl(url);
164
+
165
+ const tags: Record<string, unknown> = { tagName };
166
+ if (reqBody.target_commitish) { tags.commitSha = reqBody.target_commitish; }
167
+ if (reqBody.prerelease === true) { tags.prerelease = true; }
168
+ if (reqBody.draft === true) { tags.draft = true; }
169
+
170
+ const { status, record } = await ctx.releases.records.create('repo/release' as any, {
171
+ data : { name, body },
172
+ tags,
173
+ parentContextId : repo.contextId,
174
+ } as any);
175
+
176
+ if (status.code >= 300) {
177
+ return jsonValidationError(`Failed to create release: ${status.detail}`);
178
+ }
179
+
180
+ const recTags = (record.tags as Record<string, unknown> | undefined) ?? {};
181
+ const data = await record.data.json();
182
+ const release = buildReleaseResponse(record, data, recTags, targetDid, repoName, baseUrl);
183
+
184
+ return jsonCreated(release);
185
+ }