github-issue-tower-defence-management 1.70.0 → 1.71.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,10 @@
1
+ # [1.71.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.70.0...v1.71.0) (2026-06-06)
2
+
3
+
4
+ ### Features
5
+
6
+ * **cli:** add checkIssueReviewReadiness sub-command for read-only review-readiness check ([502ccf7](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/502ccf747d65d498bbaac18f8e3a3099d937e55c)), closes [#743](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/743)
7
+
1
8
  # [1.70.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.69.13...v1.70.0) (2026-06-06)
2
9
 
3
10
 
package/README.md CHANGED
@@ -19,6 +19,7 @@ Commands:
19
19
  schedule [options] Handle scheduled events (trigger: issue or schedule) (default)
20
20
  startDaemon [options] Start daemon to prepare GitHub issues
21
21
  notifyFinishedIssuePreparation [options] Notify that issue preparation is finished
22
+ checkIssueReviewReadiness [options] Check whether an issue is review-ready (read-only; does not change Status or post any comment)
22
23
  help [command] display help for command
23
24
 
24
25
  Options for schedule:
@@ -45,8 +46,15 @@ Options for notifyFinishedIssuePreparation:
45
46
  --projectUrl <url> GitHub project URL
46
47
  --thresholdForAutoReject <count> Threshold for auto-escalation after consecutive rejections (default: 3)
47
48
  --workflowBlockerResolvedWebhookUrl <url> Webhook URL to notify when a workflow blocker issue status changes
49
+
50
+ Options for checkIssueReviewReadiness:
51
+ --configFilePath <path> Path to config file for tower defence management (required)
52
+ --issueUrl <url> GitHub issue URL (required)
53
+ --projectUrl <url> GitHub project URL
48
54
  ```
49
55
 
56
+ 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
+
50
58
  ## Example 📖
51
59
 
52
60
  Here's a quick example to illustrate its usage:
@@ -67,6 +75,10 @@ npx github-issue-tower-defence-management startDaemon --configFilePath ./prepara
67
75
  npx github-issue-tower-defence-management notifyFinishedIssuePreparation --configFilePath ./preparator-config.yml --issueUrl https://github.com/HiromiShikata/test-repository/issues/1
68
76
  ```
69
77
 
78
+ ```
79
+ npx github-issue-tower-defence-management checkIssueReviewReadiness --configFilePath ./preparator-config.yml --issueUrl https://github.com/HiromiShikata/test-repository/issues/1
80
+ ```
81
+
70
82
  ## Config
71
83
 
72
84
  ### Schedule Command Config
@@ -14,6 +14,7 @@ const StartPreparationUseCase_1 = require("../../../domain/usecases/StartPrepara
14
14
  const rotationOrderFileWriter_1 = require("../handlers/rotationOrderFileWriter");
15
15
  const ProxyClaudeTokenUsageRepository_1 = require("../../repositories/ProxyClaudeTokenUsageRepository");
16
16
  const NotifyFinishedIssuePreparationUseCase_1 = require("../../../domain/usecases/NotifyFinishedIssuePreparationUseCase");
17
+ const CheckIssueReviewReadinessUseCase_1 = require("../../../domain/usecases/CheckIssueReviewReadinessUseCase");
17
18
  const LocalStorageRepository_1 = require("../../repositories/LocalStorageRepository");
18
19
  const GraphqlProjectRepository_1 = require("../../repositories/GraphqlProjectRepository");
19
20
  const ApiV3IssueRepository_1 = require("../../repositories/issue/ApiV3IssueRepository");
@@ -250,6 +251,53 @@ exports.program
250
251
  allowedIssueAuthors,
251
252
  });
252
253
  });
