@forge-glance/sdk 0.2.0 → 0.2.2

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.
@@ -507,7 +507,7 @@ class GitHubProvider {
507
507
  changesRequested++;
508
508
  }
509
509
  }
510
- const approvalsLeft = changesRequested;
510
+ const approvalsLeft = changesRequested > 0 ? 1 : 0;
511
511
  const diffStats = pr.additions !== undefined ? {
512
512
  additions: pr.additions,
513
513
  deletions: pr.deletions ?? 0,
@@ -540,7 +540,11 @@ class GitHubProvider {
540
540
  approved: approvedBy.length > 0 && changesRequested === 0,
541
541
  approvedBy,
542
542
  diffStats,
543
- detailedMergeStatus: null
543
+ detailedMergeStatus: pr.mergeable_state ?? null,
544
+ autoMergeEnabled: pr.auto_merge != null,
545
+ autoMergeStrategy: pr.auto_merge?.merge_method ?? null,
546
+ mergeUser: pr.auto_merge ? toUserRef(pr.auto_merge.enabled_by) : null,
547
+ mergeAfter: null
544
548
  };
545
549
  }
546
550
  }
@@ -7,7 +7,7 @@ import { type ForgeLogger } from './logger.ts';
7
7
  * e.g. "gitlab:42" → 42
8
8
  */
9
9
  export declare function parseGitLabRepoId(repositoryId: string): number;
10
- export declare const MR_DASHBOARD_FRAGMENT = "\n fragment MRDashboardFields on MergeRequest {\n id iid projectId title description state draft\n sourceBranch targetBranch webUrl\n diffHeadSha\n updatedAt createdAt\n conflicts\n detailedMergeStatus\n approved\n diffStatsSummary { additions deletions fileCount }\n author { id username name avatarUrl }\n assignees(first: 20) { nodes { id username name avatarUrl } }\n reviewers(first: 20) { nodes { id username name avatarUrl } }\n approvedBy(first: 20) { nodes { id username name avatarUrl } }\n approvalsLeft\n resolvableDiscussionsCount\n resolvedDiscussionsCount\n headPipeline {\n id iid status\n createdAt\n path\n stages(first: 20) { nodes {\n name\n jobs(first: 50) { nodes {\n id name status\n allowFailure\n webPath\n stage { name }\n }}\n }}\n }\n }\n";
10
+ export declare const MR_DASHBOARD_FRAGMENT = "\n fragment MRDashboardFields on MergeRequest {\n id iid projectId title description state draft\n sourceBranch targetBranch webUrl\n diffHeadSha\n updatedAt createdAt\n conflicts\n detailedMergeStatus\n approved\n diffStatsSummary { additions deletions fileCount }\n author { id username name avatarUrl }\n assignees(first: 20) { nodes { id username name avatarUrl } }\n reviewers(first: 20) { nodes { id username name avatarUrl } }\n approvedBy(first: 20) { nodes { id username name avatarUrl } }\n approvalsLeft\n resolvableDiscussionsCount\n resolvedDiscussionsCount\n autoMergeEnabled\n autoMergeStrategy\n mergeUser { id username name avatarUrl }\n mergeAfter\n headPipeline {\n id iid status\n createdAt\n path\n stages(first: 20) { nodes {\n name\n jobs(first: 50) { nodes {\n id name status\n allowFailure\n webPath\n stage { name }\n }}\n }}\n }\n }\n";
11
11
  export declare class GitLabProvider implements GitProvider {
12
12
  readonly providerName: "gitlab";
13
13
  readonly baseURL: string;
@@ -92,6 +92,10 @@ var MR_DASHBOARD_FRAGMENT = `
92
92
  approvalsLeft
93
93
  resolvableDiscussionsCount
94
94
  resolvedDiscussionsCount
95
+ autoMergeEnabled
96
+ autoMergeStrategy
97
+ mergeUser { id username name avatarUrl }
98
+ mergeAfter
95
99
  headPipeline {
96
100
  id iid status
97
101
  createdAt
@@ -212,7 +216,11 @@ function toMR(gql, role, baseURL) {
212
216
  approved: gql.approved ?? false,
213
217
  approvedBy: gql.approvedBy.nodes.map(toUserRef),
214
218
  diffStats,
215
- detailedMergeStatus: gql.detailedMergeStatus ?? null
219
+ detailedMergeStatus: gql.detailedMergeStatus ?? null,
220
+ autoMergeEnabled: gql.autoMergeEnabled ?? false,
221
+ autoMergeStrategy: gql.autoMergeStrategy ?? null,
222
+ mergeUser: gql.mergeUser ? toUserRef(gql.mergeUser) : null,
223
+ mergeAfter: gql.mergeAfter ?? null
216
224
  };
217
225
  }
218
226
  var MR_DETAIL_QUERY = `
package/dist/index.js CHANGED
@@ -101,6 +101,10 @@ var MR_DASHBOARD_FRAGMENT = `
101
101
  approvalsLeft
102
102
  resolvableDiscussionsCount
103
103
  resolvedDiscussionsCount
104
+ autoMergeEnabled
105
+ autoMergeStrategy
106
+ mergeUser { id username name avatarUrl }
107
+ mergeAfter
104
108
  headPipeline {
105
109
  id iid status
106
110
  createdAt
@@ -221,7 +225,11 @@ function toMR(gql, role, baseURL) {
221
225
  approved: gql.approved ?? false,
222
226
  approvedBy: gql.approvedBy.nodes.map(toUserRef),
223
227
  diffStats,
224
- detailedMergeStatus: gql.detailedMergeStatus ?? null
228
+ detailedMergeStatus: gql.detailedMergeStatus ?? null,
229
+ autoMergeEnabled: gql.autoMergeEnabled ?? false,
230
+ autoMergeStrategy: gql.autoMergeStrategy ?? null,
231
+ mergeUser: gql.mergeUser ? toUserRef(gql.mergeUser) : null,
232
+ mergeAfter: gql.mergeAfter ?? null
225
233
  };
226
234
  }
227
235
  var MR_DETAIL_QUERY = `
@@ -1147,7 +1155,7 @@ class GitHubProvider {
1147
1155
  changesRequested++;
1148
1156
  }
1149
1157
  }
