npm-cli-gh-issue-preparator 1.12.0 → 1.13.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.
- package/CHANGELOG.md +7 -0
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +2 -1
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +82 -0
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +4 -1
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
# [1.13.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.12.0...v1.13.0) (2026-02-18)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **core:** add retry comment to skip auto-escalation ([38c3302](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/38c330264356833a28b8364db937140b152eea62))
|
|
7
|
+
|
|
1
8
|
# [1.12.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.11.0...v1.12.0) (2026-02-17)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -31,7 +31,8 @@ class NotifyFinishedIssuePreparationUseCase {
|
|
|
31
31
|
}
|
|
32
32
|
const comments = await this.issueCommentRepository.getCommentsFromIssue(issue);
|
|
33
33
|
const lastTargetComments = comments.slice(-params.thresholdForAutoReject * 2);
|
|
34
|
-
if (lastTargetComments.filter((comment) => comment.content.startsWith('Auto Status Check: REJECTED')).length >= params.thresholdForAutoReject
|
|
34
|
+
if (lastTargetComments.filter((comment) => comment.content.startsWith('Auto Status Check: REJECTED')).length >= params.thresholdForAutoReject &&
|
|
35
|
+
!lastTargetComments.some((comment) => comment.content.toLowerCase().startsWith('retry'))) {
|
|
35
36
|
issue.status = params.awaitingQualityCheckStatus;
|
|
36
37
|
await this.issueRepository.update(issue, project);
|
|
37
38
|
await this.issueCommentRepository.createComment(issue, `Failed to pass the check autimatically for ${params.thresholdForAutoReject} times`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotifyFinishedIssuePreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":";;;AAIA,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,QAAgB;QAC1B,KAAK,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AACD,MAAa,uBAAwB,SAAQ,KAAK;IAChD,YACE,QAAgB,EAChB,aAA4B,EAC5B,cAA6B;QAE7B,KAAK,CACH,4BAA4B,QAAQ,cAAc,cAAc,aAAa,aAAa,EAAE,CAC7F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAXD,0DAWC;AASD,MAAa,qCAAqC;IAChD,YACmB,iBAAsD,EACtD,eAGhB,EACgB,sBAGhB;QARgB,sBAAiB,GAAjB,iBAAiB,CAAqC;QACtD,oBAAe,GAAf,eAAe,CAG/B;QACgB,2BAAsB,GAAtB,sBAAsB,CAGtC;QAGH,QAAG,GAAG,KAAK,EAAE,MAOZ,EAAiB,EAAE;YAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEzE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAEvE,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,iBAAiB,EAAE,CAAC;gBACrD,MAAM,IAAI,uBAAuB,CAC/B,MAAM,CAAC,QAAQ,EACf,KAAK,CAAC,MAAM,EACZ,MAAM,CAAC,iBAAiB,CACzB,CAAC;YACJ,CAAC;YACD,MAAM,QAAQ,GACZ,MAAM,IAAI,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAEhE,MAAM,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CACvC,CAAC,MAAM,CAAC,sBAAsB,GAAG,CAAC,CACnC,CAAC;YACF,IACE,kBAAkB,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CACpC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,6BAA6B,CAAC,CAC1D,CAAC,MAAM,IAAI,MAAM,CAAC,sBAAsB,
|
|
1
|
+
{"version":3,"file":"NotifyFinishedIssuePreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -383,6 +383,88 @@ describe('NotifyFinishedIssuePreparationUseCase', () => {
|
|
|
383
383
|
);
|
|
384
384
|
});
|
|
385
385
|
|
|
386
|
+
it('should not auto-escalate when retry comment exists even if threshold met', async () => {
|
|
387
|
+
const issue = createMockIssue({
|
|
388
|
+
url: 'https://github.com/user/repo/issues/1',
|
|
389
|
+
status: 'Preparation',
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
393
|
+
mockIssueRepository.get.mockResolvedValue(issue);
|
|
394
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
395
|
+
createMockComment({ content: 'Auto Status Check: REJECTED - first' }),
|
|
396
|
+
createMockComment({ content: 'Auto Status Check: REJECTED - second' }),
|
|
397
|
+
createMockComment({ content: 'Auto Status Check: REJECTED - third' }),
|
|
398
|
+
createMockComment({ content: 'retry' }),
|
|
399
|
+
]);
|
|
400
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
401
|
+
{
|
|
402
|
+
url: 'https://github.com/user/repo/pull/1',
|
|
403
|
+
isConflicted: false,
|
|
404
|
+
isPassedAllCiJob: true,
|
|
405
|
+
isResolvedAllReviewComments: true,
|
|
406
|
+
isBranchOutOfDate: false,
|
|
407
|
+
},
|
|
408
|
+
]);
|
|
409
|
+
|
|
410
|
+
await useCase.run({
|
|
411
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
412
|
+
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
413
|
+
preparationStatus: 'Preparation',
|
|
414
|
+
awaitingWorkspaceStatus: 'Awaiting Workspace',
|
|
415
|
+
awaitingQualityCheckStatus: 'Awaiting Quality Check',
|
|
416
|
+
thresholdForAutoReject: 3,
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
expect(mockIssueRepository.update).not.toHaveBeenCalledWith(
|
|
420
|
+
expect.objectContaining({
|
|
421
|
+
status: 'Awaiting Quality Check',
|
|
422
|
+
}),
|
|
423
|
+
mockProject,
|
|
424
|
+
);
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
it('should handle case-insensitive retry comment', async () => {
|
|
428
|
+
const issue = createMockIssue({
|
|
429
|
+
url: 'https://github.com/user/repo/issues/1',
|
|
430
|
+
status: 'Preparation',
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
434
|
+
mockIssueRepository.get.mockResolvedValue(issue);
|
|
435
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
436
|
+
createMockComment({ content: 'Auto Status Check: REJECTED - first' }),
|
|
437
|
+
createMockComment({ content: 'Auto Status Check: REJECTED - second' }),
|
|
438
|
+
createMockComment({ content: 'Auto Status Check: REJECTED - third' }),
|
|
439
|
+
createMockComment({ content: 'Retry please' }),
|
|
440
|
+
]);
|
|
441
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
442
|
+
{
|
|
443
|
+
url: 'https://github.com/user/repo/pull/1',
|
|
444
|
+
isConflicted: false,
|
|
445
|
+
isPassedAllCiJob: true,
|
|
446
|
+
isResolvedAllReviewComments: true,
|
|
447
|
+
isBranchOutOfDate: false,
|
|
448
|
+
},
|
|
449
|
+
]);
|
|
450
|
+
|
|
451
|
+
await useCase.run({
|
|
452
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
453
|
+
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
454
|
+
preparationStatus: 'Preparation',
|
|
455
|
+
awaitingWorkspaceStatus: 'Awaiting Workspace',
|
|
456
|
+
awaitingQualityCheckStatus: 'Awaiting Quality Check',
|
|
457
|
+
thresholdForAutoReject: 3,
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
expect(mockIssueRepository.update).not.toHaveBeenCalledWith(
|
|
461
|
+
expect.objectContaining({
|
|
462
|
+
status: 'Awaiting Quality Check',
|
|
463
|
+
}),
|
|
464
|
+
mockProject,
|
|
465
|
+
);
|
|
466
|
+
});
|
|
467
|
+
|
|
386
468
|
it('should reject when PR is not found', async () => {
|
|
387
469
|
const issue = createMockIssue({
|
|
388
470
|
url: 'https://github.com/user/repo/issues/1',
|
|
@@ -71,7 +71,10 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
71
71
|
if (
|
|
72
72
|
lastTargetComments.filter((comment) =>
|
|
73
73
|
comment.content.startsWith('Auto Status Check: REJECTED'),
|
|
74
|
-
).length >= params.thresholdForAutoReject
|
|
74
|
+
).length >= params.thresholdForAutoReject &&
|
|
75
|
+
!lastTargetComments.some((comment) =>
|
|
76
|
+
comment.content.toLowerCase().startsWith('retry'),
|
|
77
|
+
)
|
|
75
78
|
) {
|
|
76
79
|
issue.status = params.awaitingQualityCheckStatus;
|
|
77
80
|
await this.issueRepository.update(issue, project);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotifyFinishedIssuePreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,QAAQ,EAAE,MAAM;CAI7B;AACD,qBAAa,uBAAwB,SAAQ,KAAK;gBAE9C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,cAAc,EAAE,MAAM,GAAG,IAAI;CAOhC;AASD,qBAAa,qCAAqC;IAE9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAIhC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;gBALtB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EACtD,eAAe,EAAE,IAAI,CACpC,eAAe,EACf,KAAK,GAAG,QAAQ,GAAG,oBAAoB,CACxC,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,sBAAsB,GAAG,eAAe,CACzC;IAGH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,uBAAuB,EAAE,MAAM,CAAC;QAChC,0BAA0B,EAAE,MAAM,CAAC;QACnC,sBAAsB,EAAE,MAAM,CAAC;KAChC,KAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"NotifyFinishedIssuePreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAErF,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,QAAQ,EAAE,MAAM;CAI7B;AACD,qBAAa,uBAAwB,SAAQ,KAAK;gBAE9C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,cAAc,EAAE,MAAM,GAAG,IAAI;CAOhC;AASD,qBAAa,qCAAqC;IAE9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAIhC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;gBALtB,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EACtD,eAAe,EAAE,IAAI,CACpC,eAAe,EACf,KAAK,GAAG,QAAQ,GAAG,oBAAoB,CACxC,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,sBAAsB,GAAG,eAAe,CACzC;IAGH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,uBAAuB,EAAE,MAAM,CAAC;QAChC,0BAA0B,EAAE,MAAM,CAAC;QACnC,sBAAsB,EAAE,MAAM,CAAC;KAChC,KAAG,OAAO,CAAC,IAAI,CAAC,CAiFf;CACH"}
|