254
+ exports.program
255
+ .command('checkIssueReviewReadiness')
256
+ .description('Check whether an issue is in a review-ready state without mutating any field or posting any comment')
257
+ .requiredOption('--configFilePath <path>', 'Path to config file for tower defence management')
258
+ .requiredOption('--issueUrl <url>', 'GitHub issue URL')
259
+ .option('--projectUrl <url>', 'GitHub project URL')
260
+ .action(async (options) => {
261
+ const token = process.env.GH_TOKEN;
262
+ if (!token) {
263
+ console.error('GH_TOKEN environment variable is required');
264
+ process.exit(1);
265
+ }
266
+ const configFileValues = (0, projectConfig_2.loadConfigFile)(options.configFilePath);
267
+ const cliOverrides = {
268
+ projectUrl: options.projectUrl,
269
+ };
270
+ const tempProjectUrl = cliOverrides.projectUrl ?? configFileValues.projectUrl;
271
+ let readmeOverrides = {};
272
+ if (tempProjectUrl) {
273
+ const readme = await (0, projectConfig_2.fetchProjectReadme)(tempProjectUrl, token);
274
+ if (readme) {
275
+ readmeOverrides = (0, projectConfig_2.parseProjectReadmeConfig)(readme, tempProjectUrl);
276
+ }
277
+ }
278
+ const config = (0, projectConfig_2.mergeConfigs)(configFileValues, cliOverrides, readmeOverrides);
279
+ const projectUrl = config.projectUrl;
280
+ if (!projectUrl) {
281
+ console.error('projectUrl is required. Provide via --projectUrl, config file, or project README.');
282
+ process.exit(1);
283
+ }
284
+ const projectName = config.projectName ?? 'default';
285
+ const localStorageRepository = new LocalStorageRepository_1.LocalStorageRepository();
286
+ const cachePath = `./tmp/cache/${projectName}`;
287
+ const localStorageCacheRepository = new LocalStorageCacheRepository_1.LocalStorageCacheRepository(localStorageRepository, cachePath);
288
+ const githubRepositoryParams = buildGithubRepositoryParams(localStorageRepository, token);
289
+ const projectRepository = new GraphqlProjectRepository_1.GraphqlProjectRepository(...githubRepositoryParams);
290
+ const apiV3IssueRepository = new ApiV3IssueRepository_1.ApiV3IssueRepository(...githubRepositoryParams);
291
+ const restIssueRepository = new RestIssueRepository_1.RestIssueRepository(...githubRepositoryParams);
292
+ const graphqlProjectItemRepository = new GraphqlProjectItemRepository_1.GraphqlProjectItemRepository(...githubRepositoryParams);
293
+ const issueRepository = new ApiV3CheerioRestIssueRepository_1.ApiV3CheerioRestIssueRepository(apiV3IssueRepository, restIssueRepository, graphqlProjectItemRepository, localStorageCacheRepository, ...githubRepositoryParams);
294
+ const useCase = new CheckIssueReviewReadinessUseCase_1.CheckIssueReviewReadinessUseCase(projectRepository, issueRepository);
295
+ const result = await useCase.run({
296
+ projectUrl,
297
+ issueUrl: options.issueUrl,
298
+ });
299
+ process.stdout.write(`${JSON.stringify(result)}\n`);
300
+ });
253
301
  /* istanbul ignore next */
254
302
  if (process.argv && require.main === module) {
255
303
  exports.program.parse(process.argv);
@@ -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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"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CheckIssueReviewReadinessUseCase = void 0;
4
+ const IssueRejectionEvaluator_1 = require("./IssueRejectionEvaluator");
5
+ const NotifyFinishedIssuePreparationUseCase_1 = require("./NotifyFinishedIssuePreparationUseCase");
6
+ class CheckIssueReviewReadinessUseCase {
7
+ constructor(projectRepository, issueRepository) {
8
+ this.projectRepository = projectRepository;
9
+ this.issueRepository = issueRepository;
10
+ this.run = async (params) => {
11
+ const project = await this.projectRepository.getByUrl(params.projectUrl);
12
+ const issue = await this.issueRepository.get(params.issueUrl, project);
13
+ if (!issue) {
14
+ throw new NotifyFinishedIssuePreparationUseCase_1.IssueNotFoundError(params.issueUrl);
15
+ }
16
+ const { rejections } = await this.issueRejectionEvaluator.evaluate(issue);
17
+ return {
18
+ reviewReady: rejections.length === 0,
19
+ rejections,
20
+ };
21
+ };
22
+ this.issueRejectionEvaluator = new IssueRejectionEvaluator_1.IssueRejectionEvaluator(issueRepository);
23
+ }
24
+ }
25
+ exports.CheckIssueReviewReadinessUseCase = CheckIssueReviewReadinessUseCase;
26
+ //# sourceMappingURL=CheckIssueReviewReadinessUseCase.js.map
@@ -0,0 +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,eAGhB;QAJgB,sBAAiB,GAAjB,iBAAiB,CAAqC;QACtD,oBAAe,GAAf,eAAe,CAG/B;QAKH,QAAG,GAAG,KAAK,EAAE,MAGZ,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,CAAC,KAAK,CAAC,CAAC;YAE1E,OAAO;gBACL,WAAW,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC;gBACpC,UAAU;aACX,CAAC;QACJ,CAAC,CAAC;QApBA,IAAI,CAAC,uBAAuB,GAAG,IAAI,iDAAuB,CAAC,eAAe,CAAC,CAAC;IAC9E,CAAC;CAoBF;AA/BD,4EA+BC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.70.0",
3
+ "version": "1.71.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -10,9 +10,11 @@ import {
10
10
  } from './index';