1150
- const approvalsLeft = changesRequested;
1158
+ const approvalsLeft = changesRequested > 0 ? 1 : 0;
1151
1159
  const diffStats = pr.additions !== undefined ? {
1152
1160
  additions: pr.additions,
1153
1161
  deletions: pr.deletions ?? 0,
@@ -1180,7 +1188,11 @@ class GitHubProvider {
1180
1188
  approved: approvedBy.length > 0 && changesRequested === 0,
1181
1189
  approvedBy,
1182
1190
  diffStats,
1183
- detailedMergeStatus: null
1191
+ detailedMergeStatus: pr.mergeable_state ?? null,
1192
+ autoMergeEnabled: pr.auto_merge != null,
1193
+ autoMergeStrategy: pr.auto_merge?.merge_method ?? null,
1194
+ mergeUser: pr.auto_merge ? toUserRef2(pr.auto_merge.enabled_by) : null,
1195
+ mergeAfter: null
1184
1196
  };
1185
1197
  }
1186
1198
  }
package/dist/providers.js CHANGED
@@ -92,6 +92,10 @@ var MR_DASHBOARD_FRAGMENT = `
92
92
  approvalsLeft
93
93
  resolvableDiscussionsCount
94
94
  resolvedDiscussionsCount
95
+ autoMergeEnabled
96
+ autoMergeStrategy
97
+ mergeUser { id username name avatarUrl }
98
+ mergeAfter
95
99
  headPipeline {
96
100
  id iid status
97
101
  createdAt
@@ -212,7 +216,11 @@ function toMR(gql, role, baseURL) {
212
216
  approved: gql.approved ?? false,
213
217
  approvedBy: gql.approvedBy.nodes.map(toUserRef),
214
218
  diffStats,
215
- detailedMergeStatus: gql.detailedMergeStatus ?? null
219
+ detailedMergeStatus: gql.detailedMergeStatus ?? null,
220
+ autoMergeEnabled: gql.autoMergeEnabled ?? false,
221
+ autoMergeStrategy: gql.autoMergeStrategy ?? null,
222
+ mergeUser: gql.mergeUser ? toUserRef(gql.mergeUser) : null,
223
+ mergeAfter: gql.mergeAfter ?? null
216
224
  };
217
225
  }
218
226
  var MR_DETAIL_QUERY = `
