ghagga-forge 3.1.0 → 3.2.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.
@@ -57,16 +57,27 @@ export declare class GitHubForgeAdapter implements ForgeAdapterBase, ReactionCap
57
57
  /**
58
58
  * Idempotently upsert the single GHAGGA summary comment.
59
59
  *
60
- * Behavior (preserves the review.ts baseline exactly):
60
+ * Behavior (FORGE-UPSERT-005 remediation update-in-place, never
61
+ * delete-before-create):
61
62
  * 1. find existing GHAGGA comments (latest + stale).
62
- * 2. delete ALL of them in the order `[latestId, ...staleIds]` BEST-EFFORT:
63
- * each delete is wrapped in try/catch so BOTH 404 (already gone) AND any
64
- * non-404 failure are tolerated and do NOT block the repost. Only ids that
65
- * actually deleted (no throw) are reported in `deleted`.
66
- * 3. post a FRESH comment at the bottom — this is the ONLY failure that
67
- * propagates (a failed post means no summary exists, which is fatal).
63
+ * 2a. NO existing comment: post a FRESH comment. This is the only network
64
+ * call, so failure here simply means no summary was ever created no
65
+ * regression vs. the previous behavior.
66
+ * 2b. AN existing comment: update the LATEST one IN PLACE via
67
+ * `client.updateComment`. This call is the ONLY one that propagates on
68
+ * failure and critically, nothing has been deleted yet at that point,
69
+ * so a transient update failure (timeout / 5xx) leaves the PR/MR with
70
+ * its PREVIOUS valid review intact instead of no review at all (the bug
71
+ * this remediation closes). Only AFTER the update confirms success are
72
+ * the stale duplicates removed, BEST-EFFORT: each delete is wrapped in
73
+ * try/catch so BOTH 404 (already gone) AND any non-404 failure are
74
+ * tolerated and do NOT undo the successful update. Only ids that
75
+ * actually deleted (no throw) are reported in `deleted`.
68
76
  *
69
- * Returns GitHub-native numeric ids (boxing happens caller-local).
77
+ * Returns GitHub-native numeric ids (boxing happens caller-local). `created`
78
+ * is the id of the comment that now carries the review body — it may be a
79
+ * freshly-posted id (no prior comment) or the pre-existing latest id that
80
+ * was updated in place.
70
81
  *
71
82
  * NOTE: `marker` is accepted for the port contract but is NOT threaded into
72
83
  * the client. The GitHub adapter currently matches the FIXED
@@ -1 +1 @@
1
- {"version":3,"file":"github-forge-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/github/github-forge-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACb,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,MAAM,EACN,iBAAiB,EACjB,OAAO,EACP,WAAW,EACX,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,yBAAyB,CAAC;AAEvF,2DAA2D;AAC3D,MAAM,WAAW,sBAAsB;IACrC,+EAA+E;IAC/E,MAAM,EAAE,gBAAgB,CAAC;IACzB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AA4BD;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB,EAAE,eAAe,EAAE,gBAAgB;;IAC5F,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAItC;gBAOU,IAAI,EAAE,sBAAsB;IAqClC,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IAOtD,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAcjE,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAY5D,YAAY,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAa5D;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACG,oBAAoB,CACxB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,mBAAmB,CAAC;IAiD/B;;;;;;OAMG;IACG,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9E;;;;;;OAMG;IACG,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAIjE;;;OAGG;IACG,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAGxE;AAGD,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"github-forge-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/github/github-forge-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,YAAY,EACb,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,MAAM,EACN,iBAAiB,EACjB,OAAO,EACP,WAAW,EACX,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,yBAAyB,CAAC;AAEvF,2DAA2D;AAC3D,MAAM,WAAW,sBAAsB;IACrC,+EAA+E;IAC/E,MAAM,EAAE,gBAAgB,CAAC;IACzB,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;CACd;AA4BD;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB,EAAE,eAAe,EAAE,gBAAgB;;IAC5F,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAItC;gBAOU,IAAI,EAAE,sBAAsB;IAqClC,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IAOtD,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAcjE,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAY5D,YAAY,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAa5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACG,oBAAoB,CACxB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,mBAAmB,CAAC;IAyD/B;;;;;;OAMG;IACG,WAAW,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9E;;;;;;OAMG;IACG,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAIjE;;;OAGG;IACG,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;CAGxE;AAGD,OAAO,EAAE,aAAa,EAAE,CAAC"}
@@ -132,16 +132,27 @@ export class GitHubForgeAdapter {
132
132
  /**
133
133
  * Idempotently upsert the single GHAGGA summary comment.
134
134
  *
135
- * Behavior (preserves the review.ts baseline exactly):
135
+ * Behavior (FORGE-UPSERT-005 remediation update-in-place, never
136
+ * delete-before-create):
136
137
  * 1. find existing GHAGGA comments (latest + stale).
137
- * 2. delete ALL of them in the order `[latestId, ...staleIds]` BEST-EFFORT:
138
- * each delete is wrapped in try/catch so BOTH 404 (already gone) AND any
139
- * non-404 failure are tolerated and do NOT block the repost. Only ids that
140
- * actually deleted (no throw) are reported in `deleted`.
141
- * 3. post a FRESH comment at the bottom — this is the ONLY failure that
142
- * propagates (a failed post means no summary exists, which is fatal).
138
+ * 2a. NO existing comment: post a FRESH comment. This is the only network
139
+ * call, so failure here simply means no summary was ever created no
140
+ * regression vs. the previous behavior.
141
+ * 2b. AN existing comment: update the LATEST one IN PLACE via
142
+ * `client.updateComment`. This call is the ONLY one that propagates on
143
+ * failure and critically, nothing has been deleted yet at that point,
144
+ * so a transient update failure (timeout / 5xx) leaves the PR/MR with
145
+ * its PREVIOUS valid review intact instead of no review at all (the bug
146
+ * this remediation closes). Only AFTER the update confirms success are
147
+ * the stale duplicates removed, BEST-EFFORT: each delete is wrapped in
148
+ * try/catch so BOTH 404 (already gone) AND any non-404 failure are
149
+ * tolerated and do NOT undo the successful update. Only ids that
150
+ * actually deleted (no throw) are reported in `deleted`.
143
151
  *
144
- * Returns GitHub-native numeric ids (boxing happens caller-local).
152
+ * Returns GitHub-native numeric ids (boxing happens caller-local). `created`
153
+ * is the id of the comment that now carries the review body — it may be a
154
+ * freshly-posted id (no prior comment) or the pre-existing latest id that
155
+ * was updated in place.
145
156
  *
146
157
  * NOTE: `marker` is accepted for the port contract but is NOT threaded into
147
158
  * the client. The GitHub adapter currently matches the FIXED
@@ -155,40 +166,44 @@ export class GitHubForgeAdapter {
155
166
  */