11
11
  import { StartPreparationUseCase } from '../../../domain/usecases/StartPreparationUseCase';
12
12
  import { NotifyFinishedIssuePreparationUseCase } from '../../../domain/usecases/NotifyFinishedIssuePreparationUseCase';
13
+ import { CheckIssueReviewReadinessUseCase } from '../../../domain/usecases/CheckIssueReviewReadinessUseCase';
13
14
 
14
15
  jest.mock('../../../domain/usecases/StartPreparationUseCase');
15
16
  jest.mock('../../../domain/usecases/NotifyFinishedIssuePreparationUseCase');
17
+ jest.mock('../../../domain/usecases/CheckIssueReviewReadinessUseCase');
16
18
  jest.mock('../../repositories/LocalStorageRepository', () => ({
17
19
  LocalStorageRepository: jest.fn().mockImplementation(() => ({})),
18
20
  }));
@@ -1461,4 +1463,191 @@ mysteryKey: 'value'
1461
1463
  );
1462
1464
  });
1463
1465
  });
1466
+
1467
+ describe('checkIssueReviewReadiness', () => {
1468
+ it('should appear in the CLI help output', () => {
1469
+ const helpText = program.helpInformation();
1470
+ expect(helpText).toContain('checkIssueReviewReadiness');
1471
+ });
1472
+
1473
+ it('should write reviewReady=true JSON to stdout when the use case reports zero rejections', async () => {
1474
+ const mockRun = jest
1475
+ .fn()
1476
+ .mockResolvedValue({ reviewReady: true, rejections: [] });
1477
+ const MockedCheckUseCase = jest.mocked(CheckIssueReviewReadinessUseCase);
1478
+
1479
+ MockedCheckUseCase.mockImplementation(function (
1480
+ this: CheckIssueReviewReadinessUseCase,
1481
+ ) {
1482
+ this.run = mockRun;
1483
+ return this;
1484
+ });
1485
+
1486
+ const stdoutSpy = jest
1487
+ .spyOn(process.stdout, 'write')
1488
+ .mockImplementation(() => true);
1489
+
1490
+ await program.parseAsync([
1491
+ 'node',
1492
+ 'test',
1493
+ 'checkIssueReviewReadiness',
1494
+ '--configFilePath',
1495
+ configFilePath,
1496
+ '--issueUrl',
1497
+ 'https://github.com/test/repo/issues/1',
1498
+ ]);
1499
+
1500
+ expect(mockRun).toHaveBeenCalledTimes(1);
1501
+ expect(mockRun).toHaveBeenCalledWith({
1502
+ projectUrl: 'https://github.com/orgs/test/projects/1',
1503
+ issueUrl: 'https://github.com/test/repo/issues/1',
1504
+ });
1505
+ expect(stdoutSpy).toHaveBeenCalledWith(
1506
+ `${JSON.stringify({ reviewReady: true, rejections: [] })}\n`,
1507
+ );
1508
+
1509
+ stdoutSpy.mockRestore();
1510
+ });
1511
+
1512
+ it('should write reviewReady=false JSON with rejections to stdout when the use case reports rejections', async () => {
1513
+ const rejections = [
1514
+ {
1515
+ type: 'ANY_CI_JOB_FAILED_OR_IN_PROGRESS',
1516
+ detail:
1517
+ 'ANY_CI_JOB_FAILED_OR_IN_PROGRESS: https://github.com/test/repo/pull/1',
1518
+ },
1519
+ ];
1520
+ const mockRun = jest
1521
+ .fn()
1522
+ .mockResolvedValue({ reviewReady: false, rejections });
1523
+ const MockedCheckUseCase = jest.mocked(CheckIssueReviewReadinessUseCase);
1524
+
1525
+ MockedCheckUseCase.mockImplementation(function (
1526
+ this: CheckIssueReviewReadinessUseCase,
1527
+ ) {
1528
+ this.run = mockRun;
1529
+ return this;
1530
+ });
1531
+
1532
+ const stdoutSpy = jest
1533
+ .spyOn(process.stdout, 'write')
1534
+ .mockImplementation(() => true);
1535
+
1536
+ await program.parseAsync([
1537
+ 'node',
1538
+ 'test',
1539
+ 'checkIssueReviewReadiness',
1540
+ '--configFilePath',
1541
+ configFilePath,
1542
+ '--issueUrl',
1543
+ 'https://github.com/test/repo/issues/1',
1544
+ ]);
1545
+
1546
+ expect(mockRun).toHaveBeenCalledTimes(1);
1547
+ expect(stdoutSpy).toHaveBeenCalledWith(
1548
+ `${JSON.stringify({ reviewReady: false, rejections })}\n`,
1549
+ );
1550
+
1551
+ stdoutSpy.mockRestore();
1552
+ });
1553
+
1554
+ it('should allow CLI args to override projectUrl from config file', async () => {
1555
+ const mockRun = jest
1556
+ .fn()
1557
+ .mockResolvedValue({ reviewReady: true, rejections: [] });
1558
+ const MockedCheckUseCase = jest.mocked(CheckIssueReviewReadinessUseCase);
1559
+
1560
+ MockedCheckUseCase.mockImplementation(function (
1561
+ this: CheckIssueReviewReadinessUseCase,
1562
+ ) {
1563
+ this.run = mockRun;
1564
+ return this;
1565
+ });
1566
+
1567
+ const stdoutSpy = jest
1568
+ .spyOn(process.stdout, 'write')
1569
+ .mockImplementation(() => true);
1570
+
1571
+ await program.parseAsync([
1572
+ 'node',
1573
+ 'test',
1574
+ 'checkIssueReviewReadiness',
1575
+ '--configFilePath',
1576
+ configFilePath,
1577
+ '--issueUrl',
1578
+ 'https://github.com/test/repo/issues/1',
1579
+ '--projectUrl',
1580
+ 'https://github.com/orgs/override/projects/2',
1581
+ ]);
1582
+
1583
+ expect(mockRun).toHaveBeenCalledWith({
1584
+ projectUrl: 'https://github.com/orgs/override/projects/2',
1585
+ issueUrl: 'https://github.com/test/repo/issues/1',
1586
+ });
1587
+
1588
+ stdoutSpy.mockRestore();
1589
+ });
1590
+
1591
+ it('should exit with error when GH_TOKEN is missing', async () => {
1592
+ delete process.env.GH_TOKEN;
1593
+ const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
1594
+ const processExitSpy = jest
1595
+ .spyOn(process, 'exit')
1596
+ .mockImplementation(() => {
1597
+ throw new Error('process.exit called');
1598
+ });
1599
+
1600
+ await expect(
1601
+ program.parseAsync([
1602
+ 'node',
1603
+ 'test',
1604
+ 'checkIssueReviewReadiness',
1605
+ '--configFilePath',
1606
+ configFilePath,
1607
+ '--issueUrl',
1608
+ 'https://github.com/test/repo/issues/1',
1609
+ ]),
1610
+ ).rejects.toThrow('process.exit called');
1611
+
1612
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
1613
+ 'GH_TOKEN environment variable is required',
1614
+ );
1615
+ expect(processExitSpy).toHaveBeenCalledWith(1);
1616
+
1617
+ consoleErrorSpy.mockRestore();
1618
+ processExitSpy.mockRestore();
1619
+ });
1620
+
1621
+ it('should exit with error when projectUrl is missing', async () => {
1622
+ const configMissing = {};
1623
+ writeConfig(configMissing);
1624
+
1625
+ const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation();
1626
+ const processExitSpy = jest
1627
+ .spyOn(process, 'exit')
1628
+ .mockImplementation(() => {
1629
+ throw new Error('process.exit called');
1630
+ });
1631
+
1632
+ await expect(
1633
+ program.parseAsync([
1634
+ 'node',
1635
+ 'test',
1636
+ 'checkIssueReviewReadiness',
1637
+ '--configFilePath',
1638
+ configFilePath,
1639
+ '--issueUrl',
1640
+ 'https://github.com/test/repo/issues/1',
1641
+ ]),
1642
+ ).rejects.toThrow('process.exit called');
1643
+
1644
+ expect(consoleErrorSpy).toHaveBeenCalledWith(
1645
+ 'projectUrl is required. Provide via --projectUrl, config file, or project README.',
1646
+ );
1647
+ expect(processExitSpy).toHaveBeenCalledWith(1);
1648
+
1649
+ consoleErrorSpy.mockRestore();
1650
+ processExitSpy.mockRestore();
1651
+ });
1652
+ });
1464
1653
  });
