@urateam/core 0.1.42 → 0.1.43

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 (100) hide show
  1. package/dist/__tests__/bitbucket-webhook.test.d.ts +13 -0
  2. package/dist/__tests__/bitbucket-webhook.test.d.ts.map +1 -0
  3. package/dist/__tests__/bitbucket-webhook.test.js +379 -0
  4. package/dist/__tests__/bitbucket-webhook.test.js.map +1 -0
  5. package/dist/__tests__/bitbucket.test.d.ts +15 -0
  6. package/dist/__tests__/bitbucket.test.d.ts.map +1 -0
  7. package/dist/__tests__/bitbucket.test.js +237 -0
  8. package/dist/__tests__/bitbucket.test.js.map +1 -0
  9. package/dist/__tests__/gitlab-webhook.test.d.ts +13 -0
  10. package/dist/__tests__/gitlab-webhook.test.d.ts.map +1 -0
  11. package/dist/__tests__/gitlab-webhook.test.js +388 -0
  12. package/dist/__tests__/gitlab-webhook.test.js.map +1 -0
  13. package/dist/__tests__/runner-multi-vcs.test.d.ts +19 -0
  14. package/dist/__tests__/runner-multi-vcs.test.d.ts.map +1 -0
  15. package/dist/__tests__/runner-multi-vcs.test.js +346 -0
  16. package/dist/__tests__/runner-multi-vcs.test.js.map +1 -0
  17. package/dist/__tests__/triage-v2-prediction.test.d.ts +2 -0
  18. package/dist/__tests__/triage-v2-prediction.test.d.ts.map +1 -0
  19. package/dist/__tests__/triage-v2-prediction.test.js +70 -0
  20. package/dist/__tests__/triage-v2-prediction.test.js.map +1 -0
  21. package/dist/__tests__/triage-v2-prompt.test.d.ts +2 -0
  22. package/dist/__tests__/triage-v2-prompt.test.d.ts.map +1 -0
  23. package/dist/__tests__/triage-v2-prompt.test.js +127 -0
  24. package/dist/__tests__/triage-v2-prompt.test.js.map +1 -0
  25. package/dist/__tests__/triage-v2-render.test.d.ts +2 -0
  26. package/dist/__tests__/triage-v2-render.test.d.ts.map +1 -0
  27. package/dist/__tests__/triage-v2-render.test.js +200 -0
  28. package/dist/__tests__/triage-v2-render.test.js.map +1 -0
  29. package/dist/__tests__/triage-v2-schema.test.d.ts +2 -0
  30. package/dist/__tests__/triage-v2-schema.test.d.ts.map +1 -0
  31. package/dist/__tests__/triage-v2-schema.test.js +115 -0
  32. package/dist/__tests__/triage-v2-schema.test.js.map +1 -0
  33. package/dist/index.d.ts +1 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/pipeline/feedback-pipeline.d.ts +2 -0
  37. package/dist/pipeline/feedback-pipeline.d.ts.map +1 -1
  38. package/dist/pipeline/feedback-pipeline.js +4 -1
  39. package/dist/pipeline/feedback-pipeline.js.map +1 -1
  40. package/dist/pipeline/runner.d.ts +11 -0
  41. package/dist/pipeline/runner.d.ts.map +1 -1
  42. package/dist/pipeline/runner.js +314 -114
  43. package/dist/pipeline/runner.js.map +1 -1
  44. package/dist/pm/actions/triage-prompt.d.ts +42 -0
  45. package/dist/pm/actions/triage-prompt.d.ts.map +1 -0
  46. package/dist/pm/actions/triage-prompt.js +192 -0
  47. package/dist/pm/actions/triage-prompt.js.map +1 -0
  48. package/dist/pm/actions/triage-render.d.ts +39 -0
  49. package/dist/pm/actions/triage-render.d.ts.map +1 -0
  50. package/dist/pm/actions/triage-render.js +158 -0
  51. package/dist/pm/actions/triage-render.js.map +1 -0
  52. package/dist/pm/actions/triage.d.ts +2 -1
  53. package/dist/pm/actions/triage.d.ts.map +1 -1
  54. package/dist/pm/actions/triage.js +44 -58
  55. package/dist/pm/actions/triage.js.map +1 -1
  56. package/dist/pm/triage-prediction-quality.d.ts +26 -0
  57. package/dist/pm/triage-prediction-quality.d.ts.map +1 -0
  58. package/dist/pm/triage-prediction-quality.js +41 -0
  59. package/dist/pm/triage-prediction-quality.js.map +1 -0
  60. package/dist/pm/types.d.ts +60 -0
  61. package/dist/pm/types.d.ts.map +1 -1
  62. package/dist/pm/types.js +119 -0
  63. package/dist/pm/types.js.map +1 -1
  64. package/dist/repo/bitbucket.d.ts +136 -0
  65. package/dist/repo/bitbucket.d.ts.map +1 -0
  66. package/dist/repo/bitbucket.js +237 -0
  67. package/dist/repo/bitbucket.js.map +1 -0
  68. package/dist/repo/gitlab.d.ts +11 -0
  69. package/dist/repo/gitlab.d.ts.map +1 -1
  70. package/dist/repo/gitlab.js +37 -0
  71. package/dist/repo/gitlab.js.map +1 -1
  72. package/dist/repo/index.d.ts +3 -1
  73. package/dist/repo/index.d.ts.map +1 -1
  74. package/dist/repo/index.js +2 -1
  75. package/dist/repo/index.js.map +1 -1
  76. package/dist/server.d.ts +14 -0
  77. package/dist/server.d.ts.map +1 -1
  78. package/dist/server.js +32 -0
  79. package/dist/server.js.map +1 -1
  80. package/dist/types.d.ts +1 -0
  81. package/dist/types.d.ts.map +1 -1
  82. package/dist/types.js +2 -2
  83. package/dist/types.js.map +1 -1
  84. package/dist/webhook/bitbucket-handler.d.ts +65 -0
  85. package/dist/webhook/bitbucket-handler.d.ts.map +1 -0
  86. package/dist/webhook/bitbucket-handler.js +153 -0
  87. package/dist/webhook/bitbucket-handler.js.map +1 -0
  88. package/dist/webhook/gitlab-handler.d.ts +66 -0
  89. package/dist/webhook/gitlab-handler.d.ts.map +1 -0
  90. package/dist/webhook/gitlab-handler.js +159 -0
  91. package/dist/webhook/gitlab-handler.js.map +1 -0
  92. package/dist/webhook/index.d.ts +3 -0
  93. package/dist/webhook/index.d.ts.map +1 -1
  94. package/dist/webhook/index.js +3 -0
  95. package/dist/webhook/index.js.map +1 -1
  96. package/dist/webhook/shared-handlers.d.ts +110 -0
  97. package/dist/webhook/shared-handlers.d.ts.map +1 -0
  98. package/dist/webhook/shared-handlers.js +251 -0
  99. package/dist/webhook/shared-handlers.js.map +1 -0
  100. package/package.json +1 -1
package/dist/pm/types.js CHANGED
@@ -38,4 +38,123 @@ export const PmAgentConfigSchema = z.object({
38
38
  })
39
39
  .optional(),
40
40
  });
41
+ // ---------------------------------------------------------------------------
42
+ // Tier 6b — TriageV2 extensions: zod schema + tolerant parser.
43
+ //
44
+ // The schema is `.optional()` per FR-003 so a partial Haiku response still
45
+ // produces a valid v1-shaped TriageResult. `parseTriageV2Extensions()` is a
46
+ // pre-zod filter that truncates excess list entries and drops malformed
47
+ // inner shapes, then runs zod for type-safety on what remains. This shape
48
+ // is the contract between the triage Haiku call and downstream consumers
49
+ // (see specs/001-triage-v2/contracts/triage-result.schema.md).
50
+ // ---------------------------------------------------------------------------
51
+ /** Per-field caps from data-model.md. Tunable in one place. */
52
+ const TRIAGE_V2_CAPS = {
53
+ assumptions: 10,
54
+ examples: 3,
55
+ affectedFiles: 20,
56
+ riskAssessmentAreas: 5,
57
+ };
58
+ export const TriageV2ExtensionsSchema = z
59
+ .object({
60
+ assumptions: z.array(z.string().min(1)).max(TRIAGE_V2_CAPS.assumptions).optional(),
61
+ examples: z
62
+ .array(z.object({
63
+ scenario: z.string().min(1),
64
+ expected: z.string().min(1),
65
+ }))
66
+ .max(TRIAGE_V2_CAPS.examples)
67
+ .optional(),
68
+ affectedFiles: z.array(z.string().min(1)).max(TRIAGE_V2_CAPS.affectedFiles).optional(),
69
+ testStrategy: z
70
+ .object({
71
+ unit: z.string().min(1).optional(),
72
+ integration: z.string().min(1).optional(),
73
+ })
74
+ .optional(),
75
+ riskAssessment: z
76
+ .object({
77
+ severity: z.enum(["low", "medium", "high"]),
78
+ areas: z.array(z.string().min(1)).max(TRIAGE_V2_CAPS.riskAssessmentAreas),
79
+ })
80
+ .optional(),
81
+ })
82
+ .strict();
83
+ /**
84
+ * Tolerant pre-zod normaliser. Filters non-string elements from string
85
+ * arrays, drops examples missing `scenario` or `expected`, truncates list
86
+ * fields to their caps, and trims whitespace. Returns only the v2 fields
87
+ * present in `raw`; absent fields are absent from the result (not set to
88
+ * empty arrays).
89
+ *
90
+ * Drops the entire `riskAssessment` block when the severity enum fails so
91
+ * the caller falls back to the v1 shape rather than partially-populated
92
+ * v2.
93
+ */
94
+ export function parseTriageV2Extensions(raw) {
95
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw)) {
96
+ return {};
97
+ }
98
+ const r = raw;
99
+ const out = {};
100
+ // string-array fields with truncate + filter + trim.
101
+ const collectStringArray = (field, cap) => {
102
+ const value = r[field];
103
+ if (!Array.isArray(value))
104
+ return undefined;
105
+ const cleaned = value
106
+ .filter((v) => typeof v === "string")
107
+ .map((s) => s.trim())
108
+ .filter((s) => s.length > 0);
109
+ return cleaned.length === 0 ? undefined : cleaned.slice(0, cap);
110
+ };
111
+ const assumptions = collectStringArray("assumptions", TRIAGE_V2_CAPS.assumptions);
112
+ if (assumptions)
113
+ out.assumptions = assumptions;
114
+ const affectedFiles = collectStringArray("affectedFiles", TRIAGE_V2_CAPS.affectedFiles);
115
+ if (affectedFiles)
116
+ out.affectedFiles = affectedFiles;
117
+ // examples — drop entries missing either field.
118
+ if (Array.isArray(r.examples)) {
119
+ const cleaned = r.examples
120
+ .filter((e) => typeof e === "object" &&
121
+ e !== null &&
122
+ typeof e.scenario === "string" &&
123
+ typeof e.expected === "string" &&
124
+ (e.scenario.trim().length > 0) &&
125
+ (e.expected.trim().length > 0))
126
+ .map((e) => ({ scenario: e.scenario.trim(), expected: e.expected.trim() }));
127
+ if (cleaned.length > 0) {
128
+ out.examples = cleaned.slice(0, TRIAGE_V2_CAPS.examples);
129
+ }
130
+ }
131
+ // testStrategy — keep whichever sub-fields are present and string-typed.
132
+ if (typeof r.testStrategy === "object" && r.testStrategy !== null && !Array.isArray(r.testStrategy)) {
133
+ const ts = r.testStrategy;
134
+ const out2 = {};
135
+ if (typeof ts.unit === "string" && ts.unit.trim().length > 0)
136
+ out2.unit = ts.unit.trim();
137
+ if (typeof ts.integration === "string" && ts.integration.trim().length > 0) {
138
+ out2.integration = ts.integration.trim();
139
+ }
140
+ if (Object.keys(out2).length > 0)
141
+ out.testStrategy = out2;
142
+ }
143
+ // riskAssessment — strict severity enum check; drop block on miss.
144
+ if (typeof r.riskAssessment === "object" && r.riskAssessment !== null && !Array.isArray(r.riskAssessment)) {
145
+ const ra = r.riskAssessment;
146
+ if (ra.severity === "low" || ra.severity === "medium" || ra.severity === "high") {
147
+ const rawAreas = Array.isArray(ra.areas) ? ra.areas : [];
148
+ const cleanedAreas = rawAreas
149
+ .filter((v) => typeof v === "string")
150
+ .map((s) => s.trim())
151
+ .filter((s) => s.length > 0)
152
+ .slice(0, TRIAGE_V2_CAPS.riskAssessmentAreas);
153
+ out.riskAssessment = { severity: ra.severity, areas: cleanedAreas };
154
+ }
155
+ }
156
+ // Final zod safety net — should always succeed at this point.
157
+ const parsed = TriageV2ExtensionsSchema.safeParse(out);
158
+ return parsed.success ? parsed.data : {};
159
+ }
41
160
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/pm/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;IAC9D,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/C,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;IAC7C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,gGAAgG;IAChG,kBAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC7C,2FAA2F;IAC3F,qBAAqB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACrE,8EAA8E;IAC9E,oBAAoB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD;;;;OAIG;IACH,8BAA8B,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC;IAC1D;;;;OAIG;IACH,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1D,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,kIAAkI;QAClI,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;QAC/C,6FAA6F;QAC7F,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC5E,4FAA4F;QAC5F,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE;QAC5E,kFAAkF;QAClF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;KAC3C,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/pm/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Bitbucket Cloud repo provider.
3
+ *
4
+ * Supports:
5
+ * - Clone via OAuth access token (embed credentials in the remote URL).
6
+ * - Pull request creation via the Bitbucket REST API v2.
7
+ * - PR comment posting and merging.
8
+ *
9
+ * ## Environment / Authentication
10
+ *
11
+ * Bitbucket Cloud supports two auth methods:
12
+ * 1. **OAuth access token** — set `accessToken` in `BitbucketConfig`.
13
+ * Clone URL becomes `https://x-token-auth:<token>@bitbucket.org/workspace/repo.git`.
14
+ * 2. **App Password** — set `appUsername` + `appPassword` in `BitbucketConfig`.
15
+ * Clone URL becomes `https://<username>:<app_password>@bitbucket.org/workspace/repo.git`.
16
+ *
17
+ * At least one of the two auth methods must be provided for API calls.
18
+ * The `workspace` and `repoSlug` fields identify the repository.
19
+ *
20
+ * ## API Reference
21
+ * All API calls target `https://api.bitbucket.org/2.0/repositories/{workspace}/{repo_slug}`.
22
+ * See https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/pullrequests
23
+ */
24
+ export interface BitbucketConfig {
25
+ /**
26
+ * OAuth 2.0 access token. When provided, used as Bearer token for API calls
27
+ * and embedded as `x-token-auth:<token>` user in clone URLs.
28
+ * Mutually exclusive with appUsername+appPassword (accessToken takes priority).
29
+ */
30
+ accessToken?: string;
31
+ /**
32
+ * Bitbucket username for App Password authentication.
33
+ * Required when accessToken is not provided.
34
+ */
35
+ appUsername?: string;
36
+ /**
37
+ * Bitbucket App Password for authentication.
38
+ * Required when accessToken is not provided.
39
+ */
40
+ appPassword?: string;
41
+ /**
42
+ * Bitbucket Cloud API base URL. Defaults to "https://api.bitbucket.org/2.0".
43
+ * Override for Bitbucket Data Center (self-hosted) instances.
44
+ */
45
+ apiBaseUrl?: string;
46
+ }
47
+ export interface CreateBitbucketPROptions {
48
+ /** Bitbucket workspace slug, e.g. "myworkspace". */
49
+ workspace: string;
50
+ /** Repository slug, e.g. "myrepo". */
51
+ repoSlug: string;
52
+ /** Source branch to merge from. */
53
+ sourceBranch: string;
54
+ /** Target branch to merge into. */
55
+ targetBranch: string;
56
+ title: string;
57
+ description: string;
58
+ /** Whether to create as draft (Bitbucket calls them "draft" PRs since 2022). */
59
+ draft?: boolean;
60
+ }
61
+ /**
62
+ * Inject Bitbucket credentials into an HTTPS clone URL so that
63
+ * `git clone` / `git push` works without interactive prompts.
64
+ *
65
+ * Input: https://bitbucket.org/myworkspace/myrepo.git
66
+ * Output (OAuth): https://x-token-auth:<token>@bitbucket.org/myworkspace/myrepo.git
67
+ * Output (App Password): https://username:<app_password>@bitbucket.org/myworkspace/myrepo.git
68
+ *
69
+ * If the URL already contains credentials this is a no-op.
70
+ *
71
+ * @requires BITBUCKET_ACCESS_TOKEN or BITBUCKET_APP_USERNAME + BITBUCKET_APP_PASSWORD env vars
72
+ * (or provide them directly via `config`).
73
+ */
74
+ export declare function buildBitbucketAuthenticatedUrl(repoUrl: string, config: BitbucketConfig): string;
75
+ /**
76
+ * Parse a Bitbucket repo URL into workspace and repoSlug.
77
+ * Handles formats like:
78
+ * - https://bitbucket.org/workspace/repo
79
+ * - https://bitbucket.org/workspace/repo.git
80
+ * - https://bitbucket.org/workspace/my.repo (slug containing dots)
81
+ * - git@bitbucket.org:workspace/repo.git
82
+ *
83
+ * The slug capture group accepts dots so repos like `my.repo` parse correctly;
84
+ * a trailing `.git` (if present) is stripped from the captured slug.
85
+ */
86
+ export declare function parseBitbucketUrl(url: string): {
87
+ workspace: string;
88
+ repoSlug: string;
89
+ };
90
+ /**
91
+ * Clone a Bitbucket repository to the given directory using the provided
92
+ * BitbucketConfig credentials. Credentials are injected via
93
+ * `buildBitbucketAuthenticatedUrl()`; the result is delegated to the generic
94
+ * `cloneRepo()` helper from `repo/git.ts`.
95
+ *
96
+ * @param config - Bitbucket auth config (OAuth access token or App Password).
97
+ * @param repoUrl - Public Bitbucket repo URL (credentials will be injected).
98
+ * @param destDir - Local directory to clone into.
99
+ */
100
+ export declare function cloneBitbucketRepo(config: BitbucketConfig, repoUrl: string, destDir: string): Promise<void>;
101
+ /**
102
+ * Push a branch to a Bitbucket remote.
103
+ *
104
+ * Note: the actual `git push` reuses the remote configured on the worktree
105
+ * (which already carries the auth credentials from `cloneBitbucketRepo`).
106
+ * The `config` and `repoUrl` parameters are accepted for symmetry with the
107
+ * gitlab surface — they let callers stay provider-agnostic at the type level
108
+ * even though they aren't required for the underlying push operation.
109
+ *
110
+ * @param config - Bitbucket auth config (unused at runtime; see note above).
111
+ * @param repoUrl - Public Bitbucket repo URL (unused at runtime; see note above).
112
+ * @param worktreePath - Local worktree directory to push from.
113
+ * @param branch - Branch name to push.
114
+ */
115
+ export declare function pushBitbucketCode(config: BitbucketConfig, repoUrl: string, worktreePath: string, branch: string): Promise<void>;
116
+ /**
117
+ * Create a pull request via the Bitbucket REST API v2.
118
+ *
119
+ * @requires BITBUCKET_ACCESS_TOKEN or (BITBUCKET_APP_USERNAME + BITBUCKET_APP_PASSWORD)
120
+ * Returns the PR web URL on success.
121
+ */
122
+ export declare function createBitbucketPR(config: BitbucketConfig, options: CreateBitbucketPROptions): Promise<string>;
123
+ /**
124
+ * Add a comment to an existing Bitbucket pull request.
125
+ *
126
+ * @requires BITBUCKET_ACCESS_TOKEN or (BITBUCKET_APP_USERNAME + BITBUCKET_APP_PASSWORD)
127
+ */
128
+ export declare function addBitbucketPRComment(config: BitbucketConfig, workspace: string, repoSlug: string, prId: number, body: string): Promise<void>;
129
+ /**
130
+ * Merge a Bitbucket pull request via the REST API.
131
+ *
132
+ * @requires BITBUCKET_ACCESS_TOKEN or (BITBUCKET_APP_USERNAME + BITBUCKET_APP_PASSWORD)
133
+ * Returns true on success, false when the merge failed.
134
+ */
135
+ export declare function mergeBitbucketPR(config: BitbucketConfig, workspace: string, repoSlug: string, prId: number, mergeStrategy?: "merge_commit" | "squash" | "fast_forward"): Promise<boolean>;
136
+ //# sourceMappingURL=bitbucket.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitbucket.d.ts","sourceRoot":"","sources":["../../src/repo/bitbucket.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAiCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,eAAe,GACtB,MAAM,CAkBR;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,GACV;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAiBzC;AAQD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAIf;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAOf;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,eAAe,EACvB,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAkCjB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAmBf;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,aAAa,GAAE,cAAc,GAAG,QAAQ,GAAG,cAAyB,GACnE,OAAO,CAAC,OAAO,CAAC,CAgClB"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Bitbucket Cloud repo provider.
3
+ *
4
+ * Supports:
5
+ * - Clone via OAuth access token (embed credentials in the remote URL).
6
+ * - Pull request creation via the Bitbucket REST API v2.
7
+ * - PR comment posting and merging.
8
+ *
9
+ * ## Environment / Authentication
10
+ *
11
+ * Bitbucket Cloud supports two auth methods:
12
+ * 1. **OAuth access token** — set `accessToken` in `BitbucketConfig`.
13
+ * Clone URL becomes `https://x-token-auth:<token>@bitbucket.org/workspace/repo.git`.
14
+ * 2. **App Password** — set `appUsername` + `appPassword` in `BitbucketConfig`.
15
+ * Clone URL becomes `https://<username>:<app_password>@bitbucket.org/workspace/repo.git`.
16
+ *
17
+ * At least one of the two auth methods must be provided for API calls.
18
+ * The `workspace` and `repoSlug` fields identify the repository.
19
+ *
20
+ * ## API Reference
21
+ * All API calls target `https://api.bitbucket.org/2.0/repositories/{workspace}/{repo_slug}`.
22
+ * See https://developer.atlassian.com/bitbucket/api/2/reference/resource/repositories/%7Bworkspace%7D/%7Brepo_slug%7D/pullrequests
23
+ */
24
+ // ---------------------------------------------------------------------------
25
+ // Internal helpers
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * Build Authorization header value from config.
29
+ * Returns a Bearer token string (OAuth) or Basic auth string (App Password).
30
+ */
31
+ function buildAuthHeader(config) {
32
+ if (config.accessToken) {
33
+ return `Bearer ${config.accessToken}`;
34
+ }
35
+ if (config.appUsername && config.appPassword) {
36
+ const encoded = Buffer.from(`${config.appUsername}:${config.appPassword}`).toString("base64");
37
+ return `Basic ${encoded}`;
38
+ }
39
+ throw new Error("BitbucketConfig requires either accessToken or appUsername+appPassword");
40
+ }
41
+ function getApiBase(config) {
42
+ return config.apiBaseUrl ?? "https://api.bitbucket.org/2.0";
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // Public API
46
+ // ---------------------------------------------------------------------------
47
+ /**
48
+ * Inject Bitbucket credentials into an HTTPS clone URL so that
49
+ * `git clone` / `git push` works without interactive prompts.
50
+ *
51
+ * Input: https://bitbucket.org/myworkspace/myrepo.git
52
+ * Output (OAuth): https://x-token-auth:<token>@bitbucket.org/myworkspace/myrepo.git
53
+ * Output (App Password): https://username:<app_password>@bitbucket.org/myworkspace/myrepo.git
54
+ *
55
+ * If the URL already contains credentials this is a no-op.
56
+ *
57
+ * @requires BITBUCKET_ACCESS_TOKEN or BITBUCKET_APP_USERNAME + BITBUCKET_APP_PASSWORD env vars
58
+ * (or provide them directly via `config`).
59
+ */
60
+ export function buildBitbucketAuthenticatedUrl(repoUrl, config) {
61
+ const parsed = new URL(repoUrl);
62
+ if (parsed.username) {
63
+ // Already has credentials — don't overwrite.
64
+ return repoUrl;
65
+ }
66
+ if (config.accessToken) {
67
+ parsed.username = "x-token-auth";
68
+ parsed.password = config.accessToken;
69
+ }
70
+ else if (config.appUsername && config.appPassword) {
71
+ parsed.username = config.appUsername;
72
+ parsed.password = config.appPassword;
73
+ }
74
+ else {
75
+ throw new Error("BitbucketConfig requires either accessToken or appUsername+appPassword");
76
+ }
77
+ return parsed.toString();
78
+ }
79
+ /**
80
+ * Parse a Bitbucket repo URL into workspace and repoSlug.
81
+ * Handles formats like:
82
+ * - https://bitbucket.org/workspace/repo
83
+ * - https://bitbucket.org/workspace/repo.git
84
+ * - https://bitbucket.org/workspace/my.repo (slug containing dots)
85
+ * - git@bitbucket.org:workspace/repo.git
86
+ *
87
+ * The slug capture group accepts dots so repos like `my.repo` parse correctly;
88
+ * a trailing `.git` (if present) is stripped from the captured slug.
89
+ */
90
+ export function parseBitbucketUrl(url) {
91
+ // Slug pattern: any chars except `/`, terminated by `/`, `?`, `#`, or end-of-string.
92
+ // We capture trailing `.git` if present and strip it below so dot-containing
93
+ // slugs (e.g. `my.repo`) round-trip correctly.
94
+ const stripGit = (s) => (s.endsWith(".git") ? s.slice(0, -4) : s);
95
+ // SSH format: git@bitbucket.org:workspace/repo.git
96
+ const sshMatch = url.match(/git@bitbucket\.org:([^/]+)\/([^/?#]+?)(?:\.git)?(?:[/?#]|$)/);
97
+ if (sshMatch) {
98
+ return { workspace: sshMatch[1], repoSlug: stripGit(sshMatch[2]) };
99
+ }
100
+ // HTTPS format: https://bitbucket.org/workspace/repo[.git]
101
+ const httpMatch = url.match(/bitbucket\.org\/([^/]+)\/([^/?#]+?)(?:\.git)?(?:[/?#]|$)/);
102
+ if (httpMatch) {
103
+ return { workspace: httpMatch[1], repoSlug: stripGit(httpMatch[2]) };
104
+ }
105
+ throw new Error(`Unable to parse Bitbucket repo URL: ${url}`);
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // Thin wrappers around the generic git helpers, mirroring repo/gitlab.ts's
109
+ // public surface (clone + push). Provided so callers can stay provider-aware
110
+ // without reaching into both `repo/git.ts` and `repo/bitbucket.ts`.
111
+ // ---------------------------------------------------------------------------
112
+ /**
113
+ * Clone a Bitbucket repository to the given directory using the provided
114
+ * BitbucketConfig credentials. Credentials are injected via
115
+ * `buildBitbucketAuthenticatedUrl()`; the result is delegated to the generic
116
+ * `cloneRepo()` helper from `repo/git.ts`.
117
+ *
118
+ * @param config - Bitbucket auth config (OAuth access token or App Password).
119
+ * @param repoUrl - Public Bitbucket repo URL (credentials will be injected).
120
+ * @param destDir - Local directory to clone into.
121
+ */
122
+ export async function cloneBitbucketRepo(config, repoUrl, destDir) {
123
+ const { cloneRepo } = await import("./git.js");
124
+ const authedUrl = buildBitbucketAuthenticatedUrl(repoUrl, config);
125
+ await cloneRepo(authedUrl, destDir);
126
+ }
127
+ /**
128
+ * Push a branch to a Bitbucket remote.
129
+ *
130
+ * Note: the actual `git push` reuses the remote configured on the worktree
131
+ * (which already carries the auth credentials from `cloneBitbucketRepo`).
132
+ * The `config` and `repoUrl` parameters are accepted for symmetry with the
133
+ * gitlab surface — they let callers stay provider-agnostic at the type level
134
+ * even though they aren't required for the underlying push operation.
135
+ *
136
+ * @param config - Bitbucket auth config (unused at runtime; see note above).
137
+ * @param repoUrl - Public Bitbucket repo URL (unused at runtime; see note above).
138
+ * @param worktreePath - Local worktree directory to push from.
139
+ * @param branch - Branch name to push.
140
+ */
141
+ export async function pushBitbucketCode(config, repoUrl, worktreePath, branch) {
142
+ // Reference the parameters so unused-vars lint stays quiet without
143
+ // breaking the documented signature.
144
+ void config;
145
+ void repoUrl;
146
+ const { pushBranch } = await import("./git.js");
147
+ await pushBranch(worktreePath, branch);
148
+ }
149
+ /**
150
+ * Create a pull request via the Bitbucket REST API v2.
151
+ *
152
+ * @requires BITBUCKET_ACCESS_TOKEN or (BITBUCKET_APP_USERNAME + BITBUCKET_APP_PASSWORD)
153
+ * Returns the PR web URL on success.
154
+ */
155
+ export async function createBitbucketPR(config, options) {
156
+ const { workspace, repoSlug, sourceBranch, targetBranch, title, description, draft } = options;
157
+ const apiBase = getApiBase(config);
158
+ const apiUrl = `${apiBase}/repositories/${encodeURIComponent(workspace)}/${encodeURIComponent(repoSlug)}/pullrequests`;
159
+ const body = {
160
+ title,
161
+ description,
162
+ source: { branch: { name: sourceBranch } },
163
+ destination: { branch: { name: targetBranch } },
164
+ close_source_branch: true,
165
+ };
166
+ if (draft) {
167
+ body.draft = true;
168
+ }
169
+ const response = await fetch(apiUrl, {
170
+ method: "POST",
171
+ headers: {
172
+ "Content-Type": "application/json",
173
+ Authorization: buildAuthHeader(config),
174
+ },
175
+ body: JSON.stringify(body),
176
+ });
177
+ if (!response.ok) {
178
+ const text = await response.text().catch(() => "<no body>");
179
+ throw new Error(`Bitbucket API error ${response.status} creating PR: ${text}`);
180
+ }
181
+ const data = (await response.json());
182
+ return data.links.html.href;
183
+ }
184
+ /**
185
+ * Add a comment to an existing Bitbucket pull request.
186
+ *
187
+ * @requires BITBUCKET_ACCESS_TOKEN or (BITBUCKET_APP_USERNAME + BITBUCKET_APP_PASSWORD)
188
+ */
189
+ export async function addBitbucketPRComment(config, workspace, repoSlug, prId, body) {
190
+ const apiBase = getApiBase(config);
191
+ const apiUrl = `${apiBase}/repositories/${encodeURIComponent(workspace)}/${encodeURIComponent(repoSlug)}/pullrequests/${prId}/comments`;
192
+ const response = await fetch(apiUrl, {
193
+ method: "POST",
194
+ headers: {
195
+ "Content-Type": "application/json",
196
+ Authorization: buildAuthHeader(config),
197
+ },
198
+ body: JSON.stringify({ content: { raw: body } }),
199
+ });
200
+ if (!response.ok) {
201
+ const text = await response.text().catch(() => "<no body>");
202
+ throw new Error(`Bitbucket API error ${response.status} adding PR comment: ${text}`);
203
+ }
204
+ }
205
+ /**
206
+ * Merge a Bitbucket pull request via the REST API.
207
+ *
208
+ * @requires BITBUCKET_ACCESS_TOKEN or (BITBUCKET_APP_USERNAME + BITBUCKET_APP_PASSWORD)
209
+ * Returns true on success, false when the merge failed.
210
+ */
211
+ export async function mergeBitbucketPR(config, workspace, repoSlug, prId, mergeStrategy = "squash") {
212
+ const apiBase = getApiBase(config);
213
+ const apiUrl = `${apiBase}/repositories/${encodeURIComponent(workspace)}/${encodeURIComponent(repoSlug)}/pullrequests/${prId}/merge`;
214
+ try {
215
+ const response = await fetch(apiUrl, {
216
+ method: "POST",
217
+ headers: {
218
+ "Content-Type": "application/json",
219
+ Authorization: buildAuthHeader(config),
220
+ },
221
+ body: JSON.stringify({ merge_strategy: mergeStrategy }),
222
+ });
223
+ if (!response.ok) {
224
+ const text = await response.text().catch(() => "<no body>");
225
+ const { createLogger } = await import("../logger.js");
226
+ createLogger({ module: "repo/bitbucket" }).error({ status: response.status, body: text }, "Bitbucket merge API error");
227
+ return false;
228
+ }
229
+ return true;
230
+ }
231
+ catch (err) {
232
+ const { createLogger } = await import("../logger.js");
233
+ createLogger({ module: "repo/bitbucket" }).error({ err }, "Bitbucket merge request failed");
234
+ return false;
235
+ }
236
+ }
237
+ //# sourceMappingURL=bitbucket.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bitbucket.js","sourceRoot":"","sources":["../../src/repo/bitbucket.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,17 @@ export declare function buildAuthenticatedUrl(repoUrl: string, config: GitLabCon
44
44
  * Returns the MR web URL on success.
45
45
  */
46
46
  export declare function createMR(config: GitLabConfig, options: CreateMROptions): Promise<string>;
47
+ /**
48
+ * Trigger merge when all CI pipelines succeed (`merge_when_pipeline_succeeds`).
49
+ *
50
+ * Equivalent to clicking "Merge when pipeline succeeds" in the GitLab UI.
51
+ * Returns true when the API accepted the request, false on failure.
52
+ *
53
+ * @param config - GitLab authentication config (token + optional host).
54
+ * @param projectPath - GitLab namespace+project path, e.g. "myorg/myrepo".
55
+ * @param mrIid - The merge request IID (internal ID shown in the URL, e.g. 42).
56
+ */
57
+ export declare function mergeMRWhenPipelineSucceeds(config: GitLabConfig, projectPath: string, mrIid: number): Promise<boolean>;
47
58
  /**
48
59
  * Add a comment (note) to an existing merge request.
49
60
  */
@@ -1 +1 @@
1
- {"version":3,"file":"gitlab.d.ts","sourceRoot":"","sources":["../../src/repo/gitlab.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,EACpB,SAAS,SAAW,GACnB,MAAM,CASR;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CAyDjB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAoBf"}
1
+ {"version":3,"file":"gitlab.d.ts","sourceRoot":"","sources":["../../src/repo/gitlab.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,YAAY;IAC3B,mFAAmF;IACnF,KAAK,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,0DAA0D;IAC1D,WAAW,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,yDAAyD;IACzD,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,EACpB,SAAS,SAAW,GACnB,MAAM,CASR;AAED;;;GAGG;AACH,wBAAsB,QAAQ,CAC5B,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,MAAM,CAAC,CAyDjB;AAED;;;;;;;;;GASG;AACH,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,OAAO,CAAC,CAiClB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAoBf"}
@@ -75,6 +75,43 @@ export async function createMR(config, options) {
75
75
  const data = (await response.json());
76
76
  return data.web_url;
77
77
  }
78
+ /**
79
+ * Trigger merge when all CI pipelines succeed (`merge_when_pipeline_succeeds`).
80
+ *
81
+ * Equivalent to clicking "Merge when pipeline succeeds" in the GitLab UI.
82
+ * Returns true when the API accepted the request, false on failure.
83
+ *
84
+ * @param config - GitLab authentication config (token + optional host).
85
+ * @param projectPath - GitLab namespace+project path, e.g. "myorg/myrepo".
86
+ * @param mrIid - The merge request IID (internal ID shown in the URL, e.g. 42).
87
+ */
88
+ export async function mergeMRWhenPipelineSucceeds(config, projectPath, mrIid) {
89
+ const host = config.host ?? "https://gitlab.com";
90
+ const encodedPath = encodeURIComponent(projectPath);
91
+ const apiUrl = `${host}/api/v4/projects/${encodedPath}/merge_requests/${mrIid}/merge`;
92
+ try {
93
+ const response = await fetch(apiUrl, {
94
+ method: "PUT",
95
+ headers: {
96
+ "Content-Type": "application/json",
97
+ "PRIVATE-TOKEN": config.token,
98
+ },
99
+ body: JSON.stringify({ merge_when_pipeline_succeeds: true }),
100
+ });
101
+ if (!response.ok) {
102
+ const text = await response.text().catch(() => "<no body>");
103
+ const { createLogger } = await import("../logger.js");
104
+ createLogger({ module: "repo/gitlab" }).error({ status: response.status, body: text, mrIid }, "GitLab merge_when_pipeline_succeeds API error");
105
+ return false;
106
+ }
107
+ return true;
108
+ }
109
+ catch (err) {
110
+ const { createLogger } = await import("../logger.js");
111
+ createLogger({ module: "repo/gitlab" }).error({ err, mrIid }, "GitLab mergeMRWhenPipelineSucceeds request failed");
112
+ return false;
113
+ }
114
+ }
78
115
  /**
79
116
  * Add a comment (note) to an existing merge request.
80
117
  */
@@ -1 +1 @@
1
- {"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../../src/repo/gitlab.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gitlab.js","sourceRoot":"","sources":["../../src/repo/gitlab.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  export { gitExec, gitExecSafe, gitExecRaw, cloneRepo, fetchLatest, createWorktree, createWorktreeFromRemote, deleteWorktree, pushBranch, pushBranchForce, autoCommitChanges, rebaseBranch, abortRebase, createPRViaCli, mergePRViaCli, getDiffLineCount, checkDuplicateBranch, branchName, getCurrentBranch, verifyBranchMatch, installPrePushHook, cleanupWorktrees, } from "./git.js";
2
2
  export { createGitHubClient, createPR, addPRComment, } from "./github.js";
3
3
  export type { GitHubConfig, CreatePROptions } from "./github.js";
4
- export { buildAuthenticatedUrl, createMR, addMRComment, } from "./gitlab.js";
4
+ export { buildAuthenticatedUrl, createMR, addMRComment, mergeMRWhenPipelineSucceeds, } from "./gitlab.js";
5
5
  export type { GitLabConfig, CreateMROptions } from "./gitlab.js";
6
+ export { buildBitbucketAuthenticatedUrl, createBitbucketPR, addBitbucketPRComment, mergeBitbucketPR, parseBitbucketUrl, cloneBitbucketRepo, pushBitbucketCode, } from "./bitbucket.js";
7
+ export type { BitbucketConfig, CreateBitbucketPROptions } from "./bitbucket.js";
6
8
  export { resolveRepo, parseRepoUrl, parseGitLabUrl } from "./config.js";
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EACL,qBAAqB,EACrB,QAAQ,EACR,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repo/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,cAAc,EACd,wBAAwB,EACxB,cAAc,EACd,UAAU,EACV,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACX,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EACL,qBAAqB,EACrB,QAAQ,EACR,YAAY,EACZ,2BAA2B,GAC5B,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EACL,8BAA8B,EAC9B,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}