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 +7 -0
- package/README.md +12 -0
- package/bin/adapter/entry-points/cli/index.js +48 -0
- package/bin/adapter/entry-points/cli/index.js.map +1 -1
- package/bin/domain/usecases/CheckIssueReviewReadinessUseCase.js +26 -0
- package/bin/domain/usecases/CheckIssueReviewReadinessUseCase.js.map +1 -0
- package/package.json +1 -1
- package/src/adapter/entry-points/cli/index.test.ts +189 -0
- package/src/adapter/entry-points/cli/index.ts +101 -0
- package/src/domain/usecases/CheckIssueReviewReadinessUseCase.test.ts +196 -0
- package/src/domain/usecases/CheckIssueReviewReadinessUseCase.ts +45 -0
- package/types/adapter/entry-points/cli/index.d.ts.map +1 -1
- package/types/domain/usecases/CheckIssueReviewReadinessUseCase.d.ts +21 -0
- package/types/domain/usecases/CheckIssueReviewReadinessUseCase.d.ts.map +1 -0
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
|
@@ -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;
|
|
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"}
|