@@ -19,6 +19,7 @@ import { StartPreparationUseCase } from '../../../domain/usecases/StartPreparati
19
19
  import { writeRotationOrderFile } from '../handlers/rotationOrderFileWriter';
20
20
  import { ProxyClaudeTokenUsageRepository } from '../../repositories/ProxyClaudeTokenUsageRepository';
21
21
  import { NotifyFinishedIssuePreparationUseCase } from '../../../domain/usecases/NotifyFinishedIssuePreparationUseCase';
22
+ import { CheckIssueReviewReadinessUseCase } from '../../../domain/usecases/CheckIssueReviewReadinessUseCase';
22
23
  import { LocalStorageRepository } from '../../repositories/LocalStorageRepository';
23
24
  import { GraphqlProjectRepository } from '../../repositories/GraphqlProjectRepository';
24
25
  import { ApiV3IssueRepository } from '../../repositories/issue/ApiV3IssueRepository';
@@ -53,6 +54,12 @@ type NotifyFinishedOptions = {
53
54
  configFilePath: string;
54
55
  };
55
56
 
57
+ type CheckIssueReviewReadinessOptions = {
58
+ issueUrl: string;
59
+ projectUrl?: string;
60
+ configFilePath: string;
61
+ };
62
+
56
63
  const buildGithubRepositoryParams = (
57
64
  localStorageRepository: LocalStorageRepository,
58
65
  token: string,
@@ -444,6 +451,100 @@ program
444
451
  });
