github-issue-tower-defence-management 1.122.10 → 1.122.11

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [1.122.11](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.122.10...v1.122.11) (2026-07-15)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * contain transient getOpenPullRequest errors in IssueRejectionEvaluator ([#1177](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/1177)) ([8b0ddba](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/8b0ddbaa303bf24bcbd55c67a56f08111b8239b1))
7
+
1
8
  ## [1.122.10](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.122.9...v1.122.10) (2026-07-15)
2
9
 
3
10
 
@@ -13,16 +13,35 @@ class IssueRejectionEvaluator {
13
13
  if (!hasLlmAgentLabel &&
14
14
  !hasLabelAsLlmAgentName &&
15
15
  (categoryLabels.length <= 0 || categoryLabels.includes('category:e2e'))) {
16
- const prsToCheck = issue.isPr
17
- ? await this.resolveOpenPrsForPrItem(issue.url)
18
- : options.relatedOpenPrUrls != null
19
- ? await this.resolveOpenPrsFromUrls(options.relatedOpenPrUrls)
20
- : await this.issueRepository.findRelatedOpenPRs(issue.url);
16
+ let prsToCheck;
17
+ let anyPrResolutionFailed = false;
18
+ if (issue.isPr) {
19
+ const resolved = await this.resolveOpenPrsForPrItem(issue.url);
20
+ if (resolved === null) {
21
+ // getOpenPullRequest failed transiently: the PR's state is unknown
22
+ // for this cycle, so skip it without emitting any rejection.
23
+ return { rejections, approvedPrUrl };
24
+ }
25
+ prsToCheck = resolved;
26
+ }
27
+ else if (options.relatedOpenPrUrls != null) {
28
+ const resolved = await this.resolveOpenPrsFromUrls(options.relatedOpenPrUrls);
29
+ prsToCheck = resolved.prs;
30
+ anyPrResolutionFailed = resolved.anyResolutionFailed;
31
+ }
32
+ else {
33
+ prsToCheck = await this.issueRepository.findRelatedOpenPRs(issue.url);
34
+ }
21
35
  if (prsToCheck.length <= 0) {
22
- rejections.push({
23
- type: 'PULL_REQUEST_NOT_FOUND',
24
- detail: 'PULL_REQUEST_NOT_FOUND',
25
- });
36
+ if (!anyPrResolutionFailed) {
37
+ rejections.push({
38
+ type: 'PULL_REQUEST_NOT_FOUND',
39
+ detail: 'PULL_REQUEST_NOT_FOUND',
40
+ });
41
+ }
42
+ // When a resolution failed and no PR resolved, the related PR state is
43
+ // unknown for this cycle; emit no rejection so a transient GraphQL
44
+ // error cannot cause a false PULL_REQUEST_NOT_FOUND revert.
26
45
  }
27
46
  else if (prsToCheck.length > 1) {
28
47
  rejections.push({
@@ -95,8 +114,18 @@ class IssueRejectionEvaluator {
95
114
  }
96
115
  return { rejections, approvedPrUrl };
97
116
  };
117
+ // Returns null when getOpenPullRequest throws (e.g. a transient GitHub
118
+ // GraphQL server error): the PR's state is unknown for this cycle and the
119
+ // caller skips it instead of letting the error abort the schedule cycle.
98
120
  this.resolveOpenPrsForPrItem = async (prUrl) => {
99
- const pr = await this.issueRepository.getOpenPullRequest(prUrl);
121
+ let pr;
122
+ try {
123
+ pr = await this.issueRepository.getOpenPullRequest(prUrl);
124
+ }
125
+ catch (error) {
126
+ console.warn(`IssueRejectionEvaluator: getOpenPullRequest failed, skipping PR for this cycle. prUrl: ${prUrl} error: ${error instanceof Error ? error.message : String(error)}`);
127
+ return null;
128
+ }
100
129
  if (pr === null) {
101
130
  return [];
102
131
  }
@@ -108,16 +137,31 @@ class IssueRejectionEvaluator {
108
137
  // so the resulting set is equivalent while avoiding the per-issue timeline
109
138
  // query. Duplicate URLs are de-duplicated to mirror findRelatedOpenPRs, which
110
139
  // collapses duplicates via its internal Map keyed by PR URL.
140
+ //
141
+ // When getOpenPullRequest throws for a URL (e.g. a transient GitHub GraphQL
142
+ // server error), that PR is logged and skipped for this cycle while the
143
+ // remaining URLs are still resolved; anyResolutionFailed reports whether at
144
+ // least one URL failed so the caller can avoid treating an unknown state as
145
+ // PULL_REQUEST_NOT_FOUND.
111
146
  this.resolveOpenPrsFromUrls = async (prUrls) => {
112
147
  const uniquePrUrls = Array.from(new Set(prUrls));
113
148
  const resolvedPrs = [];
149
+ let anyResolutionFailed = false;
114
150
  for (const prUrl of uniquePrUrls) {
115
- const pr = await this.issueRepository.getOpenPullRequest(prUrl);
151
+ let pr;
152
+ try {
153
+ pr = await this.issueRepository.getOpenPullRequest(prUrl);
154
+ }
155
+ catch (error) {
156
+ console.warn(`IssueRejectionEvaluator: getOpenPullRequest failed, skipping PR for this cycle. prUrl: ${prUrl} error: ${error instanceof Error ? error.message : String(error)}`);
157
+ anyResolutionFailed = true;
158
+ continue;
159
+ }
116
160
  if (pr !== null) {
117
161
  resolvedPrs.push(pr);
118
162
  }
119
163
  }
120
- return resolvedPrs;
164
+ return { prs: resolvedPrs, anyResolutionFailed };
121
165
  };
122
166
  this.extractChangeTargetMustPaths = (labels) => {
123
167
  const prefix = 'change-target-must:';
@@ -1 +1 @@
1
- {"version":3,"file":"IssueRejectionEvaluator.js","sourceRoot":"","sources":["../../../src/domain/usecases/IssueRejectionEvaluator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"IssueRejectionEvaluator.js","sourceRoot":"","sources":["../../../src/domain/usecases/IssueRejectionEvaluator.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.122.10",
3
+ "version": "1.122.11",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -388,6 +388,160 @@ describe('IssueRejectionEvaluator', () => {
388
388
  });
389
389
  });
390
390
 
391
+ describe('transient getOpenPullRequest failure containment', () => {
392
+ let warnSpy: jest.SpyInstance;
393
+
394
+ beforeEach(() => {
395
+ warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {});
396
+ });
397
+
398
+ afterEach(() => {
399
+ warnSpy.mockRestore();
400
+ });
401
+
402
+ it('should not throw and should return no rejections when getOpenPullRequest rejects for a PR item (isPr=true)', async () => {
403
+ mockIssueRepository.getOpenPullRequest.mockRejectedValue(
404
+ new Error(
405
+ 'GraphQL errors: [{"message":"Something went wrong while executing your query"}]',
406
+ ),
407
+ );
408
+
409
+ const result = await evaluator.evaluate({
410
+ url: 'https://github.com/user/repo/pull/10',
411
+ labels: [],
412
+ isPr: true,
413
+ });
414
+
415
+ expect(result.rejections).toHaveLength(0);
416
+ expect(result.approvedPrUrl).toBeNull();
417
+ });
418
+
419
+ it('should log one warning line containing the PR URL and error message when getOpenPullRequest rejects for a PR item', async () => {
420
+ mockIssueRepository.getOpenPullRequest.mockRejectedValue(
421
+ new Error('Something went wrong while executing your query'),
422
+ );
423
+
424
+ await evaluator.evaluate({
425
+ url: 'https://github.com/user/repo/pull/10',
426
+ labels: [],
427
+ isPr: true,
428
+ });
429
+
430
+ expect(warnSpy).toHaveBeenCalledTimes(1);
431
+ expect(warnSpy).toHaveBeenCalledWith(
432
+ expect.stringContaining('https://github.com/user/repo/pull/10'),
433
+ );
434
+ expect(warnSpy).toHaveBeenCalledWith(
435
+ expect.stringContaining(
436
+ 'Something went wrong while executing your query',
437
+ ),
438
+ );
439
+ });
440
+
441
+ it('should skip the failing URL, log a warning, and still evaluate the healthy PR in the same batch (prebuilt path)', async () => {
442
+ mockIssueRepository.getOpenPullRequest.mockImplementation(
443
+ (prUrl: string) =>
444
+ prUrl === 'https://github.com/user/repo/pull/8'
445
+ ? Promise.reject(
446
+ new Error('Something went wrong while executing your query'),
447
+ )
448
+ : Promise.resolve(createReadyPr(prUrl)),
449
+ );
450
+
451
+ const result = await evaluator.evaluate(
452
+ {
453
+ url: 'https://github.com/user/repo/issues/1',
454
+ labels: [],
455
+ isPr: false,
456
+ },
457
+ [],
458
+ {
459
+ relatedOpenPrUrls: [
460
+ 'https://github.com/user/repo/pull/8',
461
+ 'https://github.com/user/repo/pull/9',
462
+ ],
463
+ },
464
+ );
465
+
466
+ expect(warnSpy).toHaveBeenCalledTimes(1);
467
+ expect(warnSpy).toHaveBeenCalledWith(
468
+ expect.stringContaining('https://github.com/user/repo/pull/8'),
469
+ );
470
+ expect(result.rejections).toHaveLength(0);
471
+ expect(result.approvedPrUrl).toBe(
472
+ 'https://github.com/user/repo/pull/9',
473
+ );
474
+ });
475
+
476
+ it('should not reject with PULL_REQUEST_NOT_FOUND when the only related URL fails transiently (state unknown, skipped)', async () => {
477
+ mockIssueRepository.getOpenPullRequest.mockRejectedValue(
478
+ new Error('Something went wrong while executing your query'),
479
+ );
480
+
481
+ const result = await evaluator.evaluate(
482
+ {
483
+ url: 'https://github.com/user/repo/issues/1',
484
+ labels: [],
485
+ isPr: false,
486
+ },
487
+ [],
488
+ { relatedOpenPrUrls: ['https://github.com/user/repo/pull/8'] },
489
+ );
490
+
491
+ expect(warnSpy).toHaveBeenCalledTimes(1);
492
+ expect(result.rejections).toHaveLength(0);
493
+ expect(result.approvedPrUrl).toBeNull();
494
+ });
495
+
496
+ it('should still evaluate the healthy remaining PR normally when it has a rejection reason (draft) after another URL fails', async () => {
497
+ mockIssueRepository.getOpenPullRequest.mockImplementation(
498
+ (prUrl: string) =>
499
+ prUrl === 'https://github.com/user/repo/pull/8'
500
+ ? Promise.reject(
501
+ new Error('Something went wrong while executing your query'),
502
+ )
503
+ : Promise.resolve(createReadyPr(prUrl, { isDraft: true })),
504
+ );
505
+
506
+ const result = await evaluator.evaluate(
507
+ {
508
+ url: 'https://github.com/user/repo/issues/1',
509
+ labels: [],
510
+ isPr: false,
511
+ },
512
+ [],
513
+ {
514
+ relatedOpenPrUrls: [
515
+ 'https://github.com/user/repo/pull/8',
516
+ 'https://github.com/user/repo/pull/9',
517
+ ],
518
+ },
519
+ );
520
+
521
+ expect(result.rejections).toHaveLength(1);
522
+ expect(result.rejections[0].type).toBe('PULL_REQUEST_IS_DRAFT');
523
+ expect(result.approvedPrUrl).toBeNull();
524
+ });
525
+
526
+ it('should handle a non-Error rejection value without throwing', async () => {
527
+ mockIssueRepository.getOpenPullRequest.mockRejectedValue(
528
+ 'string failure',
529
+ );
530
+
531
+ const result = await evaluator.evaluate({
532
+ url: 'https://github.com/user/repo/pull/10',
533
+ labels: [],
534
+ isPr: true,
535
+ });
536
+
537
+ expect(warnSpy).toHaveBeenCalledTimes(1);
538
+ expect(warnSpy).toHaveBeenCalledWith(
539
+ expect.stringContaining('string failure'),
540
+ );
541
+ expect(result.rejections).toHaveLength(0);
542
+ });
543
+ });
544
+
391
545
  describe('change-target-must: label behavior', () => {
392
546
  const prUrl = 'https://github.com/user/repo/pull/1';
393
547
 
@@ -67,17 +67,36 @@ export class IssueRejectionEvaluator {
67
67
  !hasLabelAsLlmAgentName &&
68
68
  (categoryLabels.length <= 0 || categoryLabels.includes('category:e2e'))
69
69
  ) {
70
- const prsToCheck = issue.isPr
71
- ? await this.resolveOpenPrsForPrItem(issue.url)
72
- : options.relatedOpenPrUrls != null
73
- ? await this.resolveOpenPrsFromUrls(options.relatedOpenPrUrls)
74
- : await this.issueRepository.findRelatedOpenPRs(issue.url);
70
+ let prsToCheck: RelatedPullRequest[];
71
+ let anyPrResolutionFailed = false;
72
+ if (issue.isPr) {
73
+ const resolved = await this.resolveOpenPrsForPrItem(issue.url);
74
+ if (resolved === null) {
75
+ // getOpenPullRequest failed transiently: the PR's state is unknown
76
+ // for this cycle, so skip it without emitting any rejection.
77
+ return { rejections, approvedPrUrl };
78
+ }
79
+ prsToCheck = resolved;
80
+ } else if (options.relatedOpenPrUrls != null) {
81
+ const resolved = await this.resolveOpenPrsFromUrls(
82
+ options.relatedOpenPrUrls,
83
+ );
84
+ prsToCheck = resolved.prs;
85
+ anyPrResolutionFailed = resolved.anyResolutionFailed;
86
+ } else {
87
+ prsToCheck = await this.issueRepository.findRelatedOpenPRs(issue.url);
88
+ }
75
89
 
76
90
  if (prsToCheck.length <= 0) {
77
- rejections.push({
78
- type: 'PULL_REQUEST_NOT_FOUND',
79
- detail: 'PULL_REQUEST_NOT_FOUND',
80
- });
91
+ if (!anyPrResolutionFailed) {
92
+ rejections.push({
93
+ type: 'PULL_REQUEST_NOT_FOUND',
94
+ detail: 'PULL_REQUEST_NOT_FOUND',
95
+ });
96
+ }
97
+ // When a resolution failed and no PR resolved, the related PR state is
98
+ // unknown for this cycle; emit no rejection so a transient GraphQL
99
+ // error cannot cause a false PULL_REQUEST_NOT_FOUND revert.
81
100
  } else if (prsToCheck.length > 1) {
82
101
  rejections.push({
83
102
  type: 'MULTIPLE_PULL_REQUESTS_FOUND',
@@ -164,10 +183,21 @@ export class IssueRejectionEvaluator {
164
183
  return { rejections, approvedPrUrl };
165
184
  };
166
185
 
186
+ // Returns null when getOpenPullRequest throws (e.g. a transient GitHub
187
+ // GraphQL server error): the PR's state is unknown for this cycle and the
188
+ // caller skips it instead of letting the error abort the schedule cycle.
167
189
  private resolveOpenPrsForPrItem = async (
168
190
  prUrl: string,
169
- ): Promise<RelatedPullRequest[]> => {
170
- const pr = await this.issueRepository.getOpenPullRequest(prUrl);
191
+ ): Promise<RelatedPullRequest[] | null> => {
192
+ let pr: RelatedPullRequest | null;
193
+ try {
194
+ pr = await this.issueRepository.getOpenPullRequest(prUrl);
195
+ } catch (error) {
196
+ console.warn(
197
+ `IssueRejectionEvaluator: getOpenPullRequest failed, skipping PR for this cycle. prUrl: ${prUrl} error: ${error instanceof Error ? error.message : String(error)}`,
198
+ );
199
+ return null;
200
+ }
171
201
  if (pr === null) {
172
202
  return [];
173
203
  }
@@ -180,18 +210,34 @@ export class IssueRejectionEvaluator {
180
210
  // so the resulting set is equivalent while avoiding the per-issue timeline
181
211
  // query. Duplicate URLs are de-duplicated to mirror findRelatedOpenPRs, which
182
212
  // collapses duplicates via its internal Map keyed by PR URL.
213
+ //
214
+ // When getOpenPullRequest throws for a URL (e.g. a transient GitHub GraphQL
215
+ // server error), that PR is logged and skipped for this cycle while the
216
+ // remaining URLs are still resolved; anyResolutionFailed reports whether at
217
+ // least one URL failed so the caller can avoid treating an unknown state as
218
+ // PULL_REQUEST_NOT_FOUND.
183
219
  private resolveOpenPrsFromUrls = async (
184
220
  prUrls: string[],
185
- ): Promise<RelatedPullRequest[]> => {
221
+ ): Promise<{ prs: RelatedPullRequest[]; anyResolutionFailed: boolean }> => {
186
222
  const uniquePrUrls = Array.from(new Set(prUrls));
187
223
  const resolvedPrs: RelatedPullRequest[] = [];
224
+ let anyResolutionFailed = false;
188
225
  for (const prUrl of uniquePrUrls) {
189
- const pr = await this.issueRepository.getOpenPullRequest(prUrl);
226
+ let pr: RelatedPullRequest | null;
227
+ try {
228
+ pr = await this.issueRepository.getOpenPullRequest(prUrl);
229
+ } catch (error) {
230
+ console.warn(
231
+ `IssueRejectionEvaluator: getOpenPullRequest failed, skipping PR for this cycle. prUrl: ${prUrl} error: ${error instanceof Error ? error.message : String(error)}`,
232
+ );
233
+ anyResolutionFailed = true;
234
+ continue;
235
+ }
190
236
  if (pr !== null) {
191
237
  resolvedPrs.push(pr);
192
238
  }
193
239
  }
194
- return resolvedPrs;
240
+ return { prs: resolvedPrs, anyResolutionFailed };
195
241
  };
196
242
 
197
243
  private extractChangeTargetMustPaths = (labels: string[]): string[] => {
@@ -1 +1 @@
1
- {"version":3,"file":"IssueRejectionEvaluator.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/IssueRejectionEvaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEhB,MAAM,sCAAsC,CAAC;AAE9C,MAAM,MAAM,oBAAoB,GAC5B,wBAAwB,GACxB,8BAA8B,GAC9B,uBAAuB,GACvB,yBAAyB,GACzB,kCAAkC,GAClC,+BAA+B,GAC/B,iCAAiC,GACjC,qCAAqC,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE;QAAE,IAAI,EAAE,oBAAoB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAQ5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,oBAAoB,GACpB,oBAAoB,GACpB,gCAAgC,GAChC,iCAAiC,CACpC;IAGH,QAAQ,GACN,OAAO;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,IAAI,EAAE,OAAO,CAAC;KACf,EACD,uBAAsB,MAAM,EAAO,EACnC,UAAS,eAAoB,KAC5B,OAAO,CAAC,iBAAiB,CAAC,CAkH3B;IAEF,OAAO,CAAC,uBAAuB,CAQ7B;IAQF,OAAO,CAAC,sBAAsB,CAY5B;IAEF,OAAO,CAAC,4BAA4B,CAYlC;IAEF,OAAO,CAAC,mBAAmB,CAIwC;CACpE"}
1
+ {"version":3,"file":"IssueRejectionEvaluator.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/IssueRejectionEvaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EAEhB,MAAM,sCAAsC,CAAC;AAE9C,MAAM,MAAM,oBAAoB,GAC5B,wBAAwB,GACxB,8BAA8B,GAC9B,uBAAuB,GACvB,yBAAyB,GACzB,kCAAkC,GAClC,+BAA+B,GAC/B,iCAAiC,GACjC,qCAAqC,CAAC;AAE1C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,UAAU,EAAE;QAAE,IAAI,EAAE,oBAAoB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAQ5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,qBAAa,uBAAuB;IAEhC,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,oBAAoB,GACpB,oBAAoB,GACpB,gCAAgC,GAChC,iCAAiC,CACpC;IAGH,QAAQ,GACN,OAAO;QACL,GAAG,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,EAAE,CAAC;QACjB,IAAI,EAAE,OAAO,CAAC;KACf,EACD,uBAAsB,MAAM,EAAO,EACnC,UAAS,eAAoB,KAC5B,OAAO,CAAC,iBAAiB,CAAC,CAqI3B;IAKF,OAAO,CAAC,uBAAuB,CAgB7B;IAcF,OAAO,CAAC,sBAAsB,CAsB5B;IAEF,OAAO,CAAC,4BAA4B,CAYlC;IAEF,OAAO,CAAC,mBAAmB,CAIwC;CACpE"}