github-issue-tower-defence-management 1.78.0 → 1.80.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 CHANGED
@@ -1,3 +1,22 @@
1
+ # [1.80.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.79.0...v1.80.0) (2026-06-12)
2
+
3
+
4
+ ### Features
5
+
6
+ * **domain:** add console use case base directory ([86460ee](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/86460ee145b9b9545ff2445bbc6988ca83eafc75))
7
+
8
+ # [1.79.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.78.0...v1.79.0) (2026-06-12)
9
+
10
+
11
+ ### Features
12
+
13
+ * **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)
14
+
15
+
16
+ ### Reverts
17
+
18
+ * restore unrelated build artifacts to origin/main state ([30a7ec1](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/30a7ec1424122d562373e79989d6fe2abefaa46d))
19
+
1
20
  # [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
21
 
3
22
 
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 by reusing the same `IssueRejectionEvaluator` logic that `notifyFinishedIssuePreparation` consults. 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, issue not found).
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 useCase = new CheckIssueReviewReadinessUseCase_1.CheckIssueReviewReadinessUseCase(projectRepository, issueRepository);
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(projectRepository, issueRepository) {
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 project = await this.projectRepository.getByUrl(params.projectUrl);
12
- const issue = await this.issueRepository.get(params.issueUrl, project);
10
+ const issue = await this.issueRepository.getIssueByUrl(params.issueUrl);
13
11
  if (!issue) {
14
- throw new NotifyFinishedIssuePreparationUseCase_1.IssueNotFoundError(params.issueUrl);
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 { rejections } = await this.issueRejectionEvaluator.evaluate(issue, params.labelsAsLlmAgentName ?? []);
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: rejections.length === 0,
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;AACnC,mGAA6E;AAO7E,MAAa,gCAAgC;IAG3C,YACmB,iBAAsD,EACtD,eAOhB;QARgB,sBAAiB,GAAjB,iBAAiB,CAAqC;QACtD,oBAAe,GAAf,eAAe,CAO/B;QAKH,QAAG,GAAG,KAAK,EAAE,MAIZ,EAAuC,EAAE;YACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACzE,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,0DAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAChE,KAAK,EACL,MAAM,CAAC,oBAAoB,IAAI,EAAE,CAClC,CAAC;YAEF,OAAO;gBACL,WAAW,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;gBACpC,UAAU;aACX,CAAC;QACJ,CAAC,CAAC;QAxBA,IAAI,CAAC,uBAAuB,GAAG,IAAI,iDAAuB,CAAC,eAAe,CAAC,CAAC;IAC9E,CAAC;CAwBF;AAvCD,4EAuCC"}
1
+ {"version":3,"file":"CheckIssueReviewReadinessUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/CheckIssueReviewReadinessUseCase.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.78.0",
3
+ "version": "1.80.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -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 allow CLI args to override projectUrl from config file', async () => {
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 { Project } from '../entities/Project';
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
- get: jest.Mock;
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
- get: jest.fn(),
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=true with empty rejections when the linked PR is ready', async () => {
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
- mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
114
- mockIssueRepository.get.mockResolvedValue(issue);
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 rejections when the linked PR has failing CI', async () => {
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
- mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
131
- mockIssueRepository.get.mockResolvedValue(issue);
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 return reviewReady=false with PULL_REQUEST_NOT_FOUND when no related PR exists', async () => {
232
+ it('should treat all authors as trusted when allowedIssueAuthors is null', async () => {
155
233
  const issue = createMockIssue();
156
- mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
157
- mockIssueRepository.get.mockResolvedValue(issue);
158
- mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
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(false);
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 throw IssueNotFoundError when the issue does not exist', async () => {
172
- mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
173
- mockIssueRepository.get.mockResolvedValue(null);
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
- await expect(
176
- useCase.run({
177
- projectUrl: 'https://github.com/users/user/projects/1',
178
- issueUrl: 'https://github.com/user/repo/issues/999',
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 not call findRelatedOpenPRs nor mutate state when issue has a category label other than e2e', async () => {
186
- const issue = createMockIssue({ labels: ['category:frontend'] });
187
- mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
188
- mockIssueRepository.get.mockResolvedValue(issue);
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 { ProjectRepository } from './adapter-interfaces/ProjectRepository';
2
+ import { IssueCommentRepository } from './adapter-interfaces/IssueCommentRepository';
3
3
  import {
4
4
  IssueRejectionEvaluator,
5
5
  PrRejectedReasonType,
6
6
  } from './IssueRejectionEvaluator';
7
- import { IssueNotFoundError } from './NotifyFinishedIssuePreparationUseCase';
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: PrRejectedReasonType; detail: string }[];
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
- | 'get'
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 project = await this.projectRepository.getByUrl(params.projectUrl);
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
- throw new IssueNotFoundError(params.issueUrl);
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 } = await this.issueRejectionEvaluator.evaluate(
44
- issue,
45
- params.labelsAsLlmAgentName ?? [],
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: rejections.length === 0,
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
  }
File without changes
@@ -1,22 +1,26 @@
1
1
  import { IssueRepository } from './adapter-interfaces/IssueRepository';
2
- import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
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: PrRejectedReasonType;
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(projectRepository: Pick<ProjectRepository, 'getByUrl'>, issueRepository: Pick<IssueRepository, 'get' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'getPullRequestChangedFilePaths' | 'requestChangesWithInlineComment'>);
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,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAEL,oBAAoB,EACrB,MAAM,2BAA2B,CAAC;AAGnC,MAAM,MAAM,0BAA0B,GAAG;IACvC,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE;QAAE,IAAI,EAAE,oBAAoB,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC9D,CAAC;AAEF,qBAAa,gCAAgC;IAIzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAJlC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;gBAG/C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EACtD,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,KAAK,GACL,oBAAoB,GACpB,oBAAoB,GACpB,gCAAgC,GAChC,iCAAiC,CACpC;IAKH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,oBAAoB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KACxC,KAAG,OAAO,CAAC,0BAA0B,CAAC,CAiBrC;CACH"}
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"}