445
452
  });
446
453
 
454
+ program
455
+ .command('checkIssueReviewReadiness')
456
+ .description(
457
+ 'Check whether an issue is in a review-ready state without mutating any field or posting any comment',
458
+ )
459
+ .requiredOption(
460
+ '--configFilePath <path>',
461
+ 'Path to config file for tower defence management',
462
+ )
463
+ .requiredOption('--issueUrl <url>', 'GitHub issue URL')
464
+ .option('--projectUrl <url>', 'GitHub project URL')
465
+ .action(async (options: CheckIssueReviewReadinessOptions) => {
466
+ const token = process.env.GH_TOKEN;
467
+ if (!token) {
468
+ console.error('GH_TOKEN environment variable is required');
469
+ process.exit(1);
470
+ }
471
+
472
+ const configFileValues = loadConfigFile(options.configFilePath);
473
+
474
+ const cliOverrides: ConfigFile = {
475
+ projectUrl: options.projectUrl,
476
+ };
477
+
478
+ const tempProjectUrl =
479
+ cliOverrides.projectUrl ?? configFileValues.projectUrl;
480
+
481
+ let readmeOverrides: ConfigFile = {};
482
+ if (tempProjectUrl) {
483
+ const readme = await fetchProjectReadme(tempProjectUrl, token);
484
+ if (readme) {
485
+ readmeOverrides = parseProjectReadmeConfig(readme, tempProjectUrl);
486
+ }
487
+ }
488
+
489
+ const config = mergeConfigs(
490
+ configFileValues,
491
+ cliOverrides,
492
+ readmeOverrides,
493
+ );
494
+
495
+ const projectUrl = config.projectUrl;
496
+
497
+ if (!projectUrl) {
498
+ console.error(
499
+ 'projectUrl is required. Provide via --projectUrl, config file, or project README.',
500
+ );
501
+ process.exit(1);
502
+ }
503
+
504
+ const projectName = config.projectName ?? 'default';
505
+ const localStorageRepository = new LocalStorageRepository();
506
+ const cachePath = `./tmp/cache/${projectName}`;
507
+ const localStorageCacheRepository = new LocalStorageCacheRepository(
508
+ localStorageRepository,
509
+ cachePath,
510
+ );
511
+ const githubRepositoryParams = buildGithubRepositoryParams(
512
+ localStorageRepository,
513
+ token,
514
+ );
515
+ const projectRepository = new GraphqlProjectRepository(
516
+ ...githubRepositoryParams,
517
+ );
518
+ const apiV3IssueRepository = new ApiV3IssueRepository(
519
+ ...githubRepositoryParams,
520
+ );
521
+ const restIssueRepository = new RestIssueRepository(
522
+ ...githubRepositoryParams,
523
+ );
524
+ const graphqlProjectItemRepository = new GraphqlProjectItemRepository(
525
+ ...githubRepositoryParams,
526
+ );
527
+ const issueRepository = new ApiV3CheerioRestIssueRepository(
528
+ apiV3IssueRepository,
529
+ restIssueRepository,
530
+ graphqlProjectItemRepository,
531
+ localStorageCacheRepository,
532
+ ...githubRepositoryParams,
533
+ );
534
+
535
+ const useCase = new CheckIssueReviewReadinessUseCase(
536
+ projectRepository,
537
+ issueRepository,
538
+ );
539
+
540
+ const result = await useCase.run({
541
+ projectUrl,
542
+ issueUrl: options.issueUrl,
543
+ });
544
+
545
+ process.stdout.write(`${JSON.stringify(result)}\n`);
546
+ });
547
+
447
548
  /* istanbul ignore next */
