github-issue-tower-defence-management 1.147.1 → 1.147.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.
- package/CHANGELOG.md +7 -0
- package/README.md +1 -0
- package/bin/adapter/entry-points/cli/index.js +3 -0
- package/bin/adapter/entry-points/cli/index.js.map +1 -1
- package/bin/adapter/entry-points/cli/projectConfig.js +4 -0
- package/bin/adapter/entry-points/cli/projectConfig.js.map +1 -1
- package/bin/domain/usecases/CheckIssueReviewReadinessUseCase.js +2 -1
- package/bin/domain/usecases/CheckIssueReviewReadinessUseCase.js.map +1 -1
- package/bin/domain/usecases/HandleScheduledEventUseCase.js +2 -0
- package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -1
- package/bin/domain/usecases/IssueRejectionEvaluator.js +3 -3
- package/bin/domain/usecases/IssueRejectionEvaluator.js.map +1 -1
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +4 -3
- package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
- package/bin/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.js +3 -2
- package/bin/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.js.map +1 -1
- package/bin/domain/usecases/RevertOrphanedPreparationUseCase.js +5 -4
- package/bin/domain/usecases/RevertOrphanedPreparationUseCase.js.map +1 -1
- package/bin/domain/usecases/resolveLabelsNotRequiringPullRequest.js +9 -0
- package/bin/domain/usecases/resolveLabelsNotRequiringPullRequest.js.map +1 -0
- package/package.json +1 -1
- package/src/adapter/entry-points/cli/index.test.ts +4 -0
- package/src/adapter/entry-points/cli/index.ts +6 -0
- package/src/adapter/entry-points/cli/projectConfig.ts +9 -0
- package/src/domain/usecases/CheckIssueReviewReadinessUseCase.test.ts +18 -0
- package/src/domain/usecases/CheckIssueReviewReadinessUseCase.ts +3 -1
- package/src/domain/usecases/HandleScheduledEventUseCase.ts +3 -0
- package/src/domain/usecases/IssueRejectionEvaluator.ts +4 -4
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.test.ts +30 -0
- package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +8 -3
- package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.test.ts +23 -0
- package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts +4 -2
- package/src/domain/usecases/RevertOrphanedPreparationUseCase.test.ts +37 -0
- package/src/domain/usecases/RevertOrphanedPreparationUseCase.ts +7 -5
- package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.test.ts +33 -0
- package/src/domain/usecases/resolveLabelsNotRequiringPullRequest.ts +7 -0
- package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
- package/types/adapter/entry-points/cli/projectConfig.d.ts +1 -0
- package/types/adapter/entry-points/cli/projectConfig.d.ts.map +1 -1
- package/types/domain/usecases/CheckIssueReviewReadinessUseCase.d.ts +1 -0
- package/types/domain/usecases/CheckIssueReviewReadinessUseCase.d.ts.map +1 -1
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +1 -0
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -1
- package/types/domain/usecases/IssueRejectionEvaluator.d.ts +1 -1
- package/types/domain/usecases/IssueRejectionEvaluator.d.ts.map +1 -1
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts +1 -0
- package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
- package/types/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.d.ts +1 -0
- package/types/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.d.ts.map +1 -1
- package/types/domain/usecases/RevertOrphanedPreparationUseCase.d.ts +1 -0
- package/types/domain/usecases/RevertOrphanedPreparationUseCase.d.ts.map +1 -1
- package/types/domain/usecases/resolveLabelsNotRequiringPullRequest.d.ts +5 -0
- package/types/domain/usecases/resolveLabelsNotRequiringPullRequest.d.ts.map +1 -0
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RevertOrphanedPreparationUseCase = void 0;
|
|
4
4
|
const WorkflowStatus_1 = require("../entities/WorkflowStatus");
|
|
5
|
+
const resolveLabelsNotRequiringPullRequest_1 = require("./resolveLabelsNotRequiringPullRequest");
|
|
5
6
|
const ORPHANED_PREPARATION_REJECTION_DETAIL = 'ORPHANED_PREPARATION';
|
|
6
7
|
class RevertOrphanedPreparationUseCase {
|
|
7
8
|
constructor(projectRepository, issueRepository, issueCommentRepository, localCommandRunner) {
|
|
@@ -32,7 +33,7 @@ class RevertOrphanedPreparationUseCase {
|
|
|
32
33
|
if (!isOrphaned) {
|
|
33
34
|
continue;
|
|
34
35
|
}
|
|
35
|
-
const { hasRejections, comments } = await this.evaluateHasRejections(issue,
|
|
36
|
+
const { hasRejections, comments } = await this.evaluateHasRejections(issue, (0, resolveLabelsNotRequiringPullRequest_1.resolveLabelsNotRequiringPullRequest)(params));
|
|
36
37
|
if (!hasRejections) {
|
|
37
38
|
if (awaitingQualityCheckStatusOption) {
|
|
38
39
|
await this.issueRepository.updateStatus(project, issue, awaitingQualityCheckStatusOption.id);
|
|
@@ -59,7 +60,7 @@ class RevertOrphanedPreparationUseCase {
|
|
|
59
60
|
await this.issueCommentRepository.createComment(issue, rejectionStatusMessage);
|
|
60
61
|
}
|
|
61
62
|
};
|
|
62
|
-
this.evaluateHasRejections = async (issue,
|
|
63
|
+
this.evaluateHasRejections = async (issue, labelsNotRequiringPullRequest) => {
|
|
63
64
|
if (issue.isClosed) {
|
|
64
65
|
return { hasRejections: false, comments: [] };
|
|
65
66
|
}
|
|
@@ -73,9 +74,9 @@ class RevertOrphanedPreparationUseCase {
|
|
|
73
74
|
}
|
|
74
75
|
const categoryLabels = issue.labels.filter((label) => label.startsWith('category:'));
|
|
75
76
|
const hasLlmAgentLabel = issue.labels.some((l) => l === 'llm-agent' || l.startsWith('llm-agent:'));
|
|
76
|
-
const
|
|
77
|
+
const hasLabelNotRequiringPullRequest = issue.labels.some((label) => labelsNotRequiringPullRequest.includes(label));
|
|
77
78
|
if (hasLlmAgentLabel ||
|
|
78
|
-
|
|
79
|
+
hasLabelNotRequiringPullRequest ||
|
|
79
80
|
(categoryLabels.length > 0 && !categoryLabels.includes('category:e2e'))) {
|
|
80
81
|
return { hasRejections: false, comments };
|
|
81
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RevertOrphanedPreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/RevertOrphanedPreparationUseCase.ts"],"names":[],"mappings":";;;AASA,+DAKoC;
|
|
1
|
+
{"version":3,"file":"RevertOrphanedPreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/RevertOrphanedPreparationUseCase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveLabelsNotRequiringPullRequest = void 0;
|
|
4
|
+
const resolveLabelsNotRequiringPullRequest = (source) => [
|
|
5
|
+
...(source.labelsAsLlmAgentName ?? []),
|
|
6
|
+
...(source.labelsNotRequiringPullRequest ?? []),
|
|
7
|
+
];
|
|
8
|
+
exports.resolveLabelsNotRequiringPullRequest = resolveLabelsNotRequiringPullRequest;
|
|
9
|
+
//# sourceMappingURL=resolveLabelsNotRequiringPullRequest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolveLabelsNotRequiringPullRequest.js","sourceRoot":"","sources":["../../../src/domain/usecases/resolveLabelsNotRequiringPullRequest.ts"],"names":[],"mappings":";;;AAAO,MAAM,oCAAoC,GAAG,CAAC,MAGpD,EAAY,EAAE,CAAC;IACd,GAAG,CAAC,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAAC;IACtC,GAAG,CAAC,MAAM,CAAC,6BAA6B,IAAI,EAAE,CAAC;CAChD,CAAC;AANW,QAAA,oCAAoC,wCAM/C"}
|
package/package.json
CHANGED
|
@@ -1472,6 +1472,7 @@ mysteryKey: 'value'
|
|
|
1472
1472
|
workflowBlockerResolvedWebhookUrl: null,
|
|
1473
1473
|
allowedIssueAuthors: null,
|
|
1474
1474
|
labelsAsLlmAgentName: null,
|
|
1475
|
+
labelsNotRequiringPullRequest: null,
|
|
1475
1476
|
changeTargetPathAliases: null,
|
|
1476
1477
|
});
|
|
1477
1478
|
});
|
|
@@ -1508,6 +1509,7 @@ mysteryKey: 'value'
|
|
|
1508
1509
|
workflowBlockerResolvedWebhookUrl: null,
|
|
1509
1510
|
allowedIssueAuthors: null,
|
|
1510
1511
|
labelsAsLlmAgentName: null,
|
|
1512
|
+
labelsNotRequiringPullRequest: null,
|
|
1511
1513
|
changeTargetPathAliases: null,
|
|
1512
1514
|
});
|
|
1513
1515
|
});
|
|
@@ -1789,6 +1791,7 @@ mysteryKey: 'value'
|
|
|
1789
1791
|
issueUrl: 'https://github.com/test/repo/issues/1',
|
|
1790
1792
|
allowedIssueAuthors: null,
|
|
1791
1793
|
labelsAsLlmAgentName: null,
|
|
1794
|
+
labelsNotRequiringPullRequest: null,
|
|
1792
1795
|
});
|
|
1793
1796
|
expect(stdoutSpy).toHaveBeenCalledWith(
|
|
1794
1797
|
`${JSON.stringify({ reviewReady: true, rejections: [] })}\n`,
|
|
@@ -1874,6 +1877,7 @@ mysteryKey: 'value'
|
|
|
1874
1877
|
issueUrl: 'https://github.com/test/repo/issues/1',
|
|
1875
1878
|
allowedIssueAuthors: null,
|
|
1876
1879
|
labelsAsLlmAgentName: null,
|
|
1880
|
+
labelsNotRequiringPullRequest: null,
|
|
1877
1881
|
});
|
|
1878
1882
|
|
|
1879
1883
|
stdoutSpy.mockRestore();
|
|
@@ -385,6 +385,8 @@ program
|
|
|
385
385
|
awLogDirectoryPath: config.awLogDirectoryPath,
|
|
386
386
|
awLogStaleThresholdMinutes: config.awLogStaleThresholdMinutes,
|
|
387
387
|
labelsAsLlmAgentName: config.labelsAsLlmAgentName ?? null,
|
|
388
|
+
labelsNotRequiringPullRequest:
|
|
389
|
+
config.labelsNotRequiringPullRequest ?? null,
|
|
388
390
|
});
|
|
389
391
|
}
|
|
390
392
|
|
|
@@ -589,6 +591,8 @@ program
|
|
|
589
591
|
workflowBlockerResolvedWebhookUrl,
|
|
590
592
|
allowedIssueAuthors,
|
|
591
593
|
labelsAsLlmAgentName: config.labelsAsLlmAgentName ?? null,
|
|
594
|
+
labelsNotRequiringPullRequest:
|
|
595
|
+
config.labelsNotRequiringPullRequest ?? null,
|
|
592
596
|
changeTargetPathAliases: config.changeTargetPathAliases ?? null,
|
|
593
597
|
});
|
|
594
598
|
});
|
|
@@ -686,6 +690,8 @@ program
|
|
|
686
690
|
issueUrl: options.issueUrl,
|
|
687
691
|
allowedIssueAuthors,
|
|
688
692
|
labelsAsLlmAgentName: config.labelsAsLlmAgentName ?? null,
|
|
693
|
+
labelsNotRequiringPullRequest:
|
|
694
|
+
config.labelsNotRequiringPullRequest ?? null,
|
|
689
695
|
});
|
|
690
696
|
|
|
691
697
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
@@ -22,6 +22,7 @@ export type ConfigFile = {
|
|
|
22
22
|
awLogDirectoryPath?: string;
|
|
23
23
|
awLogStaleThresholdMinutes?: number;
|
|
24
24
|
labelsAsLlmAgentName?: string[];
|
|
25
|
+
labelsNotRequiringPullRequest?: string[];
|
|
25
26
|
changeTargetPathAliases?: Record<string, string>;
|
|
26
27
|
consoleAccessToken?: string;
|
|
27
28
|
consoleProjects?: Record<string, string>;
|
|
@@ -179,6 +180,10 @@ export const loadConfigFile = (configFilePath: string): ConfigFile => {
|
|
|
179
180
|
'awLogStaleThresholdMinutes',
|
|
180
181
|
),
|
|
181
182
|
labelsAsLlmAgentName: getStringArrayValue(parsed, 'labelsAsLlmAgentName'),
|
|
183
|
+
labelsNotRequiringPullRequest: getStringArrayValue(
|
|
184
|
+
parsed,
|
|
185
|
+
'labelsNotRequiringPullRequest',
|
|
186
|
+
),
|
|
182
187
|
changeTargetPathAliases: getStringRecordValue(
|
|
183
188
|
parsed,
|
|
184
189
|
'changeTargetPathAliases',
|
|
@@ -348,6 +353,10 @@ export const mergeConfigs = (
|
|
|
348
353
|
readmeOverrides.labelsAsLlmAgentName ??
|
|
349
354
|
cliOverrides.labelsAsLlmAgentName ??
|
|
350
355
|
configFile.labelsAsLlmAgentName,
|
|
356
|
+
labelsNotRequiringPullRequest:
|
|
357
|
+
readmeOverrides.labelsNotRequiringPullRequest ??
|
|
358
|
+
cliOverrides.labelsNotRequiringPullRequest ??
|
|
359
|
+
configFile.labelsNotRequiringPullRequest,
|
|
351
360
|
changeTargetPathAliases:
|
|
352
361
|
readmeOverrides.changeTargetPathAliases ??
|
|
353
362
|
cliOverrides.changeTargetPathAliases ??
|
|
@@ -106,6 +106,24 @@ describe('CheckIssueReviewReadinessUseCase', () => {
|
|
|
106
106
|
]);
|
|
107
107
|
});
|
|
108
108
|
|
|
109
|
+
it('should return reviewReady=true when the issue label is only in labelsNotRequiringPullRequest and no pull request exists', async () => {
|
|
110
|
+
const issue = createMockIssue({ labels: ['story'] });
|
|
111
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
112
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
113
|
+
createMockComment(),
|
|
114
|
+
]);
|
|
115
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
|
|
116
|
+
|
|
117
|
+
const result = await useCase.run({
|
|
118
|
+
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
119
|
+
labelsAsLlmAgentName: ['chore'],
|
|
120
|
+
labelsNotRequiringPullRequest: ['story'],
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
expect(result.rejections).toEqual([]);
|
|
124
|
+
expect(result.reviewReady).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
|
|
109
127
|
it('should return reviewReady=false with NO_REPORT_FROM_AGENT_BOT when no comments exist', async () => {
|
|
110
128
|
const issue = createMockIssue();
|
|
111
129
|
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
IssueRejectionEvaluator,
|
|
5
5
|
PrRejectedReasonType,
|
|
6
6
|
} from './IssueRejectionEvaluator';
|
|
7
|
+
import { resolveLabelsNotRequiringPullRequest } from './resolveLabelsNotRequiringPullRequest';
|
|
7
8
|
|
|
8
9
|
type RejectedReasonType =
|
|
9
10
|
| 'ISSUE_NOT_FOUND'
|
|
@@ -40,6 +41,7 @@ export class CheckIssueReviewReadinessUseCase {
|
|
|
40
41
|
issueUrl: string;
|
|
41
42
|
allowedIssueAuthors?: string[] | null;
|
|
42
43
|
labelsAsLlmAgentName?: string[] | null;
|
|
44
|
+
labelsNotRequiringPullRequest?: string[] | null;
|
|
43
45
|
}): Promise<IssueReviewReadinessResult> => {
|
|
44
46
|
const issue = await this.issueRepository.getIssueByUrl(params.issueUrl);
|
|
45
47
|
|
|
@@ -83,7 +85,7 @@ export class CheckIssueReviewReadinessUseCase {
|
|
|
83
85
|
const { rejections: prRejections } =
|
|
84
86
|
await this.issueRejectionEvaluator.evaluate(
|
|
85
87
|
issue,
|
|
86
|
-
params
|
|
88
|
+
resolveLabelsNotRequiringPullRequest(params),
|
|
87
89
|
);
|
|
88
90
|
|
|
89
91
|
const allRejections = [...rejections, ...prRejections];
|
|
@@ -156,6 +156,7 @@ export class HandleScheduledEventUseCase {
|
|
|
156
156
|
urlOfStoryView: string;
|
|
157
157
|
disabled: boolean;
|
|
158
158
|
labelsAsLlmAgentName?: string[] | null;
|
|
159
|
+
labelsNotRequiringPullRequest?: string[] | null;
|
|
159
160
|
changeTargetPathAliases?: Record<string, string> | null;
|
|
160
161
|
allowedIssueAuthors?: string[] | null;
|
|
161
162
|
autoAssignManagerAuthors?: string[] | null;
|
|
@@ -408,6 +409,7 @@ ${JSON.stringify(e)}
|
|
|
408
409
|
projectUrl: input.projectUrl,
|
|
409
410
|
manager: input.manager,
|
|
410
411
|
labelsAsLlmAgentName,
|
|
412
|
+
labelsNotRequiringPullRequest: input.labelsNotRequiringPullRequest,
|
|
411
413
|
changeTargetPathAliases: input.changeTargetPathAliases,
|
|
412
414
|
allowedIssueAuthors,
|
|
413
415
|
});
|
|
@@ -437,6 +439,7 @@ ${JSON.stringify(e)}
|
|
|
437
439
|
awaitingQualityCheckStatus:
|
|
438
440
|
input.startPreparation.awaitingQualityCheckStatus ?? undefined,
|
|
439
441
|
labelsAsLlmAgentName,
|
|
442
|
+
labelsNotRequiringPullRequest: input.labelsNotRequiringPullRequest,
|
|
440
443
|
});
|
|
441
444
|
}
|
|
442
445
|
const preparationResult = await this.startPreparationUseCase.run({
|
|
@@ -46,7 +46,7 @@ export class IssueRejectionEvaluator {
|
|
|
46
46
|
labels: string[];
|
|
47
47
|
isPr: boolean;
|
|
48
48
|
},
|
|
49
|
-
|
|
49
|
+
labelsNotRequiringPullRequest: string[] = [],
|
|
50
50
|
options: EvaluateOptions = {},
|
|
51
51
|
): Promise<PrRejectionResult> => {
|
|
52
52
|
const rejections: { type: PrRejectedReasonType; detail: string }[] = [];
|
|
@@ -58,13 +58,13 @@ export class IssueRejectionEvaluator {
|
|
|
58
58
|
const hasLlmAgentLabel = issue.labels.some(
|
|
59
59
|
(l) => l === 'llm-agent' || l.startsWith('llm-agent:'),
|
|
60
60
|
);
|
|
61
|
-
const
|
|
62
|
-
|
|
61
|
+
const hasLabelNotRequiringPullRequest = issue.labels.some((label) =>
|
|
62
|
+
labelsNotRequiringPullRequest.includes(label),
|
|
63
63
|
);
|
|
64
64
|
|
|
65
65
|
if (
|
|
66
66
|
!hasLlmAgentLabel &&
|
|
67
|
-
!
|
|
67
|
+
!hasLabelNotRequiringPullRequest &&
|
|
68
68
|
(categoryLabels.length <= 0 || categoryLabels.includes('category:e2e'))
|
|
69
69
|
) {
|
|
70
70
|
let prsToCheck: RelatedPullRequest[];
|
|
@@ -1087,6 +1087,36 @@ describe('NotifyFinishedIssuePreparationUseCase', () => {
|
|
|
1087
1087
|
);
|
|
1088
1088
|
});
|
|
1089
1089
|
|
|
1090
|
+
it('should not reject a missing PR when the issue label is only in labelsNotRequiringPullRequest', async () => {
|
|
1091
|
+
const issue = createMockIssue({
|
|
1092
|
+
url: 'https://github.com/user/repo/issues/1',
|
|
1093
|
+
status: 'Preparation',
|
|
1094
|
+
labels: ['story'],
|
|
1095
|
+
});
|
|
1096
|
+
|
|
1097
|
+
mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
|
|
1098
|
+
mockIssueRepository.get.mockResolvedValue(issue);
|
|
1099
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
1100
|
+
createMockComment({ content: 'From: :robot: Test report' }),
|
|
1101
|
+
]);
|
|
1102
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
|
|
1103
|
+
|
|
1104
|
+
await useCase.run({
|
|
1105
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
1106
|
+
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
1107
|
+
thresholdForAutoReject: 3,
|
|
1108
|
+
workflowBlockerResolvedWebhookUrl: null,
|
|
1109
|
+
allowedIssueAuthors: null,
|
|
1110
|
+
labelsAsLlmAgentName: ['chore', 'accounting'],
|
|
1111
|
+
labelsNotRequiringPullRequest: ['story'],
|
|
1112
|
+
});
|
|
1113
|
+
|
|
1114
|
+
expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalledWith(
|
|
1115
|
+
expect.anything(),
|
|
1116
|
+
expect.stringContaining('PULL_REQUEST_NOT_FOUND'),
|
|
1117
|
+
);
|
|
1118
|
+
});
|
|
1119
|
+
|
|
1090
1120
|
it('should reject when multiple PRs are found', async () => {
|
|
1091
1121
|
const issue = createMockIssue({
|
|
1092
1122
|
url: 'https://github.com/user/repo/issues/1',
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
PrRejectedReasonType,
|
|
14
14
|
} from './IssueRejectionEvaluator';
|
|
15
15
|
import { ChangeTargetPullRequestApprover } from './ChangeTargetPullRequestApprover';
|
|
16
|
+
import { resolveLabelsNotRequiringPullRequest } from './resolveLabelsNotRequiringPullRequest';
|
|
16
17
|
|
|
17
18
|
export class IssueNotFoundError extends Error {
|
|
18
19
|
constructor(issueUrl: string) {
|
|
@@ -76,6 +77,7 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
76
77
|
workflowBlockerResolvedWebhookUrl: string | null;
|
|
77
78
|
allowedIssueAuthors?: string[] | null;
|
|
78
79
|
labelsAsLlmAgentName?: string[] | null;
|
|
80
|
+
labelsNotRequiringPullRequest?: string[] | null;
|
|
79
81
|
changeTargetPathAliases?: Record<string, string> | null;
|
|
80
82
|
}): Promise<void> => {
|
|
81
83
|
const project = await this.projectRepository.getByUrl(params.projectUrl);
|
|
@@ -181,7 +183,7 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
181
183
|
issue,
|
|
182
184
|
comments,
|
|
183
185
|
isTrustedAuthor,
|
|
184
|
-
params
|
|
186
|
+
resolveLabelsNotRequiringPullRequest(params),
|
|
185
187
|
);
|
|
186
188
|
|
|
187
189
|
const rejectionStatusMessage =
|
|
@@ -287,7 +289,7 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
287
289
|
issue: { url: string; labels: string[]; isPr: boolean },
|
|
288
290
|
comments: { author: string; content: string }[],
|
|
289
291
|
isTrustedAuthor: (author: string) => boolean,
|
|
290
|
-
|
|
292
|
+
labelsNotRequiringPullRequest: string[],
|
|
291
293
|
): Promise<{
|
|
292
294
|
rejections: { type: RejectedReasonType; detail: string }[];
|
|
293
295
|
approvedPrUrl: string | null;
|
|
@@ -312,7 +314,10 @@ export class NotifyFinishedIssuePreparationUseCase {
|
|
|
312
314
|
}
|
|
313
315
|
|
|
314
316
|
const { rejections: prRejections, approvedPrUrl } =
|
|
315
|
-
await this.issueRejectionEvaluator.evaluate(
|
|
317
|
+
await this.issueRejectionEvaluator.evaluate(
|
|
318
|
+
issue,
|
|
319
|
+
labelsNotRequiringPullRequest,
|
|
320
|
+
);
|
|
316
321
|
return { rejections: [...rejections, ...prRejections], approvedPrUrl };
|
|
317
322
|
};
|
|
318
323
|
|
|
@@ -301,6 +301,29 @@ describe('RevertNotReadyReviewQueueIssueUseCase', () => {
|
|
|
301
301
|
expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
|
|
302
302
|
});
|
|
303
303
|
|
|
304
|
+
it('should not revert a story-labeled issue with no linked PR when story is only in labelsNotRequiringPullRequest', async () => {
|
|
305
|
+
const issue = createMockIssue({
|
|
306
|
+
status: 'Awaiting Quality Check',
|
|
307
|
+
labels: ['story'],
|
|
308
|
+
});
|
|
309
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
310
|
+
project: mockProject,
|
|
311
|
+
issues: [issue],
|
|
312
|
+
cacheUsed: false,
|
|
313
|
+
});
|
|
314
|
+
|
|
315
|
+
await useCase.run({
|
|
316
|
+
manager: 'manager-user',
|
|
317
|
+
projectUrl: 'https://github.com/users/user/projects/1',
|
|
318
|
+
labelsAsLlmAgentName: ['chore', 'accounting'],
|
|
319
|
+
labelsNotRequiringPullRequest: ['story'],
|
|
320
|
+
allowedIssueAuthors: ['owner'],
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
|
|
324
|
+
expect(mockIssueCommentRepository.createComment).not.toHaveBeenCalled();
|
|
325
|
+
});
|
|
326
|
+
|
|
304
327
|
it('should not revert a chore-labeled issue with no linked PR when chore is in labelsAsLlmAgentName', async () => {
|
|
305
328
|
const issue = createMockIssue({
|
|
306
329
|
status: 'Awaiting Quality Check',
|
|
@@ -4,6 +4,7 @@ import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
|
|
|
4
4
|
import { IssueCommentRepository } from './adapter-interfaces/IssueCommentRepository';
|
|
5
5
|
import { IssueRejectionEvaluator } from './IssueRejectionEvaluator';
|
|
6
6
|
import { ChangeTargetPullRequestApprover } from './ChangeTargetPullRequestApprover';
|
|
7
|
+
import { resolveLabelsNotRequiringPullRequest } from './resolveLabelsNotRequiringPullRequest';
|
|
7
8
|
import {
|
|
8
9
|
AWAITING_QUALITY_CHECK_STATUS_NAME,
|
|
9
10
|
AWAITING_WORKSPACE_STATUS_NAME,
|
|
@@ -71,6 +72,7 @@ export class RevertNotReadyReviewQueueIssueUseCase {
|
|
|
71
72
|
projectUrl: string;
|
|
72
73
|
manager: string;
|
|
73
74
|
labelsAsLlmAgentName?: string[] | null;
|
|
75
|
+
labelsNotRequiringPullRequest?: string[] | null;
|
|
74
76
|
changeTargetPathAliases?: Record<string, string> | null;
|
|
75
77
|
allowedIssueAuthors?: string[] | null;
|
|
76
78
|
}): Promise<void> => {
|
|
@@ -122,7 +124,7 @@ export class RevertNotReadyReviewQueueIssueUseCase {
|
|
|
122
124
|
const { rejections, approvedPrUrl } =
|
|
123
125
|
await this.issueRejectionEvaluator.evaluate(
|
|
124
126
|
issue,
|
|
125
|
-
params
|
|
127
|
+
resolveLabelsNotRequiringPullRequest(params),
|
|
126
128
|
{
|
|
127
129
|
relatedOpenPrUrls:
|
|
128
130
|
relatedOpenPrUrlsByIssueUrl.get(issue.url) ?? null,
|
|
@@ -195,7 +197,7 @@ export class RevertNotReadyReviewQueueIssueUseCase {
|
|
|
195
197
|
try {
|
|
196
198
|
const { rejections } = await this.issueRejectionEvaluator.evaluate(
|
|
197
199
|
pullRequest,
|
|
198
|
-
params
|
|
200
|
+
resolveLabelsNotRequiringPullRequest(params),
|
|
199
201
|
);
|
|
200
202
|
if (rejections.length > 0) {
|
|
201
203
|
if (!pullRequest.assignees.includes(params.manager)) {
|
|
@@ -369,6 +369,43 @@ describe('RevertOrphanedPreparationUseCase', () => {
|
|
|
369
369
|
expect(mockIssueRepository.updateStatus.mock.calls[0][2]).toBe('4');
|
|
370
370
|
});
|
|
371
371
|
|
|
372
|
+
it('should advance an orphaned issue whose label is only in labelsNotRequiringPullRequest to Awaiting Quality Check without PR check', async () => {
|
|
373
|
+
const stuckIssue = createMockIssue({
|
|
374
|
+
url: 'https://github.com/user/repo/issues/10',
|
|
375
|
+
status: 'Preparation',
|
|
376
|
+
labels: ['story'],
|
|
377
|
+
});
|
|
378
|
+
mockIssueRepository.getAllIssues.mockResolvedValue({
|
|
379
|
+
project: mockProject,
|
|
380
|
+
issues: [stuckIssue],
|
|
381
|
+
cacheUsed: false,
|
|
382
|
+
});
|
|
383
|
+
mockLocalCommandRunner.runCommand.mockResolvedValue({
|
|
384
|
+
stdout: '',
|
|
385
|
+
stderr: '',
|
|
386
|
+
exitCode: 1,
|
|
387
|
+
});
|
|
388
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
389
|
+
{
|
|
390
|
+
author: 'bot',
|
|
391
|
+
content: 'From: :robot: agent report',
|
|
392
|
+
createdAt: new Date(),
|
|
393
|
+
},
|
|
394
|
+
]);
|
|
395
|
+
|
|
396
|
+
await useCase.run({
|
|
397
|
+
projectUrl: 'https://github.com/user/repo',
|
|
398
|
+
preparationProcessCheckCommand: 'pgrep -fa "claude-agent.*{URL}"',
|
|
399
|
+
thresholdForAutoReject: 3,
|
|
400
|
+
labelsAsLlmAgentName: ['chore'],
|
|
401
|
+
labelsNotRequiringPullRequest: ['story'],
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
expect(mockIssueRepository.findRelatedOpenPRs.mock.calls).toHaveLength(0);
|
|
405
|
+
expect(mockIssueRepository.updateStatus.mock.calls).toHaveLength(1);
|
|
406
|
+
expect(mockIssueRepository.updateStatus.mock.calls[0][2]).toBe('4');
|
|
407
|
+
});
|
|
408
|
+
|
|
372
409
|
it('should revert orphaned issue to Awaiting Workspace when its label is not in labelsAsLlmAgentName and no PR is found', async () => {
|
|
373
410
|
const stuckIssue = createMockIssue({
|
|
374
411
|
url: 'https://github.com/user/repo/issues/10',
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
FAILED_PREPARATION_STATUS_NAME,
|
|
14
14
|
PREPARATION_STATUS_NAME,
|
|
15
15
|
} from '../entities/WorkflowStatus';
|
|
16
|
+
import { resolveLabelsNotRequiringPullRequest } from './resolveLabelsNotRequiringPullRequest';
|
|
16
17
|
|
|
17
18
|
const ORPHANED_PREPARATION_REJECTION_DETAIL = 'ORPHANED_PREPARATION';
|
|
18
19
|
|
|
@@ -44,6 +45,7 @@ export class RevertOrphanedPreparationUseCase {
|
|
|
44
45
|
awLogStaleThresholdMinutes?: number;
|
|
45
46
|
awaitingQualityCheckStatus?: string | null;
|
|
46
47
|
labelsAsLlmAgentName?: string[] | null;
|
|
48
|
+
labelsNotRequiringPullRequest?: string[] | null;
|
|
47
49
|
}): Promise<void> => {
|
|
48
50
|
const projectId = await this.projectRepository.findProjectIdByUrl(
|
|
49
51
|
params.projectUrl,
|
|
@@ -87,7 +89,7 @@ export class RevertOrphanedPreparationUseCase {
|
|
|
87
89
|
}
|
|
88
90
|
const { hasRejections, comments } = await this.evaluateHasRejections(
|
|
89
91
|
issue,
|
|
90
|
-
params
|
|
92
|
+
resolveLabelsNotRequiringPullRequest(params),
|
|
91
93
|
);
|
|
92
94
|
if (!hasRejections) {
|
|
93
95
|
if (awaitingQualityCheckStatusOption) {
|
|
@@ -150,7 +152,7 @@ export class RevertOrphanedPreparationUseCase {
|
|
|
150
152
|
|
|
151
153
|
private evaluateHasRejections = async (
|
|
152
154
|
issue: Issue,
|
|
153
|
-
|
|
155
|
+
labelsNotRequiringPullRequest: string[],
|
|
154
156
|
): Promise<{ hasRejections: boolean; comments: Comment[] }> => {
|
|
155
157
|
if (issue.isClosed) {
|
|
156
158
|
return { hasRejections: false, comments: [] };
|
|
@@ -171,12 +173,12 @@ export class RevertOrphanedPreparationUseCase {
|
|
|
171
173
|
const hasLlmAgentLabel = issue.labels.some(
|
|
172
174
|
(l) => l === 'llm-agent' || l.startsWith('llm-agent:'),
|
|
173
175
|
);
|
|
174
|
-
const
|
|
175
|
-
|
|
176
|
+
const hasLabelNotRequiringPullRequest = issue.labels.some((label) =>
|
|
177
|
+
labelsNotRequiringPullRequest.includes(label),
|
|
176
178
|
);
|
|
177
179
|
if (
|
|
178
180
|
hasLlmAgentLabel ||
|
|
179
|
-
|
|
181
|
+
hasLabelNotRequiringPullRequest ||
|
|
180
182
|
(categoryLabels.length > 0 && !categoryLabels.includes('category:e2e'))
|
|
181
183
|
) {
|
|
182
184
|
return { hasRejections: false, comments };
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { resolveLabelsNotRequiringPullRequest } from './resolveLabelsNotRequiringPullRequest';
|
|
2
|
+
|
|
3
|
+
describe('resolveLabelsNotRequiringPullRequest', () => {
|
|
4
|
+
it('combines both lists so an agent-name label keeps exempting the issue', () => {
|
|
5
|
+
expect(
|
|
6
|
+
resolveLabelsNotRequiringPullRequest({
|
|
7
|
+
labelsAsLlmAgentName: ['chore', 'accounting'],
|
|
8
|
+
labelsNotRequiringPullRequest: ['story'],
|
|
9
|
+
}),
|
|
10
|
+
).toEqual(['chore', 'accounting', 'story']);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('returns only the agent-name labels when no exemption list is configured', () => {
|
|
14
|
+
expect(
|
|
15
|
+
resolveLabelsNotRequiringPullRequest({
|
|
16
|
+
labelsAsLlmAgentName: ['chore'],
|
|
17
|
+
}),
|
|
18
|
+
).toEqual(['chore']);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('returns only the exemption labels when no agent-name label is configured', () => {
|
|
22
|
+
expect(
|
|
23
|
+
resolveLabelsNotRequiringPullRequest({
|
|
24
|
+
labelsAsLlmAgentName: null,
|
|
25
|
+
labelsNotRequiringPullRequest: ['story'],
|
|
26
|
+
}),
|
|
27
|
+
).toEqual(['story']);
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('returns an empty array when neither list is present', () => {
|
|
31
|
+
expect(resolveLabelsNotRequiringPullRequest({})).toEqual([]);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const resolveLabelsNotRequiringPullRequest = (source: {
|
|
2
|
+
labelsAsLlmAgentName?: string[] | null;
|
|
3
|
+
labelsNotRequiringPullRequest?: string[] | null;
|
|
4
|
+
}): string[] => [
|
|
5
|
+
...(source.labelsAsLlmAgentName ?? []),
|
|
6
|
+
...(source.labelsNotRequiringPullRequest ?? []),
|
|
7
|
+
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,YAAY,EACZ,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAoKzB,eAAO,MAAM,OAAO,SAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,YAAY,EACZ,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAoKzB,eAAO,MAAM,OAAO,SAAgB,CAAC;AA28BrC,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,IAGxD,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,MAAM,MAAM,EAAE,EACd,kBAAkB,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,KACzC,OAAO,CAAC,IAAI,CAMd,CAAC"}
|
|
@@ -18,6 +18,7 @@ export type ConfigFile = {
|
|
|
18
18
|
awLogDirectoryPath?: string;
|
|
19
19
|
awLogStaleThresholdMinutes?: number;
|
|
20
20
|
labelsAsLlmAgentName?: string[];
|
|
21
|
+
labelsNotRequiringPullRequest?: string[];
|
|
21
22
|
changeTargetPathAliases?: Record<string, string>;
|
|
22
23
|
consoleAccessToken?: string;
|
|
23
24
|
consoleProjects?: Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projectConfig.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/projectConfig.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,gCAAgC,CAAC,EAAE,MAAM,CAAC;IAC1C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,wCAAwC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAsDF,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CACH,CAAC;AA4CvE,eAAO,MAAM,cAAc,GAAI,gBAAgB,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"projectConfig.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/projectConfig.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,UAAU,GAAG;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8BAA8B,CAAC,EAAE,MAAM,CAAC;IACxC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC/B,gCAAgC,CAAC,EAAE,MAAM,CAAC;IAC1C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,6BAA6B,CAAC,EAAE,MAAM,EAAE,CAAC;IACzC,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjD,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,wCAAwC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClE,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAsDF,eAAO,MAAM,QAAQ,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CACH,CAAC;AA4CvE,eAAO,MAAM,cAAc,GAAI,gBAAgB,MAAM,KAAG,UAuEvD,CAAC;AAEF,eAAO,MAAM,wBAAwB,GACnC,QAAQ,MAAM,EACd,aAAa,MAAM,KAClB,UAuEF,CAAC;AAEF,eAAO,MAAM,YAAY,GACvB,YAAY,UAAU,EACtB,cAAc,UAAU,EACxB,iBAAiB,UAAU,KAC1B,UAmFD,CAAC;AAkBH,eAAO,MAAM,kBAAkB,GAC7B,YAAY,MAAM,EAClB,OAAO,MAAM,KACZ,OAAO,CAAC,MAAM,GAAG,IAAI,CAoDvB,CAAC"}
|
|
@@ -18,6 +18,7 @@ export declare class CheckIssueReviewReadinessUseCase {
|
|
|
18
18
|
issueUrl: string;
|
|
19
19
|
allowedIssueAuthors?: string[] | null;
|
|
20
20
|
labelsAsLlmAgentName?: string[] | null;
|
|
21
|
+
labelsNotRequiringPullRequest?: string[] | null;
|
|
21
22
|
}) => Promise<IssueReviewReadinessResult>;
|
|
22
23
|
private isAuthorTrusted;
|
|
23
24
|
private reportBodyHasNextStep;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckIssueReviewReadinessUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/CheckIssueReviewReadinessUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAEL,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"CheckIssueReviewReadinessUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/CheckIssueReviewReadinessUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAEL,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AAGnC,KAAK,kBAAkB,GACnB,iBAAiB,GACjB,0BAA0B,GAC1B,sBAAsB,GACtB,oBAAoB,CAAC;AAEzB,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE;QAAE,IAAI,EAAE,kBAAkB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC5D,CAAC;AAEF,qBAAa,gCAAgC;IAIzC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAQhC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAXzC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;gBAG/C,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,eAAe,GACf,oBAAoB,GACpB,oBAAoB,GACpB,gCAAgC,GAChC,iCAAiC,CACpC,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,sBAAsB,CACvB;IAKH,GAAG,GAAU,QAAQ;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACtC,oBAAoB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;QACvC,6BAA6B,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KACjD,KAAG,OAAO,CAAC,0BAA0B,CAAC,CAoDrC;IAEF,OAAO,CAAC,eAAe,CAIgD;IAEvE,OAAO,CAAC,qBAAqB,CAuB3B;CACH"}
|
|
@@ -72,6 +72,7 @@ export declare class HandleScheduledEventUseCase {
|
|
|
72
72
|
urlOfStoryView: string;
|
|
73
73
|
disabled: boolean;
|
|
74
74
|
labelsAsLlmAgentName?: string[] | null;
|
|
75
|
+
labelsNotRequiringPullRequest?: string[] | null;
|
|
75
76
|
changeTargetPathAliases?: Record<string, string> | null;
|
|
76
77
|
allowedIssueAuthors?: string[] | null;
|
|
77
78
|
autoAssignManagerAuthors?: string[] | null;
|