github-issue-tower-defence-management 1.104.0 → 1.104.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +83 -58
  3. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  4. package/bin/domain/usecases/HandleScheduledEventUseCase.js +7 -2
  5. package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -1
  6. package/bin/domain/usecases/IssueRejectionEvaluator.js +21 -2
  7. package/bin/domain/usecases/IssueRejectionEvaluator.js.map +1 -1
  8. package/bin/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.js +36 -6
  9. package/bin/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.js.map +1 -1
  10. package/bin/domain/usecases/StartPreparationUseCase.js +2 -1
  11. package/bin/domain/usecases/StartPreparationUseCase.js.map +1 -1
  12. package/bin/domain/usecases/resolveAllowedIssueAuthors.js +8 -0
  13. package/bin/domain/usecases/resolveAllowedIssueAuthors.js.map +1 -0
  14. package/package.json +1 -1
  15. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.test.ts +36 -0
  16. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +23 -1
  17. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +109 -0
  18. package/src/domain/usecases/HandleScheduledEventUseCase.ts +8 -2
  19. package/src/domain/usecases/IssueRejectionEvaluator.test.ts +182 -0
  20. package/src/domain/usecases/IssueRejectionEvaluator.ts +35 -1
  21. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.test.ts +303 -75
  22. package/src/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.ts +42 -7
  23. package/src/domain/usecases/StartPreparationUseCase.test.ts +202 -88
  24. package/src/domain/usecases/StartPreparationUseCase.ts +2 -1
  25. package/src/domain/usecases/resolveAllowedIssueAuthors.test.ts +51 -0
  26. package/src/domain/usecases/resolveAllowedIssueAuthors.ts +6 -0
  27. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  28. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +1 -0
  29. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -1
  30. package/types/domain/usecases/IssueRejectionEvaluator.d.ts +5 -1
  31. package/types/domain/usecases/IssueRejectionEvaluator.d.ts.map +1 -1
  32. package/types/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.d.ts +1 -0
  33. package/types/domain/usecases/RevertNotReadyReviewQueueIssueUseCase.d.ts.map +1 -1
  34. package/types/domain/usecases/StartPreparationUseCase.d.ts.map +1 -1
  35. package/types/domain/usecases/resolveAllowedIssueAuthors.d.ts +5 -0
  36. package/types/domain/usecases/resolveAllowedIssueAuthors.d.ts.map +1 -0
@@ -1,3 +1,4 @@
1
+ import { Issue } from '../entities/Issue';
1
2
  import { IssueRepository } from './adapter-interfaces/IssueRepository';
2
3
  import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
3
4
  import { IssueCommentRepository } from './adapter-interfaces/IssueCommentRepository';
@@ -9,17 +10,15 @@ import {
9
10
  DEFAULT_STATUS_NAME,
10
11
  } from '../entities/WorkflowStatus';
11
12
 
12
- const DEPENDENCY_UPDATE_BOT_AUTHORS = ['dependabot[bot]', 'renovate[bot]'];
13
-
14
13
  const isAuthorAuthorizedForAutoStatusCheck = (
15
14
  author: string,
16
- allowedIssueAuthors: string[] | null,
15
+ allowedIssueAuthors: string[] | null | undefined,
17
16
  ): boolean => {
18
- if (DEPENDENCY_UPDATE_BOT_AUTHORS.includes(author)) {
19
- return true;
17
+ if (allowedIssueAuthors === null || allowedIssueAuthors === undefined) {
18
+ return false;
20
19
  }
21
- if (allowedIssueAuthors === null) {
22
- return true;
20
+ if (allowedIssueAuthors.length === 0) {
21
+ return false;
23
22
  }
24
23
  return allowedIssueAuthors.includes(author);
25
24
  };
@@ -92,6 +91,9 @@ export class RevertNotReadyReviewQueueIssueUseCase {
92
91
  (issue) => issue.status === AWAITING_QUALITY_CHECK_STATUS_NAME,
93
92
  );
94
93
 
94
+ const relatedOpenPrUrlsByIssueUrl =
95
+ this.buildRelatedOpenPrUrlsByIssueUrl(issues);
96
+
95
97
  for (const issue of awaitingQualityCheckIssues) {
96
98
  const hasLlmAgentLabel = issue.labels.some(
97
99
  (l) => l === 'llm-agent' || l.startsWith('llm-agent:'),
@@ -110,6 +112,9 @@ export class RevertNotReadyReviewQueueIssueUseCase {
110
112
  await this.issueRejectionEvaluator.evaluate(
111
113
  issue,
112
114
  params.labelsAsLlmAgentName ?? [],
115
+ {
116
+ relatedOpenPrUrls: relatedOpenPrUrlsByIssueUrl.get(issue.url) ?? [],
117
+ },
113
118
  );
114
119
  if (rejections.length > 0) {
115
120
  await this.issueRepository.updateStatus(
@@ -177,4 +182,34 @@ export class RevertNotReadyReviewQueueIssueUseCase {
177
182
  }
178
183
  }
179
184
  };
185
+
186
+ // Derives, for each issue, the set of open pull request URLs that reference it
187
+ // via a closing keyword. The linkage is taken from each open PR item's
188
+ // closingIssueReferenceUrls (populated in bulk by fetchProjectItems), the same
189
+ // in-memory derivation SetDependedIssueUrlForOpenTaskPRsUseCase uses. This
190
+ // replaces the per-issue findRelatedOpenPRs timeline query in the
191
+ // review-readiness sweep with a single in-memory pass over the bulk items.
192
+ private buildRelatedOpenPrUrlsByIssueUrl = (
193
+ issues: Issue[],
194
+ ): Map<string, string[]> => {
195
+ const openPrUrlsByIssueUrl = new Map<string, Set<string>>();
196
+ for (const issue of issues) {
197
+ if (!issue.isPr || issue.isClosed) {
198
+ continue;
199
+ }
200
+ for (const referencedIssueUrl of issue.closingIssueReferenceUrls) {
201
+ const existing = openPrUrlsByIssueUrl.get(referencedIssueUrl);
202
+ if (existing) {
203
+ existing.add(issue.url);
204
+ } else {
205
+ openPrUrlsByIssueUrl.set(referencedIssueUrl, new Set([issue.url]));
206
+ }
207
+ }
208
+ }
209
+ const result = new Map<string, string[]>();
210
+ for (const [issueUrl, prUrls] of openPrUrlsByIssueUrl) {
211
+ result.set(issueUrl, Array.from(prUrls));
212
+ }
213
+ return result;
214
+ };
180
215
  }