@erode-app/core 0.6.0-beta.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 (326) hide show
  1. package/dist/adapters/adapter-factory.d.ts +3 -0
  2. package/dist/adapters/adapter-factory.d.ts.map +1 -0
  3. package/dist/adapters/adapter-factory.js +19 -0
  4. package/dist/adapters/adapter-factory.js.map +1 -0
  5. package/dist/adapters/adapter-metadata.d.ts +12 -0
  6. package/dist/adapters/adapter-metadata.d.ts.map +1 -0
  7. package/dist/adapters/adapter-metadata.js +2 -0
  8. package/dist/adapters/adapter-metadata.js.map +1 -0
  9. package/dist/adapters/architecture-adapter.d.ts +42 -0
  10. package/dist/adapters/architecture-adapter.d.ts.map +1 -0
  11. package/dist/adapters/architecture-adapter.js +2 -0
  12. package/dist/adapters/architecture-adapter.js.map +1 -0
  13. package/dist/adapters/architecture-types.d.ts +32 -0
  14. package/dist/adapters/architecture-types.d.ts.map +1 -0
  15. package/dist/adapters/architecture-types.js +2 -0
  16. package/dist/adapters/architecture-types.js.map +1 -0
  17. package/dist/adapters/base-patcher.d.ts +38 -0
  18. package/dist/adapters/base-patcher.d.ts.map +1 -0
  19. package/dist/adapters/base-patcher.js +266 -0
  20. package/dist/adapters/base-patcher.js.map +1 -0
  21. package/dist/adapters/dsl-validation.d.ts +2 -0
  22. package/dist/adapters/dsl-validation.d.ts.map +1 -0
  23. package/dist/adapters/dsl-validation.js +24 -0
  24. package/dist/adapters/dsl-validation.js.map +1 -0
  25. package/dist/adapters/likec4/adapter.d.ts +37 -0
  26. package/dist/adapters/likec4/adapter.d.ts.map +1 -0
  27. package/dist/adapters/likec4/adapter.js +302 -0
  28. package/dist/adapters/likec4/adapter.js.map +1 -0
  29. package/dist/adapters/likec4/dsl-validator.d.ts +3 -0
  30. package/dist/adapters/likec4/dsl-validator.d.ts.map +1 -0
  31. package/dist/adapters/likec4/dsl-validator.js +22 -0
  32. package/dist/adapters/likec4/dsl-validator.js.map +1 -0
  33. package/dist/adapters/likec4/index.d.ts +2 -0
  34. package/dist/adapters/likec4/index.d.ts.map +1 -0
  35. package/dist/adapters/likec4/index.js +2 -0
  36. package/dist/adapters/likec4/index.js.map +1 -0
  37. package/dist/adapters/likec4/likec4-types.d.ts +7 -0
  38. package/dist/adapters/likec4/likec4-types.d.ts.map +1 -0
  39. package/dist/adapters/likec4/likec4-types.js +2 -0
  40. package/dist/adapters/likec4/likec4-types.js.map +1 -0
  41. package/dist/adapters/likec4/metadata.d.ts +3 -0
  42. package/dist/adapters/likec4/metadata.d.ts.map +1 -0
  43. package/dist/adapters/likec4/metadata.js +30 -0
  44. package/dist/adapters/likec4/metadata.js.map +1 -0
  45. package/dist/adapters/likec4/patcher.d.ts +15 -0
  46. package/dist/adapters/likec4/patcher.d.ts.map +1 -0
  47. package/dist/adapters/likec4/patcher.js +69 -0
  48. package/dist/adapters/likec4/patcher.js.map +1 -0
  49. package/dist/adapters/likec4/version-check.d.ts +11 -0
  50. package/dist/adapters/likec4/version-check.d.ts.map +1 -0
  51. package/dist/adapters/likec4/version-check.js +75 -0
  52. package/dist/adapters/likec4/version-check.js.map +1 -0
  53. package/dist/adapters/model-patcher.d.ts +49 -0
  54. package/dist/adapters/model-patcher.d.ts.map +1 -0
  55. package/dist/adapters/model-patcher.js +15 -0
  56. package/dist/adapters/model-patcher.js.map +1 -0
  57. package/dist/adapters/structurizr/adapter.d.ts +39 -0
  58. package/dist/adapters/structurizr/adapter.d.ts.map +1 -0
  59. package/dist/adapters/structurizr/adapter.js +372 -0
  60. package/dist/adapters/structurizr/adapter.js.map +1 -0
  61. package/dist/adapters/structurizr/dsl-validator.d.ts +3 -0
  62. package/dist/adapters/structurizr/dsl-validator.d.ts.map +1 -0
  63. package/dist/adapters/structurizr/dsl-validator.js +26 -0
  64. package/dist/adapters/structurizr/dsl-validator.js.map +1 -0
  65. package/dist/adapters/structurizr/index.d.ts +2 -0
  66. package/dist/adapters/structurizr/index.d.ts.map +1 -0
  67. package/dist/adapters/structurizr/index.js +2 -0
  68. package/dist/adapters/structurizr/index.js.map +1 -0
  69. package/dist/adapters/structurizr/metadata.d.ts +3 -0
  70. package/dist/adapters/structurizr/metadata.d.ts.map +1 -0
  71. package/dist/adapters/structurizr/metadata.js +35 -0
  72. package/dist/adapters/structurizr/metadata.js.map +1 -0
  73. package/dist/adapters/structurizr/patcher.d.ts +15 -0
  74. package/dist/adapters/structurizr/patcher.d.ts.map +1 -0
  75. package/dist/adapters/structurizr/patcher.js +53 -0
  76. package/dist/adapters/structurizr/patcher.js.map +1 -0
  77. package/dist/adapters/structurizr/structurizr-cli.d.ts +2 -0
  78. package/dist/adapters/structurizr/structurizr-cli.d.ts.map +1 -0
  79. package/dist/adapters/structurizr/structurizr-cli.js +91 -0
  80. package/dist/adapters/structurizr/structurizr-cli.js.map +1 -0
  81. package/dist/adapters/structurizr/structurizr-types.d.ts +3 -0
  82. package/dist/adapters/structurizr/structurizr-types.d.ts.map +1 -0
  83. package/dist/adapters/structurizr/structurizr-types.js +2 -0
  84. package/dist/adapters/structurizr/structurizr-types.js.map +1 -0
  85. package/dist/adapters/url-utils.d.ts +3 -0
  86. package/dist/adapters/url-utils.d.ts.map +1 -0
  87. package/dist/adapters/url-utils.js +53 -0
  88. package/dist/adapters/url-utils.js.map +1 -0
  89. package/dist/analysis/analysis-types.d.ts +152 -0
  90. package/dist/analysis/analysis-types.d.ts.map +1 -0
  91. package/dist/analysis/analysis-types.js +2 -0
  92. package/dist/analysis/analysis-types.js.map +1 -0
  93. package/dist/analysis/prompt-builder.d.ts +27 -0
  94. package/dist/analysis/prompt-builder.d.ts.map +1 -0
  95. package/dist/analysis/prompt-builder.js +159 -0
  96. package/dist/analysis/prompt-builder.js.map +1 -0
  97. package/dist/analysis/prompt-variables.d.ts +72 -0
  98. package/dist/analysis/prompt-variables.d.ts.map +1 -0
  99. package/dist/analysis/prompt-variables.js +2 -0
  100. package/dist/analysis/prompt-variables.js.map +1 -0
  101. package/dist/analysis/prompts/component-selection.md +50 -0
  102. package/dist/analysis/prompts/dependency-extraction.md +219 -0
  103. package/dist/analysis/prompts/drift-analysis.md +154 -0
  104. package/dist/analysis/prompts/model-patch.md +29 -0
  105. package/dist/analysis/section-formatters.d.ts +54 -0
  106. package/dist/analysis/section-formatters.d.ts.map +1 -0
  107. package/dist/analysis/section-formatters.js +95 -0
  108. package/dist/analysis/section-formatters.js.map +1 -0
  109. package/dist/analysis/template-engine.d.ts +11 -0
  110. package/dist/analysis/template-engine.d.ts.map +1 -0
  111. package/dist/analysis/template-engine.js +64 -0
  112. package/dist/analysis/template-engine.js.map +1 -0
  113. package/dist/ci-entry.d.ts +3 -0
  114. package/dist/ci-entry.d.ts.map +1 -0
  115. package/dist/ci-entry.js +67 -0
  116. package/dist/ci-entry.js.map +1 -0
  117. package/dist/errors.d.ts +60 -0
  118. package/dist/errors.d.ts.map +1 -0
  119. package/dist/errors.js +134 -0
  120. package/dist/errors.js.map +1 -0
  121. package/dist/index.d.ts +45 -0
  122. package/dist/index.d.ts.map +1 -0
  123. package/dist/index.js +38 -0
  124. package/dist/index.js.map +1 -0
  125. package/dist/output/ci-output.d.ts +13 -0
  126. package/dist/output/ci-output.d.ts.map +1 -0
  127. package/dist/output/ci-output.js +106 -0
  128. package/dist/output/ci-output.js.map +1 -0
  129. package/dist/output/structured-output.d.ts +89 -0
  130. package/dist/output/structured-output.d.ts.map +1 -0
  131. package/dist/output/structured-output.js +2 -0
  132. package/dist/output/structured-output.js.map +1 -0
  133. package/dist/output.d.ts +73 -0
  134. package/dist/output.d.ts.map +1 -0
  135. package/dist/output.js +304 -0
  136. package/dist/output.js.map +1 -0
  137. package/dist/pipelines/analyze.d.ts +35 -0
  138. package/dist/pipelines/analyze.d.ts.map +1 -0
  139. package/dist/pipelines/analyze.js +316 -0
  140. package/dist/pipelines/analyze.js.map +1 -0
  141. package/dist/pipelines/check.d.ts +48 -0
  142. package/dist/pipelines/check.d.ts.map +1 -0
  143. package/dist/pipelines/check.js +218 -0
  144. package/dist/pipelines/check.js.map +1 -0
  145. package/dist/pipelines/components.d.ts +8 -0
  146. package/dist/pipelines/components.d.ts.map +1 -0
  147. package/dist/pipelines/components.js +14 -0
  148. package/dist/pipelines/components.js.map +1 -0
  149. package/dist/pipelines/connections.d.ts +34 -0
  150. package/dist/pipelines/connections.d.ts.map +1 -0
  151. package/dist/pipelines/connections.js +53 -0
  152. package/dist/pipelines/connections.js.map +1 -0
  153. package/dist/pipelines/pr-creation.d.ts +30 -0
  154. package/dist/pipelines/pr-creation.d.ts.map +1 -0
  155. package/dist/pipelines/pr-creation.js +26 -0
  156. package/dist/pipelines/pr-creation.js.map +1 -0
  157. package/dist/pipelines/progress.d.ts +23 -0
  158. package/dist/pipelines/progress.d.ts.map +1 -0
  159. package/dist/pipelines/progress.js +22 -0
  160. package/dist/pipelines/progress.js.map +1 -0
  161. package/dist/pipelines/publish.d.ts +39 -0
  162. package/dist/pipelines/publish.d.ts.map +1 -0
  163. package/dist/pipelines/publish.js +125 -0
  164. package/dist/pipelines/publish.js.map +1 -0
  165. package/dist/pipelines/validate.d.ts +24 -0
  166. package/dist/pipelines/validate.d.ts.map +1 -0
  167. package/dist/pipelines/validate.js +79 -0
  168. package/dist/pipelines/validate.js.map +1 -0
  169. package/dist/platforms/bitbucket/api-client.d.ts +21 -0
  170. package/dist/platforms/bitbucket/api-client.d.ts.map +1 -0
  171. package/dist/platforms/bitbucket/api-client.js +98 -0
  172. package/dist/platforms/bitbucket/api-client.js.map +1 -0
  173. package/dist/platforms/bitbucket/index.d.ts +3 -0
  174. package/dist/platforms/bitbucket/index.d.ts.map +1 -0
  175. package/dist/platforms/bitbucket/index.js +3 -0
  176. package/dist/platforms/bitbucket/index.js.map +1 -0
  177. package/dist/platforms/bitbucket/reader.d.ts +9 -0
  178. package/dist/platforms/bitbucket/reader.d.ts.map +1 -0
  179. package/dist/platforms/bitbucket/reader.js +119 -0
  180. package/dist/platforms/bitbucket/reader.js.map +1 -0
  181. package/dist/platforms/bitbucket/writer.d.ts +15 -0
  182. package/dist/platforms/bitbucket/writer.d.ts.map +1 -0
  183. package/dist/platforms/bitbucket/writer.js +172 -0
  184. package/dist/platforms/bitbucket/writer.js.map +1 -0
  185. package/dist/platforms/github/index.d.ts +3 -0
  186. package/dist/platforms/github/index.d.ts.map +1 -0
  187. package/dist/platforms/github/index.js +3 -0
  188. package/dist/platforms/github/index.js.map +1 -0
  189. package/dist/platforms/github/reader.d.ts +9 -0
  190. package/dist/platforms/github/reader.d.ts.map +1 -0
  191. package/dist/platforms/github/reader.js +141 -0
  192. package/dist/platforms/github/reader.js.map +1 -0
  193. package/dist/platforms/github/writer.d.ts +15 -0
  194. package/dist/platforms/github/writer.d.ts.map +1 -0
  195. package/dist/platforms/github/writer.js +225 -0
  196. package/dist/platforms/github/writer.js.map +1 -0
  197. package/dist/platforms/gitlab/index.d.ts +3 -0
  198. package/dist/platforms/gitlab/index.d.ts.map +1 -0
  199. package/dist/platforms/gitlab/index.js +3 -0
  200. package/dist/platforms/gitlab/index.js.map +1 -0
  201. package/dist/platforms/gitlab/reader.d.ts +9 -0
  202. package/dist/platforms/gitlab/reader.d.ts.map +1 -0
  203. package/dist/platforms/gitlab/reader.js +136 -0
  204. package/dist/platforms/gitlab/reader.js.map +1 -0
  205. package/dist/platforms/gitlab/writer.d.ts +14 -0
  206. package/dist/platforms/gitlab/writer.d.ts.map +1 -0
  207. package/dist/platforms/gitlab/writer.js +130 -0
  208. package/dist/platforms/gitlab/writer.js.map +1 -0
  209. package/dist/platforms/platform-factory.d.ts +7 -0
  210. package/dist/platforms/platform-factory.d.ts.map +1 -0
  211. package/dist/platforms/platform-factory.js +53 -0
  212. package/dist/platforms/platform-factory.js.map +1 -0
  213. package/dist/platforms/platform-utils.d.ts +12 -0
  214. package/dist/platforms/platform-utils.d.ts.map +1 -0
  215. package/dist/platforms/platform-utils.js +48 -0
  216. package/dist/platforms/platform-utils.js.map +1 -0
  217. package/dist/platforms/source-platform.d.ts +117 -0
  218. package/dist/platforms/source-platform.d.ts.map +1 -0
  219. package/dist/platforms/source-platform.js +2 -0
  220. package/dist/platforms/source-platform.js.map +1 -0
  221. package/dist/providers/ai-provider.d.ts +23 -0
  222. package/dist/providers/ai-provider.d.ts.map +1 -0
  223. package/dist/providers/ai-provider.js +2 -0
  224. package/dist/providers/ai-provider.js.map +1 -0
  225. package/dist/providers/analysis-phase.d.ts +13 -0
  226. package/dist/providers/analysis-phase.d.ts.map +1 -0
  227. package/dist/providers/analysis-phase.js +14 -0
  228. package/dist/providers/analysis-phase.js.map +1 -0
  229. package/dist/providers/anthropic/models.d.ts +5 -0
  230. package/dist/providers/anthropic/models.d.ts.map +1 -0
  231. package/dist/providers/anthropic/models.js +5 -0
  232. package/dist/providers/anthropic/models.js.map +1 -0
  233. package/dist/providers/anthropic/provider.d.ts +12 -0
  234. package/dist/providers/anthropic/provider.d.ts.map +1 -0
  235. package/dist/providers/anthropic/provider.js +47 -0
  236. package/dist/providers/anthropic/provider.js.map +1 -0
  237. package/dist/providers/base-provider.d.ts +34 -0
  238. package/dist/providers/base-provider.d.ts.map +1 -0
  239. package/dist/providers/base-provider.js +100 -0
  240. package/dist/providers/base-provider.js.map +1 -0
  241. package/dist/providers/gemini/models.d.ts +5 -0
  242. package/dist/providers/gemini/models.d.ts.map +1 -0
  243. package/dist/providers/gemini/models.js +5 -0
  244. package/dist/providers/gemini/models.js.map +1 -0
  245. package/dist/providers/gemini/provider.d.ts +12 -0
  246. package/dist/providers/gemini/provider.d.ts.map +1 -0
  247. package/dist/providers/gemini/provider.js +42 -0
  248. package/dist/providers/gemini/provider.js.map +1 -0
  249. package/dist/providers/openai/models.d.ts +5 -0
  250. package/dist/providers/openai/models.d.ts.map +1 -0
  251. package/dist/providers/openai/models.js +5 -0
  252. package/dist/providers/openai/models.js.map +1 -0
  253. package/dist/providers/openai/provider.d.ts +12 -0
  254. package/dist/providers/openai/provider.d.ts.map +1 -0
  255. package/dist/providers/openai/provider.js +49 -0
  256. package/dist/providers/openai/provider.js.map +1 -0
  257. package/dist/providers/provider-factory.d.ts +3 -0
  258. package/dist/providers/provider-factory.d.ts.map +1 -0
  259. package/dist/providers/provider-factory.js +45 -0
  260. package/dist/providers/provider-factory.js.map +1 -0
  261. package/dist/schemas/bitbucket-api.schema.d.ts +52 -0
  262. package/dist/schemas/bitbucket-api.schema.d.ts.map +1 -0
  263. package/dist/schemas/bitbucket-api.schema.js +50 -0
  264. package/dist/schemas/bitbucket-api.schema.js.map +1 -0
  265. package/dist/schemas/common.schema.d.ts +46 -0
  266. package/dist/schemas/common.schema.d.ts.map +1 -0
  267. package/dist/schemas/common.schema.js +67 -0
  268. package/dist/schemas/common.schema.js.map +1 -0
  269. package/dist/schemas/dependency-extraction.schema.d.ts +17 -0
  270. package/dist/schemas/dependency-extraction.schema.d.ts.map +1 -0
  271. package/dist/schemas/dependency-extraction.schema.js +13 -0
  272. package/dist/schemas/dependency-extraction.schema.js.map +1 -0
  273. package/dist/schemas/drift-analysis.schema.d.ts +40 -0
  274. package/dist/schemas/drift-analysis.schema.d.ts.map +1 -0
  275. package/dist/schemas/drift-analysis.schema.js +15 -0
  276. package/dist/schemas/drift-analysis.schema.js.map +1 -0
  277. package/dist/schemas/gitlab-api.schema.d.ts +33 -0
  278. package/dist/schemas/gitlab-api.schema.d.ts.map +1 -0
  279. package/dist/schemas/gitlab-api.schema.js +33 -0
  280. package/dist/schemas/gitlab-api.schema.js.map +1 -0
  281. package/dist/schemas/likec4.schema.d.ts +26 -0
  282. package/dist/schemas/likec4.schema.d.ts.map +1 -0
  283. package/dist/schemas/likec4.schema.js +23 -0
  284. package/dist/schemas/likec4.schema.js.map +1 -0
  285. package/dist/schemas/package.schema.d.ts +5 -0
  286. package/dist/schemas/package.schema.d.ts.map +1 -0
  287. package/dist/schemas/package.schema.js +5 -0
  288. package/dist/schemas/package.schema.js.map +1 -0
  289. package/dist/schemas/source-platform.schema.d.ts +56 -0
  290. package/dist/schemas/source-platform.schema.d.ts.map +1 -0
  291. package/dist/schemas/source-platform.schema.js +49 -0
  292. package/dist/schemas/source-platform.schema.js.map +1 -0
  293. package/dist/schemas/structurizr.schema.d.ts +234 -0
  294. package/dist/schemas/structurizr.schema.d.ts.map +1 -0
  295. package/dist/schemas/structurizr.schema.js +54 -0
  296. package/dist/schemas/structurizr.schema.js.map +1 -0
  297. package/dist/skip-patterns +62 -0
  298. package/dist/utils/config.d.ts +156 -0
  299. package/dist/utils/config.d.ts.map +1 -0
  300. package/dist/utils/config.js +267 -0
  301. package/dist/utils/config.js.map +1 -0
  302. package/dist/utils/error-utils.d.ts +2 -0
  303. package/dist/utils/error-utils.d.ts.map +1 -0
  304. package/dist/utils/error-utils.js +6 -0
  305. package/dist/utils/error-utils.js.map +1 -0
  306. package/dist/utils/git-diff.d.ts +35 -0
  307. package/dist/utils/git-diff.d.ts.map +1 -0
  308. package/dist/utils/git-diff.js +114 -0
  309. package/dist/utils/git-diff.js.map +1 -0
  310. package/dist/utils/model-source.d.ts +30 -0
  311. package/dist/utils/model-source.d.ts.map +1 -0
  312. package/dist/utils/model-source.js +167 -0
  313. package/dist/utils/model-source.js.map +1 -0
  314. package/dist/utils/retry.d.ts +9 -0
  315. package/dist/utils/retry.d.ts.map +1 -0
  316. package/dist/utils/retry.js +51 -0
  317. package/dist/utils/retry.js.map +1 -0
  318. package/dist/utils/skip-patterns.d.ts +7 -0
  319. package/dist/utils/skip-patterns.d.ts.map +1 -0
  320. package/dist/utils/skip-patterns.js +35 -0
  321. package/dist/utils/skip-patterns.js.map +1 -0
  322. package/dist/utils/validation.d.ts +4 -0
  323. package/dist/utils/validation.d.ts.map +1 -0
  324. package/dist/utils/validation.js +37 -0
  325. package/dist/utils/validation.js.map +1 -0
  326. package/package.json +78 -0
