github-issue-tower-defence-management 1.78.0 → 1.79.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 +12 -0
- package/README.md +1 -1
- package/bin/adapter/entry-points/cli/index.js +11 -9
- package/bin/adapter/entry-points/cli/index.js.map +1 -1
- package/bin/domain/usecases/CheckIssueReviewReadinessUseCase.js +57 -9
- package/bin/domain/usecases/CheckIssueReviewReadinessUseCase.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/entry-points/cli/index.test.ts +7 -37
- package/src/adapter/entry-points/cli/index.ts +12 -15
- package/src/domain/usecases/CheckIssueReviewReadinessUseCase.test.ts +168 -76
- package/src/domain/usecases/CheckIssueReviewReadinessUseCase.ts +89 -15
- package/types/domain/usecases/CheckIssueReviewReadinessUseCase.d.ts +9 -5
- package/types/domain/usecases/CheckIssueReviewReadinessUseCase.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
# [1.79.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.78.0...v1.79.0) (2026-06-12)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **cli:** enhance checkIssueReviewReadiness with comment checks and optional projectUrl ([41c0b6f](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/41c0b6f01c24068925638e35a108d33ea5fa202d)), closes [HiromiShikata/secretary#1781](https://github.com/HiromiShikata/secretary/issues/1781)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Reverts
|
|
10
|
+
|
|
11
|
+
* restore unrelated build artifacts to origin/main state ([30a7ec1](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/30a7ec1424122d562373e79989d6fe2abefaa46d))
|
|
12
|
+
|
|
1
13
|
# [1.78.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.77.3...v1.78.0) (2026-06-12)
|
|
2
14
|
|
|
3
15
|
|
package/README.md
CHANGED
|
@@ -54,7 +54,7 @@ Options for checkIssueReviewReadiness:
|
|
|
54
54
|
--projectUrl <url> GitHub project URL
|
|
55
55
|
```
|
|
56
56
|
|
|
57
|
-
The `checkIssueReviewReadiness` sub-command lets an agent self-check whether an issue is currently review-ready
|
|
57
|
+
The `checkIssueReviewReadiness` sub-command lets an agent self-check whether an issue is currently review-ready. It does NOT change the issue Status field and does NOT post any comment. It writes a single JSON line to stdout of the shape `{ "reviewReady": boolean, "rejections": [{ "type": string, "detail": string }] }` and exits 0 on a successful evaluation regardless of readiness; a non-zero exit indicates an operational error (auth failure, network error). The rejection types include: `ISSUE_NOT_FOUND`, `NO_REPORT_FROM_AGENT_BOT`, `REPORT_HAS_NEXT_STEP`, `PULL_REQUEST_NOT_FOUND`, `PULL_REQUEST_IS_DRAFT`, `PULL_REQUEST_CONFLICTED`, `ANY_CI_JOB_FAILED_OR_IN_PROGRESS`, `REQUIRED_CI_JOB_NEVER_STARTED`, `ANY_REVIEW_COMMENT_NOT_RESOLVED`, and `MULTIPLE_PULL_REQUESTS_FOUND`. The `--projectUrl` option is optional; when omitted the command still runs using only the issue URL.
|
|
58
58
|
|
|
59
59
|
## Example 📖
|
|
60
60
|
|
|
@@ -261,7 +261,7 @@ exports.program
|
|
|
261
261
|
.description('Check whether an issue is in a review-ready state without mutating any field or posting any comment')
|
|
262
262
|
.requiredOption('--configFilePath <path>', 'Path to config file for tower defence management')
|
|
263
263
|
.requiredOption('--issueUrl <url>', 'GitHub issue URL')
|
|
264
|
-
.option('--projectUrl <url>', 'GitHub project URL')
|
|
264
|
+
.option('--projectUrl <url>', 'GitHub project URL (optional)')
|
|
265
265
|
.action(async (options) => {
|
|
266
266
|
const token = process.env.GH_TOKEN;
|
|
267
267
|
if (!token) {
|
|
@@ -281,25 +281,27 @@ exports.program
|
|
|
281
281
|
}
|
|
282
282
|
}
|
|
283
283
|
const config = (0, projectConfig_2.mergeConfigs)(configFileValues, cliOverrides, readmeOverrides);
|
|
284
|
-
const projectUrl = config.projectUrl;
|
|
285
|
-
if (!projectUrl) {
|
|
286
|
-
console.error('projectUrl is required. Provide via --projectUrl, config file, or project README.');
|
|
287
|
-
process.exit(1);
|
|
288
|
-
}
|
|
289
284
|
const projectName = config.projectName ?? 'default';
|
|
290
285
|
const localStorageRepository = new LocalStorageRepository_1.LocalStorageRepository();
|
|
291
286
|
const cachePath = `./tmp/cache/${projectName}`;
|
|
292
287
|
const localStorageCacheRepository = new LocalStorageCacheRepository_1.LocalStorageCacheRepository(localStorageRepository, cachePath);
|
|
293
288
|
const githubRepositoryParams = buildGithubRepositoryParams(localStorageRepository, token);
|
|
294
|
-
const projectRepository = new GraphqlProjectRepository_1.GraphqlProjectRepository(...githubRepositoryParams);
|
|
295
289
|
const apiV3IssueRepository = new ApiV3IssueRepository_1.ApiV3IssueRepository(...githubRepositoryParams);
|
|
296
290
|
const restIssueRepository = new RestIssueRepository_1.RestIssueRepository(...githubRepositoryParams);
|
|
297
291
|
const graphqlProjectItemRepository = new GraphqlProjectItemRepository_1.GraphqlProjectItemRepository(...githubRepositoryParams);
|
|
298
292
|
const issueRepository = new ApiV3CheerioRestIssueRepository_1.ApiV3CheerioRestIssueRepository(apiV3IssueRepository, restIssueRepository, graphqlProjectItemRepository, localStorageCacheRepository, ...githubRepositoryParams);
|
|
299
|
-
const
|
|
293
|
+
const issueCommentRepository = new GitHubIssueCommentRepository_1.GitHubIssueCommentRepository(token);
|
|
294
|
+
const rawAllowedIssueAuthors = config.allowedIssueAuthors;
|
|
295
|
+
const allowedIssueAuthors = rawAllowedIssueAuthors
|
|
296
|
+
? rawAllowedIssueAuthors
|
|
297
|
+
.split(',')
|
|
298
|
+
.map((s) => s.trim())
|
|
299
|
+
.filter(Boolean)
|
|
300
|
+
: null;
|
|
301
|
+
const useCase = new CheckIssueReviewReadinessUseCase_1.CheckIssueReviewReadinessUseCase(issueRepository, issueCommentRepository);
|
|
300
302
|
const result = await useCase.run({
|
|
301
|
-
projectUrl,
|
|
302
303
|
issueUrl: options.issueUrl,
|
|
304
|
+
allowedIssueAuthors,
|
|
303
305
|
labelsAsLlmAgentName: config.labelsAsLlmAgentName ?? null,
|
|
304
306
|
});
|
|
305
307
|
process.stdout.write(`${JSON.stringify(result)}\n`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,23 +2,71 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CheckIssueReviewReadinessUseCase = void 0;
|
|
4
4
|
const IssueRejectionEvaluator_1 = require("./IssueRejectionEvaluator");
|
|
5
|
-
const NotifyFinishedIssuePreparationUseCase_1 = require("./NotifyFinishedIssuePreparationUseCase");
|
|
6
5
|
class CheckIssueReviewReadinessUseCase {
|
|
7
|
-
constructor(
|
|
8
|
-
this.projectRepository = projectRepository;
|
|
6
|
+
constructor(issueRepository, issueCommentRepository) {
|
|
9
7
|
this.issueRepository = issueRepository;
|
|
8
|
+
this.issueCommentRepository = issueCommentRepository;
|
|
10
9
|
this.run = async (params) => {
|
|
11
|
-
const
|
|
12
|
-
const issue = await this.issueRepository.get(params.issueUrl, project);
|
|
10
|
+
const issue = await this.issueRepository.getIssueByUrl(params.issueUrl);
|
|
13
11
|
if (!issue) {
|
|
14
|
-
|
|
12
|
+
return {
|
|
13
|
+
reviewReady: false,
|
|
14
|
+
rejections: [
|
|
15
|
+
{
|
|
16
|
+
type: 'ISSUE_NOT_FOUND',
|
|
17
|
+
detail: `Issue not found: ${params.issueUrl}`,
|
|
18
|
+
},
|
|
19
|
+
],
|
|
20
|
+
};
|
|
15
21
|
}
|
|
16
|
-
const
|
|
22
|
+
const rejections = [];
|
|
23
|
+
const comments = await this.issueCommentRepository.getCommentsFromIssue(issue);
|
|
24
|
+
const isTrustedAuthor = (author) => this.isAuthorTrusted(author, params.allowedIssueAuthors ?? null);
|
|
25
|
+
const lastComment = comments[comments.length - 1];
|
|
26
|
+
if (!lastComment ||
|
|
27
|
+
!isTrustedAuthor(lastComment.author) ||
|
|
28
|
+
!lastComment.content.startsWith('From: :robot:')) {
|
|
29
|
+
rejections.push({
|
|
30
|
+
type: 'NO_REPORT_FROM_AGENT_BOT',
|
|
31
|
+
detail: 'NO_REPORT_FROM_AGENT_BOT',
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
else if (this.reportBodyHasNextStep(lastComment.content)) {
|
|
35
|
+
rejections.push({
|
|
36
|
+
type: 'REPORT_HAS_NEXT_STEP',
|
|
37
|
+
detail: 'REPORT_HAS_NEXT_STEP',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const { rejections: prRejections } = await this.issueRejectionEvaluator.evaluate(issue, params.labelsAsLlmAgentName ?? []);
|
|
41
|
+
const allRejections = [...rejections, ...prRejections];
|
|
17
42
|
return {
|
|
18
|
-
reviewReady:
|
|
19
|
-
rejections,
|
|
43
|
+
reviewReady: allRejections.length === 0,
|
|
44
|
+
rejections: allRejections,
|
|
20
45
|
};
|
|
21
46
|
};
|
|
47
|
+
this.isAuthorTrusted = (author, allowedIssueAuthors) => allowedIssueAuthors === null || allowedIssueAuthors.includes(author);
|
|
48
|
+
this.reportBodyHasNextStep = (body) => {
|
|
49
|
+
const reportMatch = body.match(/```json\n([\s\S]*?)\n```/);
|
|
50
|
+
if (!reportMatch || reportMatch.length < 2) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
let reportJson;
|
|
54
|
+
try {
|
|
55
|
+
reportJson = JSON.parse(reportMatch[1]);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.warn('Invalid JSON in report body while checking nextStep:', error);
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
if (typeof reportJson !== 'object' || reportJson === null) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (!('nextStep' in reportJson)) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
const nextStepValue = Reflect.get(reportJson, 'nextStep');
|
|
68
|
+
return nextStepValue !== null && nextStepValue !== undefined;
|
|
69
|
+
};
|
|
22
70
|
this.issueRejectionEvaluator = new IssueRejectionEvaluator_1.IssueRejectionEvaluator(issueRepository);
|
|
23
71
|
}
|
|
24
72
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckIssueReviewReadinessUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/CheckIssueReviewReadinessUseCase.ts"],"names":[],"mappings":";;;AAEA,uEAGmC;
|
|
1
|
+
{"version":3,"file":"CheckIssueReviewReadinessUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/CheckIssueReviewReadinessUseCase.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1503,8 +1503,8 @@ mysteryKey: 'value'
|
|
|
1503
1503
|
|
|
1504
1504
|
expect(mockRun).toHaveBeenCalledTimes(1);
|
|
1505
1505
|
expect(mockRun).toHaveBeenCalledWith({
|
|
1506
|
-
projectUrl: 'https://github.com/orgs/test/projects/1',
|
|
1507
1506
|
issueUrl: 'https://github.com/test/repo/issues/1',
|
|
1507
|
+
allowedIssueAuthors: null,
|
|
1508
1508
|
labelsAsLlmAgentName: null,
|
|
1509
1509
|
});
|
|
1510
1510
|
expect(stdoutSpy).toHaveBeenCalledWith(
|
|
@@ -1556,7 +1556,10 @@ mysteryKey: 'value'
|
|
|
1556
1556
|
stdoutSpy.mockRestore();
|
|
1557
1557
|
});
|
|
1558
1558
|
|
|
1559
|
-
it('should
|
|
1559
|
+
it('should work without --projectUrl when config has no projectUrl', async () => {
|
|
1560
|
+
const configMissing = {};
|
|
1561
|
+
writeConfig(configMissing);
|
|
1562
|
+
|
|
1560
1563
|
const mockRun = jest
|
|
1561
1564
|
.fn()
|
|
1562
1565
|
.mockResolvedValue({ reviewReady: true, rejections: [] });
|
|
@@ -1581,13 +1584,12 @@ mysteryKey: 'value'
|
|
|
1581
1584
|
configFilePath,
|
|
1582
1585
|
'--issueUrl',
|
|
1583
1586
|
'https://github.com/test/repo/issues/1',
|
|
1584
|
-
'--projectUrl',
|
|
1585
|
-
'https://github.com/orgs/override/projects/2',
|
|
1586
1587
|
]);
|
|
1587
1588
|
|
|
1589
|
+
expect(mockRun).toHaveBeenCalledTimes(1);
|
|
1588
1590
|
expect(mockRun).toHaveBeenCalledWith({
|
|
1589
|
-
projectUrl: 'https://github.com/orgs/override/projects/2',
|
|
1590
1591
|
issueUrl: 'https://github.com/test/repo/issues/1',
|
|
1592
|
+
allowedIssueAuthors: null,
|
|
1591
1593
|
labelsAsLlmAgentName: null,
|
|
1592
1594
|
});
|
|
1593
1595
|
|
|
@@ -1623,37 +1625,5 @@ mysteryKey: 'value'
|
|
|
1623
1625
|
consoleErrorSpy.mockRestore();
|
|
1624
1626
|
processExitSpy.mockRestore();
|
|
1625
1627
|
});
|
|
1626
|
-
|
|
1627
|
-
it('should exit with error when projectUrl is missing', async () => {
|
|
1628
|
-
const configMissing = {};
|
|
1629
|
-
writeConfig(configMissing);
|
|
1630
|
-
|
|
1631
|
-
const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
|
|
1632
|
-
const processExitSpy = jest
|
|
1633
|
-
.spyOn(process, 'exit')
|
|
1634
|
-
.mockImplementation(() => {
|
|
1635
|
-
throw new Error('process.exit called');
|
|
1636
|
-
});
|
|
1637
|
-
|
|
1638
|
-
await expect(
|
|
1639
|
-
program.parseAsync([
|
|
1640
|
-
'node',
|
|
1641
|
-
'test',
|
|
1642
|
-
'checkIssueReviewReadiness',
|
|
1643
|
-
'--configFilePath',
|
|
1644
|
-
configFilePath,
|
|
1645
|
-
'--issueUrl',
|
|
1646
|
-
'https://github.com/test/repo/issues/1',
|
|
1647
|
-
]),
|
|
1648
|
-
).rejects.toThrow('process.exit called');
|
|
1649
|
-
|
|
1650
|
-
expect(consoleErrorSpy).toHaveBeenCalledWith(
|
|
1651
|
-
'projectUrl is required. Provide via --projectUrl, config file, or project README.',
|
|
1652
|
-
);
|
|
1653
|
-
expect(processExitSpy).toHaveBeenCalledWith(1);
|
|
1654
|
-
|
|
1655
|
-
consoleErrorSpy.mockRestore();
|
|
1656
|
-
processExitSpy.mockRestore();
|
|
1657
|
-
});
|
|
1658
1628
|
});
|
|
1659
1629
|
});
|
|
@@ -470,7 +470,7 @@ program
|
|
|
470
470
|
'Path to config file for tower defence management',
|
|
471
471
|
)
|
|
472
472
|
.requiredOption('--issueUrl <url>', 'GitHub issue URL')
|
|
473
|
-
.option('--projectUrl <url>', 'GitHub project URL')
|
|
473
|
+
.option('--projectUrl <url>', 'GitHub project URL (optional)')
|
|
474
474
|
.action(async (options: CheckIssueReviewReadinessOptions) => {
|
|
475
475
|
const token = process.env.GH_TOKEN;
|
|
476
476
|
if (!token) {
|
|
@@ -501,15 +501,6 @@ program
|
|
|
501
501
|
readmeOverrides,
|
|
502
502
|
);
|
|
503
503
|
|
|
504
|
-
const projectUrl = config.projectUrl;
|
|
505
|
-
|
|
506
|
-
if (!projectUrl) {
|
|
507
|
-
console.error(
|
|
508
|
-
'projectUrl is required. Provide via --projectUrl, config file, or project README.',
|
|
509
|
-
);
|
|
510
|
-
process.exit(1);
|
|
511
|
-
}
|
|
512
|
-
|
|
513
504
|
const projectName = config.projectName ?? 'default';
|
|
514
505
|
const localStorageRepository = new LocalStorageRepository();
|
|
515
506
|
const cachePath = `./tmp/cache/${projectName}`;
|
|
@@ -521,9 +512,6 @@ program
|
|
|
521
512
|
localStorageRepository,
|
|
522
513
|
token,
|
|
523
514
|
);
|
|
524
|
-
const projectRepository = new GraphqlProjectRepository(
|
|
525
|
-
...githubRepositoryParams,
|
|
526
|
-
);
|
|
527
515
|
const apiV3IssueRepository = new ApiV3IssueRepository(
|
|
528
516
|
...githubRepositoryParams,
|
|
529
517
|
);
|
|
@@ -540,15 +528,24 @@ program
|
|
|
540
528
|
localStorageCacheRepository,
|
|
541
529
|
...githubRepositoryParams,
|
|
542
530
|
);
|
|
531
|
+
const issueCommentRepository = new GitHubIssueCommentRepository(token);
|
|
532
|
+
|
|
533
|
+
const rawAllowedIssueAuthors = config.allowedIssueAuthors;
|
|
534
|
+
const allowedIssueAuthors = rawAllowedIssueAuthors
|
|
535
|
+
? rawAllowedIssueAuthors
|
|
536
|
+
.split(',')
|
|
537
|
+
.map((s) => s.trim())
|
|
538
|
+
.filter(Boolean)
|
|
539
|
+
: null;
|
|
543
540
|
|
|
544
541
|
const useCase = new CheckIssueReviewReadinessUseCase(
|
|
545
|
-
projectRepository,
|
|
546
542
|
issueRepository,
|
|
543
|
+
issueCommentRepository,
|
|
547
544
|
);
|
|
548
545
|
|
|
549
546
|
const result = await useCase.run({
|
|
550
|
-
projectUrl,
|
|
551
547
|
issueUrl: options.issueUrl,
|
|
548
|
+
allowedIssueAuthors,
|
|
552
549
|
labelsAsLlmAgentName: config.labelsAsLlmAgentName ?? null,
|
|
553
550
|
});
|
|
554
551
|
|
|
@@ -1,34 +1,8 @@
|
|
|
1
1
|
import { CheckIssueReviewReadinessUseCase } from './CheckIssueReviewReadinessUseCase';
|
|
2
2
|
import { Issue } from '../entities/Issue';
|
|
3
|
-
import {
|
|
3
|
+
import { Comment } from '../entities/Comment';
|
|
4
4
|
import { RelatedPullRequest } from './adapter-interfaces/IssueRepository';
|
|
5
5
|
|
|
6
|
-
const createMockProject = (overrides: Partial<Project> = {}): Project => ({
|
|
7
|
-
id: 'project-1',
|
|
8
|
-
url: 'https://github.com/users/user/projects/1',
|
|
9
|
-
databaseId: 1,
|
|
10
|
-
name: 'Test Project',
|
|
11
|
-
status: {
|
|
12
|
-
name: 'Status',
|
|
13
|
-
fieldId: 'field-1',
|
|
14
|
-
statuses: [
|
|
15
|
-
{
|
|
16
|
-
id: 'preparation-id',
|
|
17
|
-
name: 'Preparation',
|
|
18
|
-
color: 'YELLOW',
|
|
19
|
-
description: '',
|
|
20
|
-
},
|
|
21
|
-
],
|
|
22
|
-
},
|
|
23
|
-
nextActionDate: null,
|
|
24
|
-
nextActionHour: null,
|
|
25
|
-
story: null,
|
|
26
|
-
remainingEstimationMinutes: null,
|
|
27
|
-
dependedIssueUrlSeparatedByComma: null,
|
|
28
|
-
completionDate50PercentConfidence: null,
|
|
29
|
-
...overrides,
|
|
30
|
-
});
|
|
31
|
-
|
|
32
6
|
const createMockIssue = (overrides: Partial<Issue> = {}): Issue => ({
|
|
33
7
|
nameWithOwner: 'user/repo',
|
|
34
8
|
number: 1,
|
|
@@ -56,6 +30,13 @@ const createMockIssue = (overrides: Partial<Issue> = {}): Issue => ({
|
|
|
56
30
|
...overrides,
|
|
57
31
|
});
|
|
58
32
|
|
|
33
|
+
const createMockComment = (overrides: Partial<Comment> = {}): Comment => ({
|
|
34
|
+
author: 'agent-bot',
|
|
35
|
+
content: 'From: :robot: Agent report',
|
|
36
|
+
createdAt: new Date('2000-01-01T00:00:00Z'),
|
|
37
|
+
...overrides,
|
|
38
|
+
});
|
|
39
|
+
|
|
59
40
|
const createReadyPr = (
|
|
60
41
|
overrides: Partial<RelatedPullRequest> = {},
|
|
61
42
|
): RelatedPullRequest => ({
|
|
@@ -73,51 +54,151 @@ const createReadyPr = (
|
|
|
73
54
|
});
|
|
74
55
|
|
|
75
56
|
describe('CheckIssueReviewReadinessUseCase', () => {
|
|
76
|
-
let mockProjectRepository: { getByUrl: jest.Mock };
|
|
77
57
|
let mockIssueRepository: {
|
|
78
|
-
|
|
58
|
+
getIssueByUrl: jest.Mock;
|
|
79
59
|
findRelatedOpenPRs: jest.Mock;
|
|
80
60
|
getOpenPullRequest: jest.Mock;
|
|
81
61
|
getPullRequestChangedFilePaths: jest.Mock;
|
|
82
62
|
requestChangesWithInlineComment: jest.Mock;
|
|
83
63
|
};
|
|
64
|
+
let mockIssueCommentRepository: {
|
|
65
|
+
getCommentsFromIssue: jest.Mock;
|
|
66
|
+
};
|
|
84
67
|
let useCase: CheckIssueReviewReadinessUseCase;
|
|
85
|
-
let mockProject: Project;
|
|
86
68
|
|
|
87
69
|
beforeEach(() => {
|
|
88
70
|
jest.resetAllMocks();
|
|
89
71
|
|
|
90
|
-
mockProject = createMockProject();
|
|
91
|
-
|
|
92
|
-
mockProjectRepository = {
|
|
93
|
-
getByUrl: jest.fn(),
|
|
94
|
-
};
|
|
95
|
-
|
|
96
72
|
mockIssueRepository = {
|
|
97
|
-
|
|
73
|
+
getIssueByUrl: jest.fn(),
|
|
98
74
|
findRelatedOpenPRs: jest.fn(),
|
|
99
75
|
getOpenPullRequest: jest.fn(),
|
|
100
76
|
getPullRequestChangedFilePaths: jest.fn().mockResolvedValue([]),
|
|
101
77
|
requestChangesWithInlineComment: jest.fn().mockResolvedValue(undefined),
|
|
102
78
|
};
|
|
103
79
|
|
|
80
|
+
mockIssueCommentRepository = {
|
|
81
|
+
getCommentsFromIssue: jest.fn(),
|
|
82
|
+
};
|
|
83
|
+
|
|
104
84
|
useCase = new CheckIssueReviewReadinessUseCase(
|
|
105
|
-
mockProjectRepository,
|
|
106
85
|
mockIssueRepository,
|
|
86
|
+
mockIssueCommentRepository,
|
|
107
87
|
);
|
|
108
88
|
});
|
|
109
89
|
|
|
110
90
|
describe('run', () => {
|
|
111
|
-
it('should return reviewReady=
|
|
91
|
+
it('should return reviewReady=false with ISSUE_NOT_FOUND when issue does not exist', async () => {
|
|
92
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(null);
|
|
93
|
+
|
|
94
|
+
const result = await useCase.run({
|
|
95
|
+
issueUrl: 'https://github.com/user/repo/issues/999',
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
expect(result.reviewReady).toBe(false);
|
|
99
|
+
expect(result.rejections).toEqual([
|
|
100
|
+
{
|
|
101
|
+
type: 'ISSUE_NOT_FOUND',
|
|
102
|
+
detail: 'Issue not found: https://github.com/user/repo/issues/999',
|
|
103
|
+
},
|
|
104
|
+
]);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('should return reviewReady=false with NO_REPORT_FROM_AGENT_BOT when no comments exist', async () => {
|
|
112
108
|
const issue = createMockIssue();
|
|
113
|
-
|
|
114
|
-
|
|
109
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
110
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([]);
|
|
111
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
112
|
+
createReadyPr(),
|
|
113
|
+
]);
|
|
114
|
+
|
|
115
|
+
const result = await useCase.run({
|
|
116
|
+
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
expect(result.reviewReady).toBe(false);
|
|
120
|
+
expect(result.rejections).toContainEqual({
|
|
121
|
+
type: 'NO_REPORT_FROM_AGENT_BOT',
|
|
122
|
+
detail: 'NO_REPORT_FROM_AGENT_BOT',
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should return reviewReady=false with NO_REPORT_FROM_AGENT_BOT when last comment does not start with From: :robot:', async () => {
|
|
127
|
+
const issue = createMockIssue();
|
|
128
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
129
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
130
|
+
createMockComment({ content: 'Some regular comment' }),
|
|
131
|
+
]);
|
|
132
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
133
|
+
createReadyPr(),
|
|
134
|
+
]);
|
|
135
|
+
|
|
136
|
+
const result = await useCase.run({
|
|
137
|
+
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
expect(result.reviewReady).toBe(false);
|
|
141
|
+
expect(result.rejections).toContainEqual({
|
|
142
|
+
type: 'NO_REPORT_FROM_AGENT_BOT',
|
|
143
|
+
detail: 'NO_REPORT_FROM_AGENT_BOT',
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it('should return reviewReady=false with REPORT_HAS_NEXT_STEP when last comment has nextStep in JSON', async () => {
|
|
148
|
+
const issue = createMockIssue();
|
|
149
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
150
|
+
const commentWithNextStep = createMockComment({
|
|
151
|
+
content:
|
|
152
|
+
'From: :robot: Agent report\n```json\n{"nextStep": "fix the bug"}\n```',
|
|
153
|
+
});
|
|
154
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
155
|
+
commentWithNextStep,
|
|
156
|
+
]);
|
|
157
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
158
|
+
createReadyPr(),
|
|
159
|
+
]);
|
|
160
|
+
|
|
161
|
+
const result = await useCase.run({
|
|
162
|
+
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
expect(result.reviewReady).toBe(false);
|
|
166
|
+
expect(result.rejections).toContainEqual({
|
|
167
|
+
type: 'REPORT_HAS_NEXT_STEP',
|
|
168
|
+
detail: 'REPORT_HAS_NEXT_STEP',
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
it('should return reviewReady=false with PULL_REQUEST_NOT_FOUND when no related PR exists', async () => {
|
|
173
|
+
const issue = createMockIssue();
|
|
174
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
175
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
176
|
+
createMockComment(),
|
|
177
|
+
]);
|
|
178
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
|
|
179
|
+
|
|
180
|
+
const result = await useCase.run({
|
|
181
|
+
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
expect(result.reviewReady).toBe(false);
|
|
185
|
+
expect(result.rejections).toContainEqual({
|
|
186
|
+
type: 'PULL_REQUEST_NOT_FOUND',
|
|
187
|
+
detail: 'PULL_REQUEST_NOT_FOUND',
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it('should return reviewReady=true with empty rejections when all checks pass', async () => {
|
|
192
|
+
const issue = createMockIssue();
|
|
193
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
194
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
195
|
+
createMockComment(),
|
|
196
|
+
]);
|
|
115
197
|
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
116
198
|
createReadyPr(),
|
|
117
199
|
]);
|
|
118
200
|
|
|
119
201
|
const result = await useCase.run({
|
|
120
|
-
projectUrl: 'https://github.com/users/user/projects/1',
|
|
121
202
|
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
122
203
|
});
|
|
123
204
|
|
|
@@ -125,10 +206,12 @@ describe('CheckIssueReviewReadinessUseCase', () => {
|
|
|
125
206
|
expect(result.rejections).toEqual([]);
|
|
126
207
|
});
|
|
127
208
|
|
|
128
|
-
it('should return reviewReady=false with
|
|
209
|
+
it('should return reviewReady=false with ANY_CI_JOB_FAILED_OR_IN_PROGRESS when PR CI is failing', async () => {
|
|
129
210
|
const issue = createMockIssue();
|
|
130
|
-
|
|
131
|
-
|
|
211
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
212
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
213
|
+
createMockComment(),
|
|
214
|
+
]);
|
|
132
215
|
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
133
216
|
createReadyPr({
|
|
134
217
|
isPassedAllCiJob: false,
|
|
@@ -137,62 +220,71 @@ describe('CheckIssueReviewReadinessUseCase', () => {
|
|
|
137
220
|
]);
|
|
138
221
|
|
|
139
222
|
const result = await useCase.run({
|
|
140
|
-
projectUrl: 'https://github.com/users/user/projects/1',
|
|
141
223
|
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
142
224
|
});
|
|
143
225
|
|
|
144
226
|
expect(result.reviewReady).toBe(false);
|
|
145
|
-
expect(result.rejections).toHaveLength(1);
|
|
146
227
|
expect(result.rejections[0].type).toBe(
|
|
147
228
|
'ANY_CI_JOB_FAILED_OR_IN_PROGRESS',
|
|
148
229
|
);
|
|
149
|
-
expect(result.rejections[0].detail).toContain(
|
|
150
|
-
'https://github.com/user/repo/pull/1',
|
|
151
|
-
);
|
|
152
230
|
});
|
|
153
231
|
|
|
154
|
-
it('should
|
|
232
|
+
it('should treat all authors as trusted when allowedIssueAuthors is null', async () => {
|
|
155
233
|
const issue = createMockIssue();
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
234
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
235
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
236
|
+
createMockComment({ author: 'any-unknown-author' }),
|
|
237
|
+
]);
|
|
238
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
239
|
+
createReadyPr(),
|
|
240
|
+
]);
|
|
159
241
|
|
|
160
242
|
const result = await useCase.run({
|
|
161
|
-
projectUrl: 'https://github.com/users/user/projects/1',
|
|
162
243
|
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
244
|
+
allowedIssueAuthors: null,
|
|
163
245
|
});
|
|
164
246
|
|
|
165
|
-
expect(result.reviewReady).toBe(
|
|
166
|
-
expect(result.rejections).toEqual([
|
|
167
|
-
{ type: 'PULL_REQUEST_NOT_FOUND', detail: 'PULL_REQUEST_NOT_FOUND' },
|
|
168
|
-
]);
|
|
247
|
+
expect(result.reviewReady).toBe(true);
|
|
248
|
+
expect(result.rejections).toEqual([]);
|
|
169
249
|
});
|
|
170
250
|
|
|
171
|
-
it('should
|
|
172
|
-
|
|
173
|
-
mockIssueRepository.
|
|
251
|
+
it('should reject when last comment author is not in allowedIssueAuthors list', async () => {
|
|
252
|
+
const issue = createMockIssue();
|
|
253
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
254
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
255
|
+
createMockComment({ author: 'untrusted-author' }),
|
|
256
|
+
]);
|
|
257
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
258
|
+
createReadyPr(),
|
|
259
|
+
]);
|
|
260
|
+
|
|
261
|
+
const result = await useCase.run({
|
|
262
|
+
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
263
|
+
allowedIssueAuthors: ['trusted-author'],
|
|
264
|
+
});
|
|
174
265
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
).rejects.toThrow(
|
|
181
|
-
'Issue not found: https://github.com/user/repo/issues/999',
|
|
182
|
-
);
|
|
266
|
+
expect(result.reviewReady).toBe(false);
|
|
267
|
+
expect(result.rejections).toContainEqual({
|
|
268
|
+
type: 'NO_REPORT_FROM_AGENT_BOT',
|
|
269
|
+
detail: 'NO_REPORT_FROM_AGENT_BOT',
|
|
270
|
+
});
|
|
183
271
|
});
|
|
184
272
|
|
|
185
|
-
it('should
|
|
186
|
-
const issue = createMockIssue(
|
|
187
|
-
|
|
188
|
-
|
|
273
|
+
it('should accept when last comment author is in allowedIssueAuthors list', async () => {
|
|
274
|
+
const issue = createMockIssue();
|
|
275
|
+
mockIssueRepository.getIssueByUrl.mockResolvedValue(issue);
|
|
276
|
+
mockIssueCommentRepository.getCommentsFromIssue.mockResolvedValue([
|
|
277
|
+
createMockComment({ author: 'trusted-author' }),
|
|
278
|
+
]);
|
|
279
|
+
mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
|
|
280
|
+
createReadyPr(),
|
|
281
|
+
]);
|
|
189
282
|
|
|
190
283
|
const result = await useCase.run({
|
|
191
|
-
projectUrl: 'https://github.com/users/user/projects/1',
|
|
192
284
|
issueUrl: 'https://github.com/user/repo/issues/1',
|
|
285
|
+
allowedIssueAuthors: ['trusted-author'],
|
|
193
286
|
});
|
|
194
287
|
|
|
195
|
-
expect(mockIssueRepository.findRelatedOpenPRs).not.toHaveBeenCalled();
|
|
196
288
|
expect(result.reviewReady).toBe(true);
|
|
197
289
|
expect(result.rejections).toEqual([]);
|
|
198
290
|
});
|
|
@@ -1,53 +1,127 @@
|
|
|
1
1
|
import { IssueRepository } from './adapter-interfaces/IssueRepository';
|
|
2
|
-
import {
|
|
2
|
+
import { IssueCommentRepository } from './adapter-interfaces/IssueCommentRepository';
|
|
3
3
|
import {
|
|
4
4
|
IssueRejectionEvaluator,
|
|
5
5
|
PrRejectedReasonType,
|
|
6
6
|
} from './IssueRejectionEvaluator';
|
|
7
|
-
|
|
7
|
+
|
|
8
|
+
type RejectedReasonType =
|
|
9
|
+
| 'ISSUE_NOT_FOUND'
|
|
10
|
+
| 'NO_REPORT_FROM_AGENT_BOT'
|
|
11
|
+
| 'REPORT_HAS_NEXT_STEP'
|
|
12
|
+
| PrRejectedReasonType;
|
|
8
13
|
|
|
9
14
|
export type IssueReviewReadinessResult = {
|
|
10
15
|
reviewReady: boolean;
|
|
11
|
-
rejections: { type:
|
|
16
|
+
rejections: { type: RejectedReasonType; detail: string }[];
|
|
12
17
|
};
|
|
13
18
|
|
|
14
19
|
export class CheckIssueReviewReadinessUseCase {
|
|
15
20
|
private readonly issueRejectionEvaluator: IssueRejectionEvaluator;
|
|
16
21
|
|
|
17
22
|
constructor(
|
|
18
|
-
private readonly projectRepository: Pick<ProjectRepository, 'getByUrl'>,
|
|
19
23
|
private readonly issueRepository: Pick<
|
|
20
24
|
IssueRepository,
|
|
21
|
-
| '
|
|
25
|
+
| 'getIssueByUrl'
|
|
22
26
|
| 'findRelatedOpenPRs'
|
|
23
27
|
| 'getOpenPullRequest'
|
|
24
28
|
| 'getPullRequestChangedFilePaths'
|
|
25
29
|
| 'requestChangesWithInlineComment'
|
|
26
30
|
>,
|
|
31
|
+
private readonly issueCommentRepository: Pick<
|
|
32
|
+
IssueCommentRepository,
|
|
33
|
+
'getCommentsFromIssue'
|
|
34
|
+
>,
|
|
27
35
|
) {
|
|
28
36
|
this.issueRejectionEvaluator = new IssueRejectionEvaluator(issueRepository);
|
|
29
37
|
}
|
|
30
38
|
|
|
31
39
|
run = async (params: {
|
|
32
|
-
projectUrl: string;
|
|
33
40
|
issueUrl: string;
|
|
41
|
+
allowedIssueAuthors?: string[] | null;
|
|
34
42
|
labelsAsLlmAgentName?: string[] | null;
|
|
35
43
|
}): Promise<IssueReviewReadinessResult> => {
|
|
36
|
-
const
|
|
37
|
-
const issue = await this.issueRepository.get(params.issueUrl, project);
|
|
44
|
+
const issue = await this.issueRepository.getIssueByUrl(params.issueUrl);
|
|
38
45
|
|
|
39
46
|
if (!issue) {
|
|
40
|
-
|
|
47
|
+
return {
|
|
48
|
+
reviewReady: false,
|
|
49
|
+
rejections: [
|
|
50
|
+
{
|
|
51
|
+
type: 'ISSUE_NOT_FOUND',
|
|
52
|
+
detail: `Issue not found: ${params.issueUrl}`,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const rejections: { type: RejectedReasonType; detail: string }[] = [];
|
|
59
|
+
|
|
60
|
+
const comments =
|
|
61
|
+
await this.issueCommentRepository.getCommentsFromIssue(issue);
|
|
62
|
+
|
|
63
|
+
const isTrustedAuthor = (author: string): boolean =>
|
|
64
|
+
this.isAuthorTrusted(author, params.allowedIssueAuthors ?? null);
|
|
65
|
+
|
|
66
|
+
const lastComment = comments[comments.length - 1];
|
|
67
|
+
if (
|
|
68
|
+
!lastComment ||
|
|
69
|
+
!isTrustedAuthor(lastComment.author) ||
|
|
70
|
+
!lastComment.content.startsWith('From: :robot:')
|
|
71
|
+
) {
|
|
72
|
+
rejections.push({
|
|
73
|
+
type: 'NO_REPORT_FROM_AGENT_BOT',
|
|
74
|
+
detail: 'NO_REPORT_FROM_AGENT_BOT',
|
|
75
|
+
});
|
|
76
|
+
} else if (this.reportBodyHasNextStep(lastComment.content)) {
|
|
77
|
+
rejections.push({
|
|
78
|
+
type: 'REPORT_HAS_NEXT_STEP',
|
|
79
|
+
detail: 'REPORT_HAS_NEXT_STEP',
|
|
80
|
+
});
|
|
41
81
|
}
|
|
42
82
|
|
|
43
|
-
const { rejections } =
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
83
|
+
const { rejections: prRejections } =
|
|
84
|
+
await this.issueRejectionEvaluator.evaluate(
|
|
85
|
+
issue,
|
|
86
|
+
params.labelsAsLlmAgentName ?? [],
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
const allRejections = [...rejections, ...prRejections];
|
|
47
90
|
|
|
48
91
|
return {
|
|
49
|
-
reviewReady:
|
|
50
|
-
rejections,
|
|
92
|
+
reviewReady: allRejections.length === 0,
|
|
93
|
+
rejections: allRejections,
|
|
51
94
|
};
|
|
52
95
|
};
|
|
96
|
+
|
|
97
|
+
private isAuthorTrusted = (
|
|
98
|
+
author: string,
|
|
99
|
+
allowedIssueAuthors: string[] | null,
|
|
100
|
+
): boolean =>
|
|
101
|
+
allowedIssueAuthors === null || allowedIssueAuthors.includes(author);
|
|
102
|
+
|
|
103
|
+
private reportBodyHasNextStep = (body: string): boolean => {
|
|
104
|
+
const reportMatch = body.match(/```json\n([\s\S]*?)\n```/);
|
|
105
|
+
if (!reportMatch || reportMatch.length < 2) {
|
|
106
|
+
return false;
|
|
107
|
+
}
|
|
108
|
+
let reportJson: unknown;
|
|
109
|
+
try {
|
|
110
|
+
reportJson = JSON.parse(reportMatch[1]);
|
|
111
|
+
} catch (error) {
|
|
112
|
+
console.warn(
|
|
113
|
+
'Invalid JSON in report body while checking nextStep:',
|
|
114
|
+
error,
|
|
115
|
+
);
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
if (typeof reportJson !== 'object' || reportJson === null) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
if (!('nextStep' in reportJson)) {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
const nextStepValue = Reflect.get(reportJson, 'nextStep');
|
|
125
|
+
return nextStepValue !== null && nextStepValue !== undefined;
|
|
126
|
+
};
|
|
53
127
|
}
|
|
@@ -1,22 +1,26 @@
|
|
|
1
1
|
import { IssueRepository } from './adapter-interfaces/IssueRepository';
|
|
2
|
-
import {
|
|
2
|
+
import { IssueCommentRepository } from './adapter-interfaces/IssueCommentRepository';
|
|
3
3
|
import { PrRejectedReasonType } from './IssueRejectionEvaluator';
|
|
4
|
+
type RejectedReasonType = 'ISSUE_NOT_FOUND' | 'NO_REPORT_FROM_AGENT_BOT' | 'REPORT_HAS_NEXT_STEP' | PrRejectedReasonType;
|
|
4
5
|
export type IssueReviewReadinessResult = {
|
|
5
6
|
reviewReady: boolean;
|
|
6
7
|
rejections: {
|
|
7
|
-
type:
|
|
8
|
+
type: RejectedReasonType;
|
|
8
9
|
detail: string;
|
|
9
10
|
}[];
|
|
10
11
|
};
|
|
11
12
|
export declare class CheckIssueReviewReadinessUseCase {
|
|
12
|
-
private readonly projectRepository;
|
|
13
13
|
private readonly issueRepository;
|
|
14
|
+
private readonly issueCommentRepository;
|
|
14
15
|
private readonly issueRejectionEvaluator;
|
|
15
|
-
constructor(
|
|
16
|
+
constructor(issueRepository: Pick<IssueRepository, 'getIssueByUrl' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'getPullRequestChangedFilePaths' | 'requestChangesWithInlineComment'>, issueCommentRepository: Pick<IssueCommentRepository, 'getCommentsFromIssue'>);
|
|
16
17
|
run: (params: {
|
|
17
|
-
projectUrl: string;
|
|
18
18
|
issueUrl: string;
|
|
19
|
+
allowedIssueAuthors?: string[] | null;
|
|
19
20
|
labelsAsLlmAgentName?: string[] | null;
|
|
20
21
|
}) => Promise<IssueReviewReadinessResult>;
|
|
22
|
+
private isAuthorTrusted;
|
|
23
|
+
private reportBodyHasNextStep;
|
|
21
24
|
}
|
|
25
|
+
export {};
|
|
22
26
|
//# sourceMappingURL=CheckIssueReviewReadinessUseCase.d.ts.map
|
|
@@ -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,
|
|
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;AAEnC,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;KACxC,KAAG,OAAO,CAAC,0BAA0B,CAAC,CAoDrC;IAEF,OAAO,CAAC,eAAe,CAIgD;IAEvE,OAAO,CAAC,qBAAqB,CAuB3B;CACH"}
|