npm-cli-gh-issue-preparator 1.11.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 +14 -0
- package/bin/adapter/repositories/GraphqlIssueRepository.js +3 -1
- package/bin/adapter/repositories/GraphqlIssueRepository.js.map +1 -1
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +8 -9
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/repositories/GraphqlIssueRepository.integration.test.ts +9 -0
- package/src/adapter/repositories/GraphqlIssueRepository.test.ts +49 -0
- package/src/adapter/repositories/GraphqlIssueRepository.ts +5 -1
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +132 -4
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +12 -11
- package/types/adapter/repositories/GraphqlIssueRepository.d.ts.map +1 -1
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
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
|
+
|
|
8
|
+
# [1.12.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.11.0...v1.12.0) (2026-02-17)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Features
|
|
12
|
+
|
|
13
|
+
* **core:** change ANY_CI_JOB_FAILED to ANY_CI_JOB_FAILED_OR_IN_PROGRESS ([9e3cb16](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/9e3cb163b88e0c069edaaadf67cd23ceee41ff9d))
|
|
14
|
+
|
|
1
15
|
# [1.11.0](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.10.2...v1.11.0) (2026-02-16)
|
|
2
16
|
|
|
3
17
|
|
|
@@ -317,6 +317,7 @@ class GraphqlIssueRepository {
|
|
|
317
317
|
number
|
|
318
318
|
state
|
|
319
319
|
mergeable
|
|
320
|
+
mergeStateStatus
|
|
320
321
|
baseRefName
|
|
321
322
|
headRefName
|
|
322
323
|
commits(last: 1) {
|
|
@@ -391,7 +392,8 @@ class GraphqlIssueRepository {
|
|
|
391
392
|
const isConflicted = pr.mergeable === 'CONFLICTING';
|
|
392
393
|
const lastCommit = pr.commits?.nodes[0]?.commit;
|
|
393
394
|
const ciState = lastCommit?.statusCheckRollup?.state;
|
|
394
|
-
const
|
|
395
|
+
const mergeStateStatus = pr.mergeStateStatus;
|
|
396
|
+
const isPassedAllCiJob = ciState === 'SUCCESS' && mergeStateStatus !== 'BLOCKED';
|
|
395
397
|
const reviewThreads = pr.reviewThreads?.nodes || [];
|
|
396
398
|
const isResolvedAllReviewComments = reviewThreads.length === 0 ||
|
|
397
399
|
reviewThreads.every((thread) => thread.isResolved);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphqlIssueRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/GraphqlIssueRepository.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"GraphqlIssueRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/GraphqlIssueRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -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`);
|
|
@@ -39,11 +40,11 @@ class NotifyFinishedIssuePreparationUseCase {
|
|
|
39
40
|
}
|
|
40
41
|
const rejectedReasons = [];
|
|
41
42
|
const lastComment = comments[comments.length - 1];
|
|
42
|
-
if (!lastComment || lastComment.content.startsWith('
|
|
43
|
-
rejectedReasons.push('
|
|
43
|
+
if (!lastComment || !lastComment.content.startsWith('From:')) {
|
|
44
|
+
rejectedReasons.push('NO_REPORT_FROM_AGENT_BOT');
|
|
44
45
|
}
|
|
45
|
-
const
|
|
46
|
-
if (
|
|
46
|
+
const categoryLabels = issue.labels.filter((label) => label.startsWith('category:'));
|
|
47
|
+
if (categoryLabels.length <= 0 || categoryLabels.includes('category:e2e')) {
|
|
47
48
|
const relatedOpenPrs = await this.issueRepository.findRelatedOpenPRs(issue.url);
|
|
48
49
|
if (relatedOpenPrs.length <= 0) {
|
|
49
50
|
rejectedReasons.push('PULL_REQUEST_NOT_FOUND');
|
|
@@ -57,7 +58,7 @@ class NotifyFinishedIssuePreparationUseCase {
|
|
|
57
58
|
rejectedReasons.push('PULL_REQUEST_CONFLICTED');
|
|
58
59
|
}
|
|
59
60
|
if (!pr.isPassedAllCiJob) {
|
|
60
|
-
rejectedReasons.push('
|
|
61
|
+
rejectedReasons.push('ANY_CI_JOB_FAILED_OR_IN_PROGRESS');
|
|
61
62
|
}
|
|
62
63
|
if (!pr.isResolvedAllReviewComments) {
|
|
63
64
|
rejectedReasons.push('ANY_REVIEW_COMMENT_NOT_RESOLVED');
|
|
@@ -71,9 +72,7 @@ class NotifyFinishedIssuePreparationUseCase {
|
|
|
71
72
|
}
|
|
72
73
|
issue.status = params.awaitingWorkspaceStatus;
|
|
73
74
|
await this.issueRepository.update(issue, project);
|
|
74
|
-
await this.issueCommentRepository.createComment(issue, `
|
|
75
|
-
Auto Status Check: REJECTED
|
|
76
|
-
${JSON.stringify(rejectedReasons)}`);
|
|
75
|
+
await this.issueCommentRepository.createComment(issue, `Auto Status Check: REJECTED\n${rejectedReasons.map((v) => `- ${v}`).join('\n')}`);
|
|
77
76
|
};
|
|
78
77
|
}
|
|
79
78
|
}
|
|
@@ -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
|
@@ -158,5 +158,14 @@ describe('GraphqlIssueRepository Integration Tests', () => {
|
|
|
158
158
|
|
|
159
159
|
expect(result).toHaveLength(1);
|
|
160
160
|
});
|
|
161
|
+
|
|
162
|
+
it('should return isPassedAllCiJob as false for issue with PR that has not passed all required CI', async () => {
|
|
163
|
+
const result = await repository.findRelatedOpenPRs(
|
|
164
|
+
'https://github.com/HiromiShikata/test-repository/issues/1967',
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
expect(result.length).toBeGreaterThanOrEqual(1);
|
|
168
|
+
expect(result.some((pr) => pr.isPassedAllCiJob === false)).toBe(true);
|
|
169
|
+
});
|
|
161
170
|
});
|
|
162
171
|
});
|
|
@@ -459,6 +459,7 @@ describe('GraphqlIssueRepository', () => {
|
|
|
459
459
|
number: 1,
|
|
460
460
|
state: 'OPEN',
|
|
461
461
|
mergeable: 'MERGEABLE',
|
|
462
|
+
mergeStateStatus: 'CLEAN',
|
|
462
463
|
baseRefName: 'main',
|
|
463
464
|
headRefName: 'feature',
|
|
464
465
|
commits: {
|
|
@@ -1021,6 +1022,54 @@ describe('GraphqlIssueRepository', () => {
|
|
|
1021
1022
|
expect(result).toHaveLength(1);
|
|
1022
1023
|
expect(result[0].isPassedAllCiJob).toBe(false);
|
|
1023
1024
|
});
|
|
1025
|
+
|
|
1026
|
+
it('should return isPassedAllCiJob as false when mergeStateStatus is BLOCKED even with SUCCESS CI', async () => {
|
|
1027
|
+
mockFetch.mockResolvedValueOnce({
|
|
1028
|
+
ok: true,
|
|
1029
|
+
json: async () => ({
|
|
1030
|
+
data: {
|
|
1031
|
+
repository: {
|
|
1032
|
+
issue: {
|
|
1033
|
+
timelineItems: {
|
|
1034
|
+
pageInfo: { hasNextPage: false, endCursor: null },
|
|
1035
|
+
nodes: [
|
|
1036
|
+
{
|
|
1037
|
+
__typename: 'CrossReferencedEvent',
|
|
1038
|
+
source: {
|
|
1039
|
+
__typename: 'PullRequest',
|
|
1040
|
+
url: 'https://github.com/user/repo/pull/1',
|
|
1041
|
+
number: 1,
|
|
1042
|
+
state: 'OPEN',
|
|
1043
|
+
mergeable: 'MERGEABLE',
|
|
1044
|
+
mergeStateStatus: 'BLOCKED',
|
|
1045
|
+
commits: {
|
|
1046
|
+
nodes: [
|
|
1047
|
+
{
|
|
1048
|
+
commit: {
|
|
1049
|
+
statusCheckRollup: { state: 'SUCCESS' },
|
|
1050
|
+
},
|
|
1051
|
+
},
|
|
1052
|
+
],
|
|
1053
|
+
},
|
|
1054
|
+
reviewThreads: { nodes: [] },
|
|
1055
|
+
baseRef: { name: 'main' },
|
|
1056
|
+
},
|
|
1057
|
+
},
|
|
1058
|
+
],
|
|
1059
|
+
},
|
|
1060
|
+
},
|
|
1061
|
+
},
|
|
1062
|
+
},
|
|
1063
|
+
}),
|
|
1064
|
+
});
|
|
1065
|
+
|
|
1066
|
+
const result = await repository.findRelatedOpenPRs(
|
|
1067
|
+
'https://github.com/user/repo/issues/1',
|
|
1068
|
+
);
|
|
1069
|
+
|
|
1070
|
+
expect(result).toHaveLength(1);
|
|
1071
|
+
expect(result[0].isPassedAllCiJob).toBe(false);
|
|
1072
|
+
});
|
|
1024
1073
|
});
|
|
1025
1074
|
|
|
1026
1075
|
describe('get', () => {
|
|
@@ -65,6 +65,7 @@ type TimelineItem = {
|
|
|
65
65
|
number?: number;
|
|
66
66
|
state?: string;
|
|
67
67
|
mergeable?: string;
|
|
68
|
+
mergeStateStatus?: string;
|
|
68
69
|
baseRefName?: string;
|
|
69
70
|
headRefName?: string;
|
|
70
71
|
commits?: {
|
|
@@ -511,6 +512,7 @@ export class GraphqlIssueRepository implements Pick<
|
|
|
511
512
|
number
|
|
512
513
|
state
|
|
513
514
|
mergeable
|
|
515
|
+
mergeStateStatus
|
|
514
516
|
baseRefName
|
|
515
517
|
headRefName
|
|
516
518
|
commits(last: 1) {
|
|
@@ -599,7 +601,9 @@ export class GraphqlIssueRepository implements Pick<
|
|
|
599
601
|
|
|
600
602
|
const lastCommit = pr.commits?.nodes[0]?.commit;
|
|
601
603
|
const ciState = lastCommit?.statusCheckRollup?.state;
|
|
602
|
-
const
|
|
604
|
+
const mergeStateStatus = pr.mergeStateStatus;
|
|
605
|
+
const isPassedAllCiJob =
|
|
606
|
+
ciState === 'SUCCESS' && mergeStateStatus !== 'BLOCKED';
|
|
603
607
|
|
|
604
608
|
const reviewThreads = pr.reviewThreads?.nodes || [];
|
|
605
609
|
const isResolvedAllReviewComments =
|
|
@@ -224,7 +224,7 @@ describe('NotifyFinishedIssuePreparationUseCase', () => {
|
|
|
224
224
|
);
|
|
225
225
|
});
|
|
226
226
|
|
|
227
|
-
it('should
|
|
227
|
+
it('should reject when last comment does not start with From:', async () => {
|
|
228
228
|
const issue = createMockIssue({
|
|
229
229
|
url: 'https://github.com/user/repo/issues/1',
|
|
230
230
|
status: 'Preparation',
|
|
@@ -256,10 +256,16 @@ describe('NotifyFinishedIssuePreparationUseCase', () => {
|
|
|
256
256
|
|
|
257
257
|
expect(mockIssueRepository.update).toHaveBeenCalledWith(
|
|
258
258
|
expect.objectContaining({
|
|
259
|
-
status: 'Awaiting
|
|
259
|
+
status: 'Awaiting Workspace',
|
|
260
260
|
}),
|
|
261
261
|
mockProject,
|
|
262
262
|
);
|
|
263
|
+
expect(mockIssueCommentRepository.createComment).toHaveBeenCalledWith(
|
|
264
|
+
expect.objectContaining({
|
|
265
|
+
url: 'https://github.com/user/repo/issues/1',
|
|
266
|
+
}),
|
|
267
|
+
expect.stringContaining('NO_REPORT_FROM_AGENT_BOT'),
|
|
268
|
+
);
|
|
263
269
|
});
|
|
264
270
|
|
|
265
271
|
it('should reject and set status to Awaiting Workspace when no comments exist', async () => {
|
|
@@ -377,6 +383,88 @@ describe('NotifyFinishedIssuePreparationUseCase', () => {
|
|
|
377
383
|
);
|
|
378
384
|
});
|
|
379
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
|
+
|
|
380
468
|
it('should reject when PR is not found', async () => {
|
|
381
469
|
const issue = createMockIssue({
|
|
382
470
|
url: 'https://github.com/user/repo/issues/1',
|
|
@@ -548,7 +636,7 @@ describe('NotifyFinishedIssuePreparationUseCase', () => {
|
|
|
548
636
|
expect.objectContaining({
|
|
549
637
|
url: 'https://github.com/user/repo/issues/1',
|
|
550
638
|
}),
|
|
551
|
-
expect.stringContaining('
|
|
639
|
+
expect.stringContaining('ANY_CI_JOB_FAILED_OR_IN_PROGRESS'),
|
|
552
640
|
);
|
|
553
641
|
});
|
|
554
642
|
|
|
@@ -627,6 +715,46 @@ describe('NotifyFinishedIssuePreparationUseCase', () => {
|
|
|
627
715
|
);
|
|
628
716
|
});
|
|
629
717
|
|
|
718
|
+
it('should check PRs when issue has category:e2e label', async () => {
|
|
719
|
+
const issue = createMockIssue({
|
|
720
|
+
url: 'https://github.com/user/repo/issues/1',
|
|
721
|
+
status: 'Preparation',
|
|
722
|
+
labels: ['category:e2e'],
|
|
723
|
+
});
|
|
724
|
+
|
|
725
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
726
|
+
mockIssueRepository.get.mockResolvedValue(issue);
|
|
727
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
728
|
+
createMockComment({ content: 'From: Test report' }),
|
|
729
|
+
]);
|
|
730
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
731
|
+
{
|
|
732
|
+
url: 'https://github.com/user/repo/pull/1',
|
|
733
|
+
isConflicted: false,
|
|
734
|
+
isPassedAllCiJob: true,
|
|
735
|
+
isResolvedAllReviewComments: true,
|
|
736
|
+
isBranchOutOfDate: false,
|
|
737
|
+
},
|
|
738
|
+
]);
|
|
739
|
+
|
|
740
|
+
await useCase.run({
|
|
741
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
742
|
+
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
743
|
+
preparationStatus: 'Preparation',
|
|
744
|
+
awaitingWorkspaceStatus: 'Awaiting Workspace',
|
|
745
|
+
awaitingQualityCheckStatus: 'Awaiting Quality Check',
|
|
746
|
+
thresholdForAutoReject: 3,
|
|
747
|
+
});
|
|
748
|
+
|
|
749
|
+
expect(mockIssueRepository.findRelatedOpenPRs).toHaveBeenCalled();
|
|
750
|
+
expect(mockIssueRepository.update).toHaveBeenCalledWith(
|
|
751
|
+
expect.objectContaining({
|
|
752
|
+
status: 'Awaiting Quality Check',
|
|
753
|
+
}),
|
|
754
|
+
mockProject,
|
|
755
|
+
);
|
|
756
|
+
});
|
|
757
|
+
|
|
630
758
|
it('should still check for report comment even when issue has category label', async () => {
|
|
631
759
|
const issue = createMockIssue({
|
|
632
760
|
url: 'https://github.com/user/repo/issues/1',
|
|
@@ -662,7 +790,7 @@ describe('NotifyFinishedIssuePreparationUseCase', () => {
|
|
|
662
790
|
expect.objectContaining({
|
|
663
791
|
url: 'https://github.com/user/repo/issues/1',
|
|
664
792
|
}),
|
|
665
|
-
expect.stringContaining('
|
|
793
|
+
expect.stringContaining('NO_REPORT_FROM_AGENT_BOT'),
|
|
666
794
|
);
|
|
667
795
|
});
|
|
668
796
|
});
|
|
@@ -21,11 +21,11 @@ export class IllegalIssueStatusError extends Error {
|
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
23
|
type RejectedReasonType =
|
|
24
|
-
| '
|
|
24
|
+
| 'NO_REPORT_FROM_AGENT_BOT'
|
|
25
25
|
| 'PULL_REQUEST_NOT_FOUND'
|
|
26
26
|
| 'MULTIPLE_PULL_REQUESTS_FOUND'
|
|
27
27
|
| 'PULL_REQUEST_CONFLICTED'
|
|
28
|
-
| '
|
|
28
|
+
| 'ANY_CI_JOB_FAILED_OR_IN_PROGRESS'
|
|
29
29
|
| 'ANY_REVIEW_COMMENT_NOT_RESOLVED';
|
|
30
30
|
|
|
31
31
|
export class NotifyFinishedIssuePreparationUseCase {
|
|
@@ -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);
|
|
@@ -84,14 +87,14 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
84
87
|
|
|
85
88
|
const rejectedReasons: RejectedReasonType[] = [];
|
|
86
89
|
const lastComment = comments[comments.length - 1];
|
|
87
|
-
if (!lastComment || lastComment.content.startsWith('
|
|
88
|
-
rejectedReasons.push('
|
|
90
|
+
if (!lastComment || !lastComment.content.startsWith('From:')) {
|
|
91
|
+
rejectedReasons.push('NO_REPORT_FROM_AGENT_BOT');
|
|
89
92
|
}
|
|
90
93
|
|
|
91
|
-
const
|
|
94
|
+
const categoryLabels = issue.labels.filter((label) =>
|
|
92
95
|
label.startsWith('category:'),
|
|
93
96
|
);
|
|
94
|
-
if (
|
|
97
|
+
if (categoryLabels.length <= 0 || categoryLabels.includes('category:e2e')) {
|
|
95
98
|
const relatedOpenPrs = await this.issueRepository.findRelatedOpenPRs(
|
|
96
99
|
issue.url,
|
|
97
100
|
);
|
|
@@ -105,7 +108,7 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
105
108
|
rejectedReasons.push('PULL_REQUEST_CONFLICTED');
|
|
106
109
|
}
|
|
107
110
|
if (!pr.isPassedAllCiJob) {
|
|
108
|
-
rejectedReasons.push('
|
|
111
|
+
rejectedReasons.push('ANY_CI_JOB_FAILED_OR_IN_PROGRESS');
|
|
109
112
|
}
|
|
110
113
|
if (!pr.isResolvedAllReviewComments) {
|
|
111
114
|
rejectedReasons.push('ANY_REVIEW_COMMENT_NOT_RESOLVED');
|
|
@@ -124,9 +127,7 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
124
127
|
|
|
125
128
|
await this.issueCommentRepository.createComment(
|
|
126
129
|
issue,
|
|
127
|
-
`
|
|
128
|
-
Auto Status Check: REJECTED
|
|
129
|
-
${JSON.stringify(rejectedReasons)}`,
|
|
130
|
+
`Auto Status Check: REJECTED\n${rejectedReasons.map((v) => `- ${v}`).join('\n')}`,
|
|
130
131
|
);
|
|
131
132
|
};
|
|
132
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphqlIssueRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/GraphqlIssueRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,EACnB,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"GraphqlIssueRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/GraphqlIssueRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,kBAAkB,EACnB,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AA+JxD,qBAAa,sBAAuB,YAAW,IAAI,CACjD,eAAe,EACf,KAAK,GAAG,QAAQ,GAAG,oBAAoB,CACxC;IACa,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,MAAM;IAEpC,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAiHpE,OAAO,CAAC,eAAe;YAgBT,iBAAiB;IAuHzB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAuD3D,OAAO,CAAC,aAAa;IAkBf,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC;CA6I1E"}
|
|
@@ -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"}
|