156
167
  async upsertSummaryComment(ref, body, _marker) {
157
168
  const existing = await this.#mapAuth(() => this.#client.findExistingComment(this.#owner, this.#repo, ref.iid, this.#token));
158
- const deleted = [];
159
- if (existing) {
160
- // Preserve baseline delete-order: latest FIRST, then stale duplicates.
161
- const allIds = [existing.latestId, ...existing.staleIds];
162
- for (const commentId of allIds) {
163
- try {
164
- await this.#client.deleteComment(this.#owner, this.#repo, commentId, this.#token);
165
- deleted.push(commentId);
166
- }
167
- catch {
168
- // Best-effort: tolerate BOTH 404 and non-404 delete failures. A stale
169
- // comment that cannot be deleted must NOT block the fresh repost.
170
- //
171
- // REALITY NOTE: the real client.ts deleteComment is fire-and-forget
172
- // (it does NOT check response.ok and never throws), so in production
173
- // this catch is defensive belt-and-suspenders and `deleted[]` reflects
174
- // attempted-and-not-thrown deletes. The catch only triggers under a
175
- // test double / future client that does throw.
176
- }
169
+ if (!existing) {
170
+ // No prior GHAGGA comment: the only safe move is to post a fresh one. A
171
+ // 401/403 here is reclassified to ForgeAuthError so the worker can
172
+ // re-mint + retry (P2).
173
+ const posted = await this.#mapAuth(() => this.#client.postComment(this.#owner, this.#repo, ref.iid, body, this.#token));
174
+ // Robustness guard: the real client.postComment returns `{ id }` or
175
+ // throws, so a missing id is a contract violation (e.g. a mis-shaped
176
+ // test double), never a live path. Fail loudly here rather than
177
+ // silently boxing `undefined` → the meaningless CommentId
178
+ // `{ kind:'github', raw:'undefined' }` downstream.
179
+ if (posted?.id == null) {
180
+ throw new TypeError('GitHubForgeAdapter.upsertSummaryComment: postComment returned no id (expected { id: number })');
177
181
  }
182
+ return { created: posted.id, deleted: [] };
178
183
  }
179
- // Always post a fresh comment at the bottom. This is the ONLY error that
180
- // propagates without it there would be no summary at all. A 401/403 here is
181
- // reclassified to ForgeAuthError so the worker can re-mint + retry (P2).
182
- const posted = await this.#mapAuth(() => this.#client.postComment(this.#owner, this.#repo, ref.iid, body, this.#token));
183
- // Robustness guard: the real client.postComment returns `{ id }` or throws,
184
- // so a missing id is a contract violation (e.g. a mis-shaped test double),
185
- // never a live path. Fail loudly here rather than silently boxing
186
- // `undefined` the meaningless CommentId `{ kind:'github', raw:'undefined' }`
187
- // downstream.
188
- if (posted?.id == null) {
189
- throw new TypeError('GitHubForgeAdapter.upsertSummaryComment: postComment returned no id (expected { id: number })');
184
+ // Update the latest comment IN PLACE. This is the ONLY error that
185
+ // propagates from the existing-comment path and it propagates BEFORE
186
+ // anything has been deleted, so the previous review remains visible on
187
+ // the PR if this fails transiently. A 401/403 here is reclassified to
188
+ // ForgeAuthError so the worker can re-mint + retry (P2).
189
+ await this.#mapAuth(() => this.#client.updateComment(this.#owner, this.#repo, existing.latestId, body, this.#token));
190
+ // The update confirmed success now it's safe to prune stale duplicates.
191
+ // BEST-EFFORT: tolerate BOTH 404 and non-404 delete failures, since the
192
+ // now-current comment already carries the fresh body regardless of
193
+ // whether the old duplicates get cleaned up.
194
+ const deleted = [];
195
+ for (const commentId of existing.staleIds) {
196
+ try {
197
+ await this.#client.deleteComment(this.#owner, this.#repo, commentId, this.#token);
198
+ deleted.push(commentId);
199
+ }
200
+ catch {
201
+ // Best-effort: a stale duplicate that cannot be deleted must NOT be
202
+ // treated as a failure of the upsert — the primary comment is already
203
+ // updated.
204
+ }
190
205
  }
191
- return { created: posted.id, deleted };
206
+ return { created: existing.latestId, deleted };
192
207
  }
193
208
  // ─── ReactionCapable ───────────────────────────────────────────
194
209
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"github-forge-adapter.js","sourceRoot":"","sources":["../../../src/adapters/github/github-forge-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"github-forge-adapter.js","sourceRoot":"","sources":["../../../src/adapters/github/github-forge-adapter.ts"],"names":[],"mappings":"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"}
@@ -72,17 +72,22 @@ export declare class GitLabForgeAdapter implements ForgeAdapterBase, InlineCapab
72
72
  /**
73
73
  * Idempotently upsert the single GHAGGA summary note on an MR.
74
74
  *
75
- * Behavior (mirrors the GitHub adapter's delete-all-stale + repost-at-bottom):
75
+ * Behavior (FORGE-UPSERT-005 remediation update-in-place, never
76
+ * delete-before-create; mirrors the GitHub adapter):
76
77
  * 1. list MR notes; match the GHAGGA-owned ones by `marker.html` substring.
77
- * 2. delete ALL matches in `[latest, ...stale]` order — BEST-EFFORT: each
78
- * delete is per-note try/catch so a 404 (already gone) OR any other failure
79
- * is tolerated and does NOT block the repost. Only ids that actually deleted
80
- * (no throw) are reported in `deleted`.
81
- * 3. create a FRESH note at the bottom this is the ONLY failure that
82
- * propagates (a failed create means no summary exists, which is fatal).
83
- *
84
- * "latest" = the LAST marker-matching note in chronological order (GitLab list
85
- * returns notes oldest-first), matching the GitHub adapter's convention.
78
+ * "latest" = the LAST marker-matching note in chronological order
79
+ * (GitLab list returns notes oldest-first).
80
+ * 2a. NO matching note: create a FRESH note. Failure here just means no
81
+ * summary was ever created — no regression vs. the previous behavior.
82
+ * 2b. A matching note exists: update the LATEST one IN PLACE via
83
+ * `client.updateMrNote`. This is the ONLY error that propagates from the
84
+ * existing-note path — and it propagates BEFORE anything has been
85
+ * deleted, so a transient update failure (timeout / 5xx) leaves the
86
+ * MR's PREVIOUS valid review intact instead of no review at all (the
87
+ * bug this remediation closes). Only AFTER the update confirms success
88
+ * are the stale duplicate notes removed, BEST-EFFORT: each delete is
89
+ * per-note try/catch so a 404 (already gone) OR any other failure is
90
+ * tolerated and does NOT undo the successful update.
86
91
  *
87
92
  * Returns GitLab-native numeric ids (boxing happens caller-local via
88
93
  * {@link gitlabCommentId}).
@@ -1 +1 @@
1
- {"version":3,"file":"gitlab-forge-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/gitlab/gitlab-forge-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AACnG,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,MAAM,EACN,iBAAiB,EAEjB,aAAa,EACb,WAAW,EACX,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,2DAA2D;AAC3D,MAAM,WAAW,sBAAsB;IACrC,8EAA8E;IAC9E,MAAM,EAAE,gBAAgB,CAAC;IACzB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB,EAAE,aAAa;;IACxE,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAItC;gBAMU,IAAI,EAAE,sBAAsB;IAmCxC,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IASvD,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAMlE,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAM7D,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQvD;;;;;;;;;;;;;;;;;OAiBG;IACG,oBAAoB,CACxB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,mBAAmB,CAAC;IA2C/B;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CAqE9F"}
1
+ {"version":3,"file":"gitlab-forge-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/gitlab/gitlab-forge-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AAIH,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AACnG,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,MAAM,EACN,iBAAiB,EAEjB,aAAa,EACb,WAAW,EACX,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,2DAA2D;AAC3D,MAAM,WAAW,sBAAsB;IACrC,8EAA8E;IAC9E,MAAM,EAAE,gBAAgB,CAAC;IACzB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,YAAW,gBAAgB,EAAE,aAAa;;IACxE,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAItC;gBAMU,IAAI,EAAE,sBAAsB;IAmCxC,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,CAAC;IASvD,kBAAkB,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,aAAa,CAAC;IAMlE,aAAa,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAM7D,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAQvD;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACG,oBAAoB,CACxB,GAAG,EAAE,gBAAgB,EACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,mBAAmB,CAAC;IAyD/B;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACG,aAAa,CAAC,GAAG,EAAE,gBAAgB,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC;CAqE9F"}
@@ -102,17 +102,22 @@ export class GitLabForgeAdapter {
102
102
  /**
103
103
  * Idempotently upsert the single GHAGGA summary note on an MR.
104
104
  *
105
- * Behavior (mirrors the GitHub adapter's delete-all-stale + repost-at-bottom):
105
+ * Behavior (FORGE-UPSERT-005 remediation update-in-place, never
106
+ * delete-before-create; mirrors the GitHub adapter):
106
107
  * 1. list MR notes; match the GHAGGA-owned ones by `marker.html` substring.
107
- * 2. delete ALL matches in `[latest, ...stale]` order — BEST-EFFORT: each
108
- * delete is per-note try/catch so a 404 (already gone) OR any other failure
109
- * is tolerated and does NOT block the repost. Only ids that actually deleted
110
- * (no throw) are reported in `deleted`.
111
- * 3. create a FRESH note at the bottom this is the ONLY failure that
112
- * propagates (a failed create means no summary exists, which is fatal).
113
- *
114
- * "latest" = the LAST marker-matching note in chronological order (GitLab list
115
- * returns notes oldest-first), matching the GitHub adapter's convention.
108
+ * "latest" = the LAST marker-matching note in chronological order
109
+ * (GitLab list returns notes oldest-first).
110
+ * 2a. NO matching note: create a FRESH note. Failure here just means no
111
+ * summary was ever created — no regression vs. the previous behavior.
112
+ * 2b. A matching note exists: update the LATEST one IN PLACE via
113
+ * `client.updateMrNote`. This is the ONLY error that propagates from the
114
+ * existing-note path — and it propagates BEFORE anything has been
115
+ * deleted, so a transient update failure (timeout / 5xx) leaves the
116
+ * MR's PREVIOUS valid review intact instead of no review at all (the
117
+ * bug this remediation closes). Only AFTER the update confirms success
118
+ * are the stale duplicate notes removed, BEST-EFFORT: each delete is
119
+ * per-note try/catch so a 404 (already gone) OR any other failure is
120
+ * tolerated and does NOT undo the successful update.
116
121
  *
117
122
  * Returns GitLab-native numeric ids (boxing happens caller-local via
118
123
  * {@link gitlabCommentId}).
@@ -120,32 +125,41 @@ export class GitLabForgeAdapter {
120
125
  async upsertSummaryComment(ref, body, marker) {
121
126
  const notes = await this.#mapAuth(() => this.#client.listMrNotes(this.#projectId, ref.iid, this.#token));
122
127
  const matchIds = notes.filter((n) => n.body.includes(marker.html)).map((n) => n.id);
123
- const deleted = [];
124
- if (matchIds.length > 0) {
125
- // latest = last marker note; the rest are stale. Delete latest FIRST then
126
- // stale, mirroring the GitHub adapter's baseline order. (Guaranteed
127
- // non-empty inside this `matchIds.length > 0` branch.)
128
- const latestId = matchIds[matchIds.length - 1];
129
- const staleIds = matchIds.slice(0, -1);
130
- const ordered = [latestId, ...staleIds];
131
- for (const noteId of ordered) {
132
- try {
133
- await this.#client.deleteMrNote(this.#projectId, ref.iid, noteId, this.#token);
134
- deleted.push(noteId);
135
- }
136
- catch {
137
- // Best-effort: tolerate any delete failure (404 or non-404). A stale
138
- // note that cannot be deleted must NOT block the fresh repost.
139
- }
128
+ if (matchIds.length === 0) {
129
+ // No prior GHAGGA note: the only safe move is to create a fresh one. A
130
+ // 401/403 here is reclassified to ForgeAuthError.
131
+ const created = await this.#mapAuth(() => this.#client.createMrNote(this.#projectId, ref.iid, body, this.#token));
132
+ if (created?.id == null) {
133
+ throw new TypeError('GitLabForgeAdapter.upsertSummaryComment: createMrNote returned no id (expected { id: number })');
140
134
  }
135
+ return { created: created.id, deleted: [] };
141
136
  }
142
- // Always create a fresh note at the bottom. This is the ONLY error that
143
- // propagates. A 401/403 here is reclassified to ForgeAuthError.
144
- const created = await this.#mapAuth(() => this.#client.createMrNote(this.#projectId, ref.iid, body, this.#token));
145
- if (created?.id == null) {
146
- throw new TypeError('GitLabForgeAdapter.upsertSummaryComment: createMrNote returned no id (expected { id: number })');
137
+ // latest = last marker note; the rest are stale. (Guaranteed non-empty
138
+ // inside this `matchIds.length > 0` branch.)
139
+ const latestId = matchIds[matchIds.length - 1];
140
+ const staleIds = matchIds.slice(0, -1);
141
+ // Update the latest note IN PLACE. This is the ONLY error that propagates
142
+ // from the existing-note path — and it propagates BEFORE anything has
143
+ // been deleted, so the previous review remains visible on the MR if this
144
+ // fails transiently. A 401/403 here is reclassified to ForgeAuthError.
145
+ await this.#mapAuth(() => this.#client.updateMrNote(this.#projectId, ref.iid, latestId, body, this.#token));
146
+ // The update confirmed success — now it's safe to prune stale duplicates.
147
+ // BEST-EFFORT: tolerate any delete failure (404 or non-404), since the
148
+ // now-current note already carries the fresh body regardless of whether
149
+ // the old duplicates get cleaned up.
150
+ const deleted = [];
151
+ for (const noteId of staleIds) {
152
+ try {
153
+ await this.#client.deleteMrNote(this.#projectId, ref.iid, noteId, this.#token);
154
+ deleted.push(noteId);
155
+ }
156
+ catch {
157
+ // Best-effort: a stale duplicate that cannot be deleted must NOT be
158
+ // treated as a failure of the upsert — the primary note is already
159
+ // updated.
160
+ }
147
161
  }
148
- return { created: created.id, deleted };
162
+ return { created: latestId, deleted };
149
163
  }
150
164
  // ─── InlineCapable ─────────────────────────────────────────────
151
165
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"gitlab-forge-adapter.js","sourceRoot":"","sources":["../../../src/adapters/gitlab/gitlab-forge-adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gitlab-forge-adapter.js","sourceRoot":"","sources":["../../../src/adapters/gitlab/gitlab-forge-adapter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ghagga-forge",
3
- "version": "3.1.0",
3
+ "version": "3.2.0",
4
4
  "private": false,
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -42,12 +42,12 @@
42
42
  "README.md"
43
43
  ],
44
44
  "dependencies": {
45
- "ghagga-core": "3.1.0"
45
+ "ghagga-core": "3.2.0"
46
46
  },
47
47
  "devDependencies": {
48
- "@types/node": "^25.9.1",
48
+ "@types/node": "^26.1.0",
49
49
  "typescript": "^6.0.3",
50
- "vitest": "^4.1.9"
50
+ "vitest": "^4.1.10"
51
51
  },
52
52
  "scripts": {
53
53
  "build": "tsc && node scripts/copy-impl-assets.mjs",