448
549
  if (process.argv && require.main === module) {
449
550
  program.parse(process.argv);
@@ -0,0 +1,196 @@
1
+ import { CheckIssueReviewReadinessUseCase } from './CheckIssueReviewReadinessUseCase';
2
+ import { Issue } from '../entities/Issue';
3
+ import { Project } from '../entities/Project';
4
+ import { RelatedPullRequest } from './adapter-interfaces/IssueRepository';
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
+ const createMockIssue = (overrides: Partial<Issue> = {}): Issue => ({
33
+ nameWithOwner: 'user/repo',
34
+ number: 1,
35
+ title: 'Test Issue',
36
+ state: 'OPEN',
37
+ status: 'Preparation',
38
+ story: null,
39
+ nextActionDate: null,
40
+ nextActionHour: null,
41
+ estimationMinutes: null,
42
+ dependedIssueUrls: [],
43
+ completionDate50PercentConfidence: null,
44
+ url: 'https://github.com/user/repo/issues/1',
45
+ assignees: [],
46
+ labels: [],
47
+ org: 'user',
48
+ repo: 'repo',
49
+ body: '',
50
+ itemId: 'item-1',
51
+ isPr: false,
52
+ isInProgress: false,
53
+ isClosed: false,
54
+ createdAt: new Date('2000-01-01T00:00:00Z'),
55
+ author: 'test-user',
56
+ ...overrides,
57
+ });
58
+
59
+ const createReadyPr = (
60
+ overrides: Partial<RelatedPullRequest> = {},
61
+ ): RelatedPullRequest => ({
62
+ url: 'https://github.com/user/repo/pull/1',
63
+ branchName: 'feature-branch',
64
+ createdAt: new Date('2000-01-01T00:00:00Z'),
65
+ isDraft: false,
66
+ isConflicted: false,
67
+ isPassedAllCiJob: true,
68
+ isCiStateSuccess: true,
69
+ isResolvedAllReviewComments: true,
70
+ isBranchOutOfDate: false,
71
+ missingRequiredCheckNames: [],
72
+ ...overrides,
73
+ });
74
+
75
+ describe('CheckIssueReviewReadinessUseCase', () => {
76
+ let mockProjectRepository: { getByUrl: jest.Mock };
77
+ let mockIssueRepository: {
78
+ get: jest.Mock;
79
+ findRelatedOpenPRs: jest.Mock;
80
+ getOpenPullRequest: jest.Mock;
81
+ };
82
+ let useCase: CheckIssueReviewReadinessUseCase;
83
+ let mockProject: Project;
84
+
85
+ beforeEach(() => {
86
+ jest.resetAllMocks();
87
+
88
+ mockProject = createMockProject();
89
+
90
+ mockProjectRepository = {
91
+ getByUrl: jest.fn(),
92
+ };
93
+
94
+ mockIssueRepository = {
95
+ get: jest.fn(),
96
+ findRelatedOpenPRs: jest.fn(),
97
+ getOpenPullRequest: jest.fn(),
98
+ };
99
+
100
+ useCase = new CheckIssueReviewReadinessUseCase(
101
+ mockProjectRepository,
102
+ mockIssueRepository,
103
+ );
104
+ });
105
+
106
+ describe('run', () => {
107
+ it('should return reviewReady=true with empty rejections when the linked PR is ready', async () => {
108
+ const issue = createMockIssue();
109
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
110
+ mockIssueRepository.get.mockResolvedValue(issue);
111
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
112
+ createReadyPr(),
113
+ ]);
114
+
115
+ const result = await useCase.run({
116
+ projectUrl: 'https://github.com/users/user/projects/1',
117
+ issueUrl: 'https://github.com/user/repo/issues/1',
118
+ });
119
+
120
+ expect(result.reviewReady).toBe(true);
121
+ expect(result.rejections).toEqual([]);
122
+ });
123
+
124
+ it('should return reviewReady=false with rejections when the linked PR has failing CI', async () => {
125
+ const issue = createMockIssue();
126
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
127
+ mockIssueRepository.get.mockResolvedValue(issue);
128
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
129
+ createReadyPr({
130
+ isPassedAllCiJob: false,
131
+ isCiStateSuccess: false,
132
+ }),
133
+ ]);
134
+
135
+ const result = await useCase.run({
136
+ projectUrl: 'https://github.com/users/user/projects/1',
137
+ issueUrl: 'https://github.com/user/repo/issues/1',
138
+ });
139
+
140
+ expect(result.reviewReady).toBe(false);
141
+ expect(result.rejections).toHaveLength(1);
142
+ expect(result.rejections[0].type).toBe(
143
+ 'ANY_CI_JOB_FAILED_OR_IN_PROGRESS',
144
+ );
145
+ expect(result.rejections[0].detail).toContain(
146
+ 'https://github.com/user/repo/pull/1',
147
+ );
148
+ });
149
+
150
+ it('should return reviewReady=false with PULL_REQUEST_NOT_FOUND when no related PR exists', async () => {
151
+ const issue = createMockIssue();
152
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
153
+ mockIssueRepository.get.mockResolvedValue(issue);
154
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
155
+
156
+ const result = await useCase.run({
157
+ projectUrl: 'https://github.com/users/user/projects/1',
158
+ issueUrl: 'https://github.com/user/repo/issues/1',
159
+ });
160
+
161
+ expect(result.reviewReady).toBe(false);
162
+ expect(result.rejections).toEqual([
163
+ { type: 'PULL_REQUEST_NOT_FOUND', detail: 'PULL_REQUEST_NOT_FOUND' },
164
+ ]);
165
+ });
166
+
167
+ it('should throw IssueNotFoundError when the issue does not exist', async () => {
168
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
169
+ mockIssueRepository.get.mockResolvedValue(null);
170
+
171
+ await expect(
172
+ useCase.run({
173
+ projectUrl: 'https://github.com/users/user/projects/1',
174
+ issueUrl: 'https://github.com/user/repo/issues/999',
175
+ }),
176
+ ).rejects.toThrow(
177
+ 'Issue not found: https://github.com/user/repo/issues/999',
178
+ );
179
+ });
180
+
181
+ it('should not call findRelatedOpenPRs nor mutate state when issue has a category label other than e2e', async () => {
182
+ const issue = createMockIssue({ labels: ['category:frontend'] });
183
+ mockProjectRepository.getByUrl.mockResolvedValue(mockProject);
184
+ mockIssueRepository.get.mockResolvedValue(issue);
185
+
186
+ const result = await useCase.run({
187
+ projectUrl: 'https://github.com/users/user/projects/1',
188
+ issueUrl: 'https://github.com/user/repo/issues/1',
189
+ });
190
+
191
+ expect(mockIssueRepository.findRelatedOpenPRs).not.toHaveBeenCalled();
192
+ expect(result.reviewReady).toBe(true);
193
+ expect(result.rejections).toEqual([]);
194
+ });
195
+ });
196
+ });
@@ -0,0 +1,45 @@
1
+ import { IssueRepository } from './adapter-interfaces/IssueRepository';
2
+ import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
3
+ import {
4
+ IssueRejectionEvaluator,
5
+ PrRejectedReasonType,
6
+ } from './IssueRejectionEvaluator';
7
+ import { IssueNotFoundError } from './NotifyFinishedIssuePreparationUseCase';
8
+
9
+ export type IssueReviewReadinessResult = {
10
+ reviewReady: boolean;
11
+ rejections: { type: PrRejectedReasonType; detail: string }[];
12
+ };
13
+
14
+ export class CheckIssueReviewReadinessUseCase {
15
+ private readonly issueRejectionEvaluator: IssueRejectionEvaluator;
16
+
17
+ constructor(
18
+ private readonly projectRepository: Pick<ProjectRepository, 'getByUrl'>,
19
+ private readonly issueRepository: Pick<
20
+ IssueRepository,
21
+ 'get' | 'findRelatedOpenPRs' | 'getOpenPullRequest'
22
+ >,
23
+ ) {
24
+ this.issueRejectionEvaluator = new IssueRejectionEvaluator(issueRepository);
25
+ }
26
+
27
+ run = async (params: {
28
+ projectUrl: string;
29
+ issueUrl: string;
30
+ }): Promise<IssueReviewReadinessResult> => {
31
+ const project = await this.projectRepository.getByUrl(params.projectUrl);
32
+ const issue = await this.issueRepository.get(params.issueUrl, project);
33
+
34
+ if (!issue) {
35
+ throw new IssueNotFoundError(params.issueUrl);
36
+ }
37
+
38
+ const { rejections } = await this.issueRejectionEvaluator.evaluate(issue);
39
+
40
+ return {
41
+ reviewReady: rejections.length === 0,
42
+ rejections,
43
+ };
44
+ };
45
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,YAAY,EACZ,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AA6DzB,eAAO,MAAM,OAAO,SAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/adapter/entry-points/cli/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EACL,UAAU,EACV,cAAc,EACd,wBAAwB,EACxB,YAAY,EACZ,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAoEzB,eAAO,MAAM,OAAO,SAAgB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { IssueRepository } from './adapter-interfaces/IssueRepository';
2
+ import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
3
+ import { PrRejectedReasonType } from './IssueRejectionEvaluator';
4
+ export type IssueReviewReadinessResult = {
5
+ reviewReady: boolean;
6
+ rejections: {
7
+ type: PrRejectedReasonType;
8
+ detail: string;
9
+ }[];
10
+ };
11
+ export declare class CheckIssueReviewReadinessUseCase {
12
+ private readonly projectRepository;
13
+ private readonly issueRepository;
14
+ private readonly issueRejectionEvaluator;
15
+ constructor(projectRepository: Pick<ProjectRepository, 'getByUrl'>, issueRepository: Pick<IssueRepository, 'get' | 'findRelatedOpenPRs' | 'getOpenPullRequest'>);
16
+ run: (params: {
17
+ projectUrl: string;
18
+ issueUrl: string;
19
+ }) => Promise<IssueReviewReadinessResult>;
20
+ }
21
+ //# sourceMappingURL=CheckIssueReviewReadinessUseCase.d.ts.map
@@ -0,0 +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,EACf,KAAK,GAAG,oBAAoB,GAAG,oBAAoB,CACpD;IAKH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,KAAG,OAAO,CAAC,0BAA0B,CAAC,CAcrC;CACH"}