@@ -0,0 +1,141 @@
1
+ import { z } from 'zod';
2
+ import { Octokit } from '@octokit/rest';
3
+ import { CONFIG } from '../../utils/config.js';
4
+ import { ErodeError, ErrorCode } from '../../errors.js';
5
+ import { validate } from '../../utils/validation.js';
6
+ import { ChangeRequestDataSchema, ChangeRequestCommitSchema, } from '../../schemas/source-platform.schema.js';
7
+ import { applyDiffTruncation, wrapPlatformError } from '../platform-utils.js';
8
+ export class GitHubReader {
9
+ octokit;
10
+ constructor(token) {
11
+ const authToken = token ?? CONFIG.github.token;
12
+ this.octokit = new Octokit({
13
+ ...(authToken ? { auth: authToken } : {}),
14
+ });
15
+ }
16
+ parseChangeRequestUrl(url) {
17
+ let owner;
18
+ let repo;
19
+ let prNumber;
20
+ try {
21
+ const parsed = new URL(url);
22
+ if (parsed.hostname !== 'github.com') {
23
+ throw new Error('Not a GitHub URL');
24
+ }
25
+ const segments = parsed.pathname.split('/').filter(Boolean);
26
+ if (segments.length < 4 || segments[2] !== 'pull' || !segments[3]) {
27
+ throw new Error('Invalid path structure');
28
+ }
29
+ [owner, repo, , prNumber] = segments;
30
+ }
31
+ catch {
32
+ throw new ErodeError('Cannot parse GitHub pull request URL. Expected format: https://github.com/{owner}/{repo}/pull/{number}', ErrorCode.PLATFORM_INVALID_URL, 'Cannot parse GitHub pull request URL. Expected format: https://github.com/{owner}/{repo}/pull/{number}');
33
+ }
34
+ if (!owner || !repo || !prNumber || isNaN(Number(prNumber))) {
35
+ throw new ErodeError('GitHub PR URL is missing required segments: owner, repo, or PR number', ErrorCode.PLATFORM_INVALID_URL, 'GitHub PR URL is missing required segments: owner, repo, or PR number');
36
+ }
37
+ return {
38
+ number: parseInt(prNumber, 10),
39
+ url,
40
+ repositoryUrl: `https://github.com/${owner}/${repo}`,
41
+ platformId: { owner, repo },
42
+ };
43
+ }
44
+ async fetchChangeRequest(ref) {
45
+ const owner = ref.platformId.owner;
46
+ const repo = ref.platformId.repo;
47
+ const pull_number = ref.number;
48
+ try {
49
+ const { data: pr } = await this.octokit.rest.pulls.get({
50
+ owner,
51
+ repo,
52
+ pull_number,
53
+ });
54
+ const { data: files } = await this.octokit.rest.pulls.listFiles({
55
+ owner,
56
+ repo,
57
+ pull_number,
58
+ per_page: 100,
59
+ });
60
+ const totalLines = files.reduce((sum, file) => sum + file.changes, 0);
61
+ const { files: filesToInclude, wasTruncated, truncationReason, } = applyDiffTruncation(files.map((file) => ({
62
+ filename: file.filename,
63
+ status: file.status,
64
+ additions: file.additions,
65
+ deletions: file.deletions,
66
+ changes: file.changes,
67
+ patch: file.patch,
68
+ })), totalLines);
69
+ const { data: comparison } = await this.octokit.rest.repos.compareCommits({
70
+ owner,
71
+ repo,
72
+ base: pr.base.sha,
73
+ head: pr.head.sha,
74
+ });
75
+ const diff = comparison.files
76
+ ?.flatMap((file) => file.patch ? [`diff --git a/${file.filename} b/${file.filename}\n${file.patch}`] : [])
77
+ .join('\n\n') ?? '';
78
+ const result = {
79
+ number: pr.number,
80
+ title: pr.title,
81
+ body: pr.body,
82
+ state: pr.state,
83
+ author: {
84
+ login: pr.user.login,
85
+ name: pr.user.name ?? undefined,
86
+ },
87
+ base: {
88
+ ref: pr.base.ref,
89
+ sha: pr.base.sha,
90
+ },
91
+ head: {
92
+ ref: pr.head.ref,
93
+ sha: pr.head.sha,
94
+ },
95
+ commits: pr.commits,
96
+ additions: pr.additions,
97
+ deletions: pr.deletions,
98
+ changed_files: pr.changed_files,
99
+ files: filesToInclude,
100
+ diff,
101
+ stats: {
102
+ total: pr.additions + pr.deletions,
103
+ additions: pr.additions,
104
+ deletions: pr.deletions,
105
+ },
106
+ wasTruncated,
107
+ truncationReason,
108
+ };
109
+ return validate(ChangeRequestDataSchema, result, 'GitHub change request data');
110
+ }
111
+ catch (error) {
112
+ wrapPlatformError(error, 'github', 'Could not retrieve pull request');
113
+ }
114
+ }
115
+ async fetchChangeRequestCommits(ref) {
116
+ const owner = ref.platformId.owner;
117
+ const repo = ref.platformId.repo;
118
+ const pull_number = ref.number;
119
+ try {
120
+ const { data: commits } = await this.octokit.rest.pulls.listCommits({
121
+ owner,
122
+ repo,
123
+ pull_number,
124
+ per_page: 100,
125
+ });
126
+ const result = commits.map(({ sha, commit: { message, author } }) => ({
127
+ sha,
128
+ message,
129
+ author: {
130
+ name: author?.name ?? '(unknown)',
131
+ email: author?.email ?? '',
132
+ },
133
+ }));
134
+ return validate(z.array(ChangeRequestCommitSchema), result, 'GitHub change request commits');
135
+ }
136
+ catch (error) {
137
+ wrapPlatformError(error, 'github', 'Could not retrieve pull request commits');
138
+ }
139
+ }
140
+ }
141
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/platforms/github/reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SourcePlatformWriter, ChangeRequestRef, ChangeRequestResult, CreateOrUpdateChangeRequestOptions } from '../source-platform.js';
2
+ export declare class GitHubWriter implements SourcePlatformWriter {
3
+ private readonly octokit;
4
+ private readonly targetOwner;
5
+ private readonly targetRepo;
6
+ constructor(targetOwner: string, targetRepo: string);
7
+ createOrUpdateChangeRequest(options: CreateOrUpdateChangeRequestOptions): Promise<ChangeRequestResult>;
8
+ commentOnChangeRequest(ref: ChangeRequestRef, body: string, options?: {
9
+ upsertMarker?: string;
10
+ }): Promise<void>;
11
+ deleteComment(ref: ChangeRequestRef, marker: string): Promise<void>;
12
+ closeChangeRequest(branchName: string): Promise<void>;
13
+ private findCommentByMarker;
14
+ }
15
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/platforms/github/writer.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,kCAAkC,EACnC,MAAM,uBAAuB,CAAC;AAe/B,qBAAa,YAAa,YAAW,oBAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAc7C,2BAA2B,CAC/B,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,mBAAmB,CAAC;IAyHzB,sBAAsB,CAC1B,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC,IAAI,CAAC;IAuCV,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAoBnE,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAoC7C,mBAAmB;CAclC"}
@@ -0,0 +1,225 @@
1
+ import { Octokit } from '@octokit/rest';
2
+ import { CONFIG, ENV_VAR_NAMES, RC_FILENAME } from '../../utils/config.js';
3
+ import { ErodeError, ErrorCode } from '../../errors.js';
4
+ import { withRetry } from '../../utils/retry.js';
5
+ import { wrapPlatformError, isTransientError } from '../platform-utils.js';
6
+ import { extractStatusCode } from '../../utils/error-utils.js';
7
+ function throw403AsPermissionError(error, prNumber) {
8
+ if (error instanceof Error && extractStatusCode(error) === 403) {
9
+ throw new ErodeError('Cannot comment on PR: the conversation may be locked or the token lacks write access', ErrorCode.IO_PERMISSION_DENIED, 'Cannot comment on PR. Check if the conversation is locked or if the token has issues:write permission.', { prNumber });
10
+ }
11
+ }
12
+ export class GitHubWriter {
13
+ octokit;
14
+ targetOwner;
15
+ targetRepo;
16
+ constructor(targetOwner, targetRepo) {
17
+ const token = CONFIG.github.modelRepoPrToken ?? CONFIG.github.token;
18
+ if (!token) {
19
+ throw new ErodeError('A GitHub token is needed to create PRs', ErrorCode.AUTH_KEY_MISSING, `Provide ${ENV_VAR_NAMES.modelRepoPrToken} or ${ENV_VAR_NAMES.githubToken} in your environment or ${RC_FILENAME} to create PRs.`);
20
+ }
21
+ this.octokit = new Octokit({ auth: token });
22
+ this.targetOwner = targetOwner;
23
+ this.targetRepo = targetRepo;
24
+ }
25
+ async createOrUpdateChangeRequest(options) {
26
+ try {
27
+ const { branchName, title, body, fileChanges, baseBranch = 'main', draft = true } = options;
28
+ const owner = this.targetOwner;
29
+ const repo = this.targetRepo;
30
+ const { data: baseRef } = await this.octokit.rest.git.getRef({
31
+ owner,
32
+ repo,
33
+ ref: `heads/${baseBranch}`,
34
+ });
35
+ const baseSha = baseRef.object.sha;
36
+ const { data: baseCommit } = await this.octokit.rest.git.getCommit({
37
+ owner,
38
+ repo,
39
+ commit_sha: baseSha,
40
+ });
41
+ const treeItems = await Promise.all(fileChanges.map(async (file) => {
42
+ const { data: blob } = await this.octokit.rest.git.createBlob({
43
+ owner,
44
+ repo,
45
+ content: file.content,
46
+ encoding: 'utf-8',
47
+ });
48
+ return {
49
+ path: file.path,
50
+ mode: '100644',
51
+ type: 'blob',
52
+ sha: blob.sha,
53
+ };
54
+ }));
55
+ const { data: tree } = await this.octokit.rest.git.createTree({
56
+ owner,
57
+ repo,
58
+ base_tree: baseCommit.tree.sha,
59
+ tree: treeItems,
60
+ });
61
+ const { data: newCommit } = await this.octokit.rest.git.createCommit({
62
+ owner,
63
+ repo,
64
+ message: title,
65
+ tree: tree.sha,
66
+ parents: [baseSha],
67
+ });
68
+ let branchExists = false;
69
+ try {
70
+ await this.octokit.rest.git.getRef({ owner, repo, ref: `heads/${branchName}` });
71
+ branchExists = true;
72
+ }
73
+ catch {
74
+ // Branch doesn't exist
75
+ }
76
+ if (branchExists) {
77
+ await this.octokit.rest.git.updateRef({
78
+ owner,
79
+ repo,
80
+ ref: `heads/${branchName}`,
81
+ sha: newCommit.sha,
82
+ force: true,
83
+ });
84
+ }
85
+ else {
86
+ await this.octokit.rest.git.createRef({
87
+ owner,
88
+ repo,
89
+ ref: `refs/heads/${branchName}`,
90
+ sha: newCommit.sha,
91
+ });
92
+ }
93
+ const { data: existingPrs } = await this.octokit.rest.pulls.list({
94
+ owner,
95
+ repo,
96
+ head: `${owner}:${branchName}`,
97
+ state: 'open',
98
+ });
99
+ const existingPr = existingPrs[0];
100
+ if (existingPr) {
101
+ await this.octokit.rest.pulls.update({
102
+ owner,
103
+ repo,
104
+ pull_number: existingPr.number,
105
+ title,
106
+ body,
107
+ });
108
+ return {
109
+ url: existingPr.html_url,
110
+ number: existingPr.number,
111
+ action: 'updated',
112
+ branch: branchName,
113
+ };
114
+ }
115
+ const { data: pr } = await this.octokit.rest.pulls.create({
116
+ owner,
117
+ repo,
118
+ title,
119
+ body,
120
+ head: branchName,
121
+ base: baseBranch,
122
+ draft,
123
+ });
124
+ return {
125
+ url: pr.html_url,
126
+ number: pr.number,
127
+ action: 'created',
128
+ branch: branchName,
129
+ };
130
+ }
131
+ catch (error) {
132
+ wrapPlatformError(error, 'github', 'Could not create or update pull request');
133
+ }
134
+ }
135
+ async commentOnChangeRequest(ref, body, options) {
136
+ const owner = ref.platformId.owner;
137
+ const repo = ref.platformId.repo;
138
+ try {
139
+ await withRetry(async () => {
140
+ if (options?.upsertMarker) {
141
+ const existingId = await this.findCommentByMarker(owner, repo, ref.number, options.upsertMarker);
142
+ if (existingId) {
143
+ await this.octokit.rest.issues.updateComment({
144
+ owner,
145
+ repo,
146
+ comment_id: existingId,
147
+ body,
148
+ });
149
+ return;
150
+ }
151
+ }
152
+ await this.octokit.rest.issues.createComment({
153
+ owner,
154
+ repo,
155
+ issue_number: ref.number,
156
+ body,
157
+ });
158
+ }, { retries: 1, initialDelay: 2000, shouldRetry: isTransientError });
159
+ }
160
+ catch (error) {
161
+ throw403AsPermissionError(error, ref.number);
162
+ wrapPlatformError(error, 'github', 'Could not comment on pull request');
163
+ }
164
+ }
165
+ async deleteComment(ref, marker) {
166
+ const owner = ref.platformId.owner;
167
+ const repo = ref.platformId.repo;
168
+ try {
169
+ await withRetry(async () => {
170
+ const existingId = await this.findCommentByMarker(owner, repo, ref.number, marker);
171
+ if (existingId) {
172
+ await this.octokit.rest.issues.deleteComment({ owner, repo, comment_id: existingId });
173
+ }
174
+ }, { retries: 1, initialDelay: 2000, shouldRetry: isTransientError });
175
+ }
176
+ catch (error) {
177
+ throw403AsPermissionError(error, ref.number);
178
+ wrapPlatformError(error, 'github', 'Could not remove comment from pull request');
179
+ }
180
+ }
181
+ async closeChangeRequest(branchName) {
182
+ const owner = this.targetOwner;
183
+ const repo = this.targetRepo;
184
+ try {
185
+ const { data: prs } = await this.octokit.rest.pulls.list({
186
+ owner,
187
+ repo,
188
+ head: `${owner}:${branchName}`,
189
+ state: 'open',
190
+ });
191
+ const pr = prs[0];
192
+ if (!pr)
193
+ return;
194
+ await this.octokit.rest.pulls.update({
195
+ owner,
196
+ repo,
197
+ pull_number: pr.number,
198
+ state: 'closed',
199
+ });
200
+ try {
201
+ await this.octokit.rest.git.deleteRef({
202
+ owner,
203
+ repo,
204
+ ref: `heads/${branchName}`,
205
+ });
206
+ }
207
+ catch {
208
+ // Branch may already be deleted
209
+ }
210
+ }
211
+ catch (error) {
212
+ wrapPlatformError(error, 'github', 'Could not close pull request');
213
+ }
214
+ }
215
+ async findCommentByMarker(owner, repo, issueNumber, marker) {
216
+ const { data: comments } = await this.octokit.rest.issues.listComments({
217
+ owner,
218
+ repo,
219
+ issue_number: issueNumber,
220
+ });
221
+ const match = comments.find((c) => c.body?.includes(marker));
222
+ return match?.id;
223
+ }
224
+ }
225
+ //# sourceMappingURL=writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.js","sourceRoot":"","sources":["../../../src/platforms/github/writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { GitLabReader } from './reader.js';
2
+ export { GitLabWriter } from './writer.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/platforms/gitlab/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { GitLabReader } from './reader.js';
2
+ export { GitLabWriter } from './writer.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/platforms/gitlab/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { SourcePlatformReader, ChangeRequestRef, ChangeRequestData, ChangeRequestCommit } from '../source-platform.js';
2
+ export declare class GitLabReader implements SourcePlatformReader {
3
+ private api;
4
+ constructor(token?: string);
5
+ parseChangeRequestUrl(url: string): ChangeRequestRef;
6
+ fetchChangeRequest(ref: ChangeRequestRef): Promise<ChangeRequestData>;
7
+ fetchChangeRequestCommits(ref: ChangeRequestRef): Promise<ChangeRequestCommit[]>;
8
+ }
9
+ //# sourceMappingURL=reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../../src/platforms/gitlab/reader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAe/B,qBAAa,YAAa,YAAW,oBAAoB;IACvD,OAAO,CAAC,GAAG,CAA8B;gBAE7B,KAAK,CAAC,EAAE,MAAM;IAQ1B,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB;IA8B9C,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkGrE,yBAAyB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;CAyBvF"}
@@ -0,0 +1,136 @@
1
+ import { z } from 'zod';
2
+ import { Gitlab } from '@gitbeaker/rest';
3
+ import { CONFIG } from '../../utils/config.js';
4
+ import { ErodeError, ErrorCode } from '../../errors.js';
5
+ import { validate } from '../../utils/validation.js';
6
+ import { GitLabMrResponseSchema, GitLabDiffEntrySchema, GitLabCommitEntrySchema, } from '../../schemas/gitlab-api.schema.js';
7
+ import { ChangeRequestDataSchema, ChangeRequestCommitSchema, } from '../../schemas/source-platform.schema.js';
8
+ import { applyDiffTruncation, wrapPlatformError } from '../platform-utils.js';
9
+ const GITLAB_MR_URL_PATTERN = /^https?:\/\/gitlab\.com\/(.+)\/-\/merge_requests\/(\d+)$/i;
10
+ export class GitLabReader {
11
+ api;
12
+ constructor(token) {
13
+ const authToken = token ?? CONFIG.gitlab.token;
14
+ this.api = new Gitlab({
15
+ ...(authToken ? { token: authToken } : {}),
16
+ host: CONFIG.gitlab.baseUrl,
17
+ });
18
+ }
19
+ parseChangeRequestUrl(url) {
20
+ const match = GITLAB_MR_URL_PATTERN.exec(url);
21
+ if (!match) {
22
+ throw new ErodeError('Unrecognized GitLab merge request URL. Expected: https://gitlab.com/{namespace}/{project}/-/merge_requests/{number}', ErrorCode.PLATFORM_INVALID_URL, 'Unrecognized GitLab merge request URL. Expected: https://gitlab.com/{namespace}/{project}/-/merge_requests/{number}');
23
+ }
24
+ const [, fullProjectPath, mrNumber] = match;
25
+ if (!fullProjectPath || !mrNumber) {
26
+ throw new ErodeError('Incomplete GitLab MR URL: project path or merge request number is missing', ErrorCode.PLATFORM_INVALID_URL, 'Incomplete GitLab MR URL: project path or merge request number is missing');
27
+ }
28
+ const lastSlashIndex = fullProjectPath.lastIndexOf('/');
29
+ const owner = fullProjectPath.substring(0, lastSlashIndex);
30
+ const repo = fullProjectPath.substring(lastSlashIndex + 1);
31
+ return {
32
+ number: parseInt(mrNumber, 10),
33
+ url,
34
+ repositoryUrl: `https://gitlab.com/${fullProjectPath}`,
35
+ platformId: { owner, repo },
36
+ };
37
+ }
38
+ async fetchChangeRequest(ref) {
39
+ const owner = ref.platformId.owner;
40
+ const repo = ref.platformId.repo;
41
+ const projectPath = `${owner}/${repo}`;
42
+ const mrIid = ref.number;
43
+ try {
44
+ const mr = validate(GitLabMrResponseSchema, await this.api.MergeRequests.show(projectPath, mrIid), 'GitLab MR response');
45
+ const diffs = validate(z.array(GitLabDiffEntrySchema), await this.api.MergeRequests.allDiffs(projectPath, mrIid), 'GitLab MR diffs');
46
+ const files = diffs.map((d) => {
47
+ const diffStr = d.diff ?? '';
48
+ const lines = diffStr.split('\n');
49
+ const additions = lines.filter((l) => l.startsWith('+') && !l.startsWith('+++')).length;
50
+ const deletions = lines.filter((l) => l.startsWith('-') && !l.startsWith('---')).length;
51
+ return {
52
+ filename: d.new_path,
53
+ status: d.new_file
54
+ ? 'added'
55
+ : d.deleted_file
56
+ ? 'removed'
57
+ : d.renamed_file
58
+ ? 'renamed'
59
+ : 'modified',
60
+ additions,
61
+ deletions,
62
+ changes: additions + deletions,
63
+ patch: diffStr || undefined,
64
+ };
65
+ });
66
+ const totalLines = files.reduce((sum, f) => sum + f.changes, 0);
67
+ const { files: filesToInclude, wasTruncated, truncationReason, } = applyDiffTruncation(files, totalLines);
68
+ const diff = diffs
69
+ .map((d) => {
70
+ if (!d.diff)
71
+ return '';
72
+ return `diff --git a/${d.old_path} b/${d.new_path}\n${d.diff}`;
73
+ })
74
+ .filter(Boolean)
75
+ .join('\n\n');
76
+ const totalAdditions = files.reduce((sum, f) => sum + f.additions, 0);
77
+ const totalDeletions = files.reduce((sum, f) => sum + f.deletions, 0);
78
+ return validate(ChangeRequestDataSchema, {
79
+ number: mr.iid,
80
+ title: mr.title,
81
+ body: mr.description ?? null,
82
+ state: mr.state,
83
+ author: {
84
+ login: mr.author?.username ?? 'unknown',
85
+ name: mr.author?.name,
86
+ },
87
+ base: {
88
+ ref: mr.target_branch,
89
+ sha: mr.diff_refs?.base_sha ?? '',
90
+ },
91
+ head: {
92
+ ref: mr.source_branch,
93
+ sha: mr.diff_refs?.head_sha ?? '',
94
+ },
95
+ commits: mr.commits_count,
96
+ additions: totalAdditions,
97
+ deletions: totalDeletions,
98
+ changed_files: diffs.length,
99
+ files: filesToInclude,
100
+ diff,
101
+ stats: {
102
+ total: totalAdditions + totalDeletions,
103
+ additions: totalAdditions,
104
+ deletions: totalDeletions,
105
+ },
106
+ wasTruncated,
107
+ truncationReason,
108
+ }, 'GitLab change request data');
109
+ }
110
+ catch (error) {
111
+ wrapPlatformError(error, 'gitlab', 'Could not retrieve merge request');
112
+ }
113
+ }
114
+ async fetchChangeRequestCommits(ref) {
115
+ const owner = ref.platformId.owner;
116
+ const repo = ref.platformId.repo;
117
+ const projectPath = `${owner}/${repo}`;
118
+ const mrIid = ref.number;
119
+ try {
120
+ const commits = validate(z.array(GitLabCommitEntrySchema), await this.api.MergeRequests.allCommits(projectPath, mrIid), 'GitLab MR commits');
121
+ const result = commits.map((commit) => ({
122
+ sha: commit.id,
123
+ message: commit.message,
124
+ author: {
125
+ name: commit.author_name ?? 'Unknown',
126
+ email: commit.author_email ?? 'unknown@example.com',
127
+ },
128
+ }));
129
+ return validate(z.array(ChangeRequestCommitSchema), result, 'GitLab change request commits');
130
+ }
131
+ catch (error) {
132
+ wrapPlatformError(error, 'gitlab', 'Could not retrieve merge request commits');
133
+ }
134
+ }
135
+ }
136
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/platforms/gitlab/reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { SourcePlatformWriter, ChangeRequestRef, ChangeRequestResult, CreateOrUpdateChangeRequestOptions } from '../source-platform.js';
2
+ export declare class GitLabWriter implements SourcePlatformWriter {
3
+ private readonly api;
4
+ private readonly projectPath;
5
+ constructor(targetOwner: string, targetRepo: string);
6
+ createOrUpdateChangeRequest(options: CreateOrUpdateChangeRequestOptions): Promise<ChangeRequestResult>;
7
+ commentOnChangeRequest(ref: ChangeRequestRef, body: string, options?: {
8
+ upsertMarker?: string;
9
+ }): Promise<void>;
10
+ deleteComment(ref: ChangeRequestRef, marker: string): Promise<void>;
11
+ closeChangeRequest(branchName: string): Promise<void>;
12
+ private findNoteByMarker;
13
+ }
14
+ //# sourceMappingURL=writer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../../src/platforms/gitlab/writer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,kCAAkC,EACnC,MAAM,uBAAuB,CAAC;AAS/B,qBAAa,YAAa,YAAW,oBAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA8B;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAa7C,2BAA2B,CAC/B,OAAO,EAAE,kCAAkC,GAC1C,OAAO,CAAC,mBAAmB,CAAC;IAuEzB,sBAAsB,CAC1B,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAClC,OAAO,CAAC,IAAI,CAAC;IAuBV,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAenE,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAmB7C,gBAAgB;CAY/B"}