@@ -1138,7 +1146,7 @@ class GitHubProvider {
1138
1146
  changesRequested++;
1139
1147
  }
1140
1148
  }
1141
- const approvalsLeft = changesRequested;
1149
+ const approvalsLeft = changesRequested > 0 ? 1 : 0;
1142
1150
  const diffStats = pr.additions !== undefined ? {
1143
1151
  additions: pr.additions,
1144
1152
  deletions: pr.deletions ?? 0,
@@ -1171,7 +1179,11 @@ class GitHubProvider {
1171
1179
  approved: approvedBy.length > 0 && changesRequested === 0,
1172
1180
  approvedBy,
1173
1181
  diffStats,
1174
- detailedMergeStatus: null
1182
+ detailedMergeStatus: pr.mergeable_state ?? null,
1183
+ autoMergeEnabled: pr.auto_merge != null,
1184
+ autoMergeStrategy: pr.auto_merge?.merge_method ?? null,
1185
+ mergeUser: pr.auto_merge ? toUserRef2(pr.auto_merge.enabled_by) : null,
1186
+ mergeAfter: null
1175
1187
  };
1176
1188
  }
1177
1189
  }
package/dist/types.d.ts CHANGED
@@ -75,6 +75,14 @@ export interface PullRequest {
75
75
  * "not_approved", "discussions_not_resolved". Null for non-GitLab providers.
76
76
  */
77
77
  detailedMergeStatus: string | null;
78
+ /** Whether auto-merge (merge when pipeline succeeds) is currently enabled. */
79
+ autoMergeEnabled: boolean;
80
+ /** The merge strategy that will be used when auto-merge fires, e.g. "merge", "squash", "rebase_merge". */
81
+ autoMergeStrategy: string | null;
82
+ /** The user who merged or enabled auto-merge. */
83
+ mergeUser: UserRef | null;
84
+ /** ISO timestamp after which the MR is eligible to merge (scheduled merge). */
85
+ mergeAfter: string | null;
78
86
  }
79
87
  /** Input for creating a new merge request / pull request. */
80
88
  export interface CreatePullRequestInput {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forge-glance/sdk",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "GitHub & GitLab API client — REST, GraphQL, and real-time ActionCable subscriptions",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -80,6 +80,10 @@ interface GHPullRequest {
80
80
  changed_files?: number;
81
81
  mergeable?: boolean | null;
82
82
  mergeable_state?: string; // "dirty" | "clean" | "unstable" | "blocked" | ...
83
+ auto_merge?: {
84
+ enabled_by: GHUser;
85
+ merge_method: string; // "merge" | "squash" | "rebase"
86
+ } | null;
83
87
  }
84
88
 
85
89
  interface GHReview {
@@ -972,9 +976,10 @@ export class GitHubProvider implements GitProvider {
972
976
  }
973
977
  }
974
978
 
975
- // GitHub doesn't have an "approvals left" concept natively;
976
- // we use changesRequested as a proxy (0 if no changes requested)
977
- const approvalsLeft = changesRequested;
979
+ // GitHub doesn't expose required approval count via REST without the
980
+ // branch protection API. We use changesRequested as a blocking signal:
981
+ // 0 = not blocked by reviews, 1 = at least one CHANGES_REQUESTED review.
982
+ const approvalsLeft = changesRequested > 0 ? 1 : 0;
978
983
 
979
984
  const diffStats: DiffStats | null =
980
985
  pr.additions !== undefined
@@ -1015,7 +1020,11 @@ export class GitHubProvider implements GitProvider {
1015
1020
  approved: approvedBy.length > 0 && changesRequested === 0,
1016
1021
  approvedBy,
1017
1022
  diffStats,
1018
- detailedMergeStatus: null // GitHub-specific status not applicable
1023
+ detailedMergeStatus: pr.mergeable_state ?? null, // "clean"|"dirty"|"blocked"|"unstable"|"behind"|"draft"
1024
+ autoMergeEnabled: pr.auto_merge != null,
1025
+ autoMergeStrategy: pr.auto_merge?.merge_method ?? null,
1026
+ mergeUser: pr.auto_merge ? toUserRef(pr.auto_merge.enabled_by) : null,
1027
+ mergeAfter: null // GitHub doesn't have scheduled merge
1019
1028
  };
1020
1029
  }
1021
1030
  }
@@ -50,6 +50,10 @@ export const MR_DASHBOARD_FRAGMENT = `
50
50
  approvalsLeft
51
51
  resolvableDiscussionsCount
52
52
  resolvedDiscussionsCount
53
+ autoMergeEnabled
54
+ autoMergeStrategy
55
+ mergeUser { id username name avatarUrl }
56
+ mergeAfter
53
57
  headPipeline {
54
58
  id iid status
55
59
  createdAt
@@ -164,6 +168,10 @@ interface GQLMR {
164
168
  approvalsLeft: number | null;
165
169
  resolvableDiscussionsCount: number | null;
166
170
  resolvedDiscussionsCount: number | null;
171
+ autoMergeEnabled: boolean;
172
+ autoMergeStrategy: string | null;
173
+ mergeUser: GQLUser | null;
174
+ mergeAfter: string | null;
167
175
  headPipeline: GQLPipeline | null;
168
176
  }
169
177
 
@@ -276,7 +284,11 @@ function toMR(gql: GQLMR, role: string, baseURL: string): PullRequest {
276
284
  approved: gql.approved ?? false,
277
285
  approvedBy: gql.approvedBy.nodes.map(toUserRef),
278
286
  diffStats,
279
- detailedMergeStatus: gql.detailedMergeStatus ?? null
287
+ detailedMergeStatus: gql.detailedMergeStatus ?? null,
288
+ autoMergeEnabled: gql.autoMergeEnabled ?? false,
289
+ autoMergeStrategy: gql.autoMergeStrategy ?? null,
290
+ mergeUser: gql.mergeUser ? toUserRef(gql.mergeUser) : null,
291
+ mergeAfter: gql.mergeAfter ?? null
280
292
  };
281
293
  }
282
294
 
package/src/types.ts CHANGED
@@ -82,6 +82,17 @@ export interface PullRequest {
82
82
  * "not_approved", "discussions_not_resolved". Null for non-GitLab providers.
83
83
  */
84
84
  detailedMergeStatus: string | null;
85
+
86
+ // ── Auto-merge status ────────────────────────────────────────────────
87
+
88
+ /** Whether auto-merge (merge when pipeline succeeds) is currently enabled. */
89
+ autoMergeEnabled: boolean;
90
+ /** The merge strategy that will be used when auto-merge fires, e.g. "merge", "squash", "rebase_merge". */
91
+ autoMergeStrategy: string | null;
92
+ /** The user who merged or enabled auto-merge. */
93
+ mergeUser: UserRef | null;
94
+ /** ISO timestamp after which the MR is eligible to merge (scheduled merge). */
95
+ mergeAfter: string | null;
85
96
  }
86
97
 
87
98
  // ── MR/PR mutation inputs ─────────────────────────────────────────────────────