github-issue-tower-defence-management 1.52.0 → 1.53.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.
Files changed (34) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +45 -31
  3. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -1
  4. package/bin/adapter/repositories/GraphqlProjectRepository.js +31 -9
  5. package/bin/adapter/repositories/GraphqlProjectRepository.js.map +1 -1
  6. package/bin/domain/usecases/HandleScheduledEventUseCase.js +8 -1
  7. package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -1
  8. package/bin/domain/usecases/IssueRejectionEvaluator.js +80 -0
  9. package/bin/domain/usecases/IssueRejectionEvaluator.js.map +1 -0
  10. package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js +4 -67
  11. package/bin/domain/usecases/NotifyFinishedIssuePreparationUseCase.js.map +1 -1
  12. package/bin/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.js +42 -0
  13. package/bin/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.js.map +1 -0
  14. package/package.json +1 -1
  15. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +8 -0
  16. package/src/adapter/repositories/GraphqlProjectRepository.fetchProjectId.test.ts +251 -0
  17. package/src/adapter/repositories/GraphqlProjectRepository.ts +54 -25
  18. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +58 -0
  19. package/src/domain/usecases/HandleScheduledEventUseCase.ts +11 -0
  20. package/src/domain/usecases/IssueRejectionEvaluator.ts +114 -0
  21. package/src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts +15 -89
  22. package/src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.test.ts +376 -0
  23. package/src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts +88 -0
  24. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -1
  25. package/types/adapter/repositories/GraphqlProjectRepository.d.ts +2 -0
  26. package/types/adapter/repositories/GraphqlProjectRepository.d.ts.map +1 -1
  27. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +6 -1
  28. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -1
  29. package/types/domain/usecases/IssueRejectionEvaluator.d.ts +20 -0
  30. package/types/domain/usecases/IssueRejectionEvaluator.d.ts.map +1 -0
  31. package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts +1 -1
  32. package/types/domain/usecases/NotifyFinishedIssuePreparationUseCase.d.ts.map +1 -1
  33. package/types/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.d.ts +15 -0
  34. package/types/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.d.ts.map +1 -0
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NotifyFinishedIssuePreparationUseCase = exports.IllegalIssueStatusError = exports.IssueNotFoundError = void 0;
4
4
  const WorkflowStatus_1 = require("../entities/WorkflowStatus");
5
+ const IssueRejectionEvaluator_1 = require("./IssueRejectionEvaluator");
5
6
  class IssueNotFoundError extends Error {
6
7
  constructor(issueUrl) {
7
8
  super(`Issue not found: ${issueUrl}`);
@@ -115,7 +116,6 @@ class NotifyFinishedIssuePreparationUseCase {
115
116
  };
116
117
  this.collectRejections = async (issue, comments) => {
117
118
  const rejections = [];
118
- let approvedPrUrl = null;
119
119
  const lastComment = comments[comments.length - 1];
120
120
  if (!lastComment || !lastComment.content.startsWith('From:')) {
121
121
  rejections.push({
@@ -129,72 +129,8 @@ class NotifyFinishedIssuePreparationUseCase {
129
129
  detail: 'REPORT_HAS_NEXT_STEP',
130
130
  });
131
131
  }
132
- const categoryLabels = issue.labels.filter((label) => label.startsWith('category:'));
133
- const hasLlmAgentLabel = issue.labels.some((l) => l === 'llm-agent' || l.startsWith('llm-agent:'));
134
- if (!hasLlmAgentLabel &&
135
- (categoryLabels.length <= 0 || categoryLabels.includes('category:e2e'))) {
136
- const prsToCheck = issue.isPr
137
- ? await this.resolveOpenPrsForPrItem(issue.url)
138
- : await this.issueRepository.findRelatedOpenPRs(issue.url);
139
- if (prsToCheck.length <= 0) {
140
- rejections.push({
141
- type: 'PULL_REQUEST_NOT_FOUND',
142
- detail: 'PULL_REQUEST_NOT_FOUND',
143
- });
144
- }
145
- else if (prsToCheck.length > 1) {
146
- rejections.push({
147
- type: 'MULTIPLE_PULL_REQUESTS_FOUND',
148
- detail: `MULTIPLE_PULL_REQUESTS_FOUND: ${prsToCheck.map((pr) => pr.url).join(', ')}`,
149
- });
150
- }
151
- else {
152
- const pr = prsToCheck[0];
153
- if (pr.isConflicted) {
154
- rejections.push({
155
- type: 'PULL_REQUEST_CONFLICTED',
156
- detail: `PULL_REQUEST_CONFLICTED: ${pr.url}`,
157
- });
158
- }
159
- if (!pr.isPassedAllCiJob) {
160
- const missingChecks = pr.missingRequiredCheckNames;
161
- const missingSuffix = missingChecks.length > 0
162
- ? ` (missing: ${missingChecks.join(', ')})`
163
- : '';
164
- if (pr.isCiStateSuccess && missingChecks.length > 0) {
165
- rejections.push({
166
- type: 'REQUIRED_CI_JOB_NEVER_STARTED',
167
- detail: `REQUIRED_CI_JOB_NEVER_STARTED: ${pr.url}${missingSuffix}`,
168
- });
169
- }
170
- else {
171
- rejections.push({
172
- type: 'ANY_CI_JOB_FAILED_OR_IN_PROGRESS',
173
- detail: `ANY_CI_JOB_FAILED_OR_IN_PROGRESS: ${pr.url}${missingSuffix}`,
174
- });
175
- }
176
- }
177
- if (!pr.isResolvedAllReviewComments) {
178
- rejections.push({
179
- type: 'ANY_REVIEW_COMMENT_NOT_RESOLVED',
180
- detail: `ANY_REVIEW_COMMENT_NOT_RESOLVED: ${pr.url}`,
181
- });
182
- }
183
- if (!pr.isConflicted &&
184
- pr.isPassedAllCiJob &&
185
- pr.isResolvedAllReviewComments) {
186
- approvedPrUrl = pr.url;
187
- }
188
- }
189
- }
190
- return { rejections, approvedPrUrl };
191
- };
192
- this.resolveOpenPrsForPrItem = async (prUrl) => {
193
- const pr = await this.issueRepository.getOpenPullRequest(prUrl);
194
- if (pr === null) {
195
- return [];
196
- }
197
- return [pr];
132
+ const { rejections: prRejections, approvedPrUrl } = await this.issueRejectionEvaluator.evaluate(issue);
133
+ return { rejections: [...rejections, ...prRejections], approvedPrUrl };
198
134
  };
199
135
  this.reportBodyHasNextStep = (body) => {
200
136
  const reportMatch = body.match(/```json\n([\s\S]*?)\n```/);
@@ -244,6 +180,7 @@ class NotifyFinishedIssuePreparationUseCase {
244
180
  console.warn('Failed to send workflow blocker notification:', error);
245
181
  }
246
182
  };
183
+ this.issueRejectionEvaluator = new IssueRejectionEvaluator_1.IssueRejectionEvaluator(issueRepository);
247
184
  }
248
185
  }
249
186
  exports.NotifyFinishedIssuePreparationUseCase = NotifyFinishedIssuePreparationUseCase;
@@ -1 +1 @@
1
- {"version":3,"file":"NotifyFinishedIssuePreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"NotifyFinishedIssuePreparationUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":";;;AAIA,+DAKoC;AACpC,uEAGmC;AAEnC,MAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,QAAgB;QAC1B,KAAK,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AALD,gDAKC;AACD,MAAa,uBAAwB,SAAQ,KAAK;IAChD,YACE,QAAgB,EAChB,aAA4B,EAC5B,cAA6B;QAE7B,KAAK,CACH,4BAA4B,QAAQ,cAAc,cAAc,aAAa,aAAa,EAAE,CAC7F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAXD,0DAWC;AAMD,MAAa,qCAAqC;IAGhD,YACmB,iBAAsD,EACtD,eAShB,EACgB,sBAGhB,EACgB,iBAGhB;QAlBgB,sBAAiB,GAAjB,iBAAiB,CAAqC;QACtD,oBAAe,GAAf,eAAe,CAS/B;QACgB,2BAAsB,GAAtB,sBAAsB,CAGtC;QACgB,sBAAiB,GAAjB,iBAAiB,CAGjC;QAKH,QAAG,GAAG,KAAK,EAAE,MAKZ,EAAiB,EAAE;YAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAEzE,MAAM,6BAA6B,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAChE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,+CAA8B,CACjD,CAAC;YACF,IAAI,CAAC,6BAA6B,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CACX,qCAAqC,+CAA8B,yBAAyB,CAC7F,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,gCAAgC,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CACnE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mDAAkC,CACrD,CAAC;YACF,IAAI,CAAC,gCAAgC,EAAE,CAAC;gBACtC,OAAO,CAAC,KAAK,CACX,yCAAyC,mDAAkC,yBAAyB,CACrG,CAAC;gBACF,OAAO;YACT,CAAC;YACD,MAAM,6BAA6B,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAChE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,+CAA8B,CACjD,CAAC;YACF,IAAI,CAAC,6BAA6B,EAAE,CAAC;gBACnC,OAAO,CAAC,KAAK,CACX,qCAAqC,+CAA8B,yBAAyB,CAC7F,CAAC;gBACF,OAAO;YACT,CAAC;YAED,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,kBAAkB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAChD,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,KAAK,wCAAuB,EAAE,CAAC;gBACpD,MAAM,IAAI,uBAAuB,CAC/B,MAAM,CAAC,QAAQ,EACf,KAAK,CAAC,MAAM,EACZ,wCAAuB,CACxB,CAAC;YACJ,CAAC;YAED,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzC,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CACjE,OAAO,EACP,CAAC,CACF,CAAC;oBACF,KAAK,MAAM,WAAW,IAAI,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;wBAClD,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAC/C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAC3B,CAAC;wBACF,IAAI,iBAAiB,EAAE,CAAC;4BACtB,KAAK,CAAC,iBAAiB,GAAG,iBAAiB,CAAC,iBAAiB,CAAC;4BAC9D,MAAM;wBACR,CAAC;oBACH,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,IAAI,CACV,2DAA2D,EAC3D,KAAK,CACN,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,IAAI,KAAK,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvC,KAAK,CAAC,MAAM,GAAG,+CAA8B,CAAC;gBAC9C,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CACrC,OAAO,EACP,KAAK,EACL,6BAA6B,CAAC,EAAE,CACjC,CAAC;gBACF,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAC7C,KAAK,EACL,mCAAmC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxE,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,IAAI,KAAK,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;gBACnE,KAAK,CAAC,MAAM,GAAG,+CAA8B,CAAC;gBAC9C,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CACrC,OAAO,EACP,KAAK,EACL,6BAA6B,CAAC,EAAE,CACjC,CAAC;gBACF,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAC7C,KAAK,EACL,0DAA0D,KAAK,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,MAAM,oBAAoB,KAAK,CAAC,cAAc,IAAI,MAAM,EAAE,CAC5J,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GACZ,MAAM,IAAI,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;YAEhE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAChE,KAAK,EACL,QAAQ,CACT,CAAC;YAEF,MAAM,sBAAsB,GAC1B,UAAU,CAAC,MAAM,GAAG,CAAC;gBACnB,CAAC,CAAC,gCAAgC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACrF,CAAC,CAAC,6BAA6B,CAAC;YAEpC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CACvC,CAAC,MAAM,CAAC,sBAAsB,GAAG,CAAC,CACnC,CAAC;YACF,IACE,kBAAkB,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CACpC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,6BAA6B,CAAC,CAC1D,CAAC,MAAM,IAAI,MAAM,CAAC,sBAAsB;gBACzC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CACnC,OAAO,CAAC,OAAO;qBACZ,WAAW,EAAE;qBACb,QAAQ,CAAC,wCAAwC,CAAC,CACtD,EACD,CAAC;gBACD,KAAK,CAAC,MAAM,GAAG,+CAA8B,CAAC;gBAC9C,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CACrC,OAAO,EACP,KAAK,EACL,6BAA6B,CAAC,EAAE,CACjC,CAAC;gBACF,MAAM,oBAAoB,GACxB,UAAU,CAAC,MAAM,GAAG,CAAC;oBACnB,CAAC,CAAC,sBAAsB;oBACxB,CAAC,CAAC,+DAA+D,CAAC;gBACtE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;oBACtD,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBACzD,CAAC;gBACD,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAC7C,KAAK,EACL,GAAG,oBAAoB,kDAAkD,MAAM,CAAC,sBAAsB,QAAQ,CAC/G,CAAC;gBACF,MAAM,IAAI,CAAC,+BAA+B,CACxC,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,iCAAiC,EACxC,OAAO,CACR,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBAC3B,KAAK,CAAC,MAAM,GAAG,mDAAkC,CAAC;gBAClD,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAClD,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CACrC,OAAO,EACP,KAAK,EACL,gCAAgC,CAAC,EAAE,CACpC,CAAC;gBACF,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;oBAC3B,MAAM,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;gBACzD,CAAC;gBACD,MAAM,IAAI,CAAC,+BAA+B,CACxC,MAAM,CAAC,QAAQ,EACf,MAAM,CAAC,iCAAiC,EACxC,OAAO,CACR,CAAC;gBACF,OAAO;YACT,CAAC;YAED,KAAK,CAAC,MAAM,GAAG,+CAA8B,CAAC;YAC9C,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CACrC,OAAO,EACP,KAAK,EACL,6BAA6B,CAAC,EAAE,CACjC,CAAC;YAEF,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAC7C,KAAK,EACL,sBAAsB,CACvB,CAAC;QACJ,CAAC,CAAC;QAEM,sBAAiB,GAAG,KAAK,EAC/B,KAAuD,EACvD,QAA+B,EAI9B,EAAE;YACH,MAAM,UAAU,GAAmD,EAAE,CAAC;YAEtE,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAClD,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC7D,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,0BAA0B;oBAChC,MAAM,EAAE,0BAA0B;iBACnC,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3D,UAAU,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,sBAAsB;oBAC5B,MAAM,EAAE,sBAAsB;iBAC/B,CAAC,CAAC;YACL,CAAC;YAED,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,GAC/C,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrD,OAAO,EAAE,UAAU,EAAE,CAAC,GAAG,UAAU,EAAE,GAAG,YAAY,CAAC,EAAE,aAAa,EAAE,CAAC;QACzE,CAAC,CAAC;QAEM,0BAAqB,GAAG,CAAC,IAAY,EAAW,EAAE;YACxD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC3D,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3C,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,UAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CACV,sDAAsD,EACtD,KAAK,CACN,CAAC;gBACF,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;gBAC1D,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,CAAC,CAAC,UAAU,IAAI,UAAU,CAAC,EAAE,CAAC;gBAChC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAC1D,OAAO,aAAa,KAAK,IAAI,IAAI,aAAa,KAAK,SAAS,CAAC;QAC/D,CAAC,CAAC;QAEM,wBAAmB,GAAG,KAAK,EACjC,KAAa,EACb,OAA8C,EAC/B,EAAE;YACjB,MAAM,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC;YAClC,cAAc,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAC7C,KAAK,EACL,OAAO,EACP,cAAc,CACf,CAAC;QACJ,CAAC,CAAC;QAEM,oCAA+B,GAAG,KAAK,EAC7C,QAAgB,EAChB,kBAAiC,EACjC,OAA4D,EAC7C,EAAE;YACjB,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,iBAAiB,CACjE,OAAO,EACP,CAAC,CACF,CAAC;gBAEF,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CACjE,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE,CAC3B,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;oBACpD,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,QAAQ,CAAC,CAC7D,CAAC;gBAEF,IAAI,CAAC,iBAAiB,EAAE,CAAC;oBACvB,OAAO;gBACT,CAAC;gBAED,MAAM,OAAO,GAAG,8BAA8B,QAAQ,EAAE,CAAC;gBACzD,MAAM,UAAU,GAAG,kBAAkB;qBAClC,OAAO,CAAC,OAAO,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC;qBAC9C,OAAO,CAAC,WAAW,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC;gBAErD,MAAM,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;YAC1D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;YACvE,CAAC;QACH,CAAC,CAAC;QAhSA,IAAI,CAAC,uBAAuB,GAAG,IAAI,iDAAuB,CAAC,eAAe,CAAC,CAAC;IAC9E,CAAC;CAgSF;AAzTD,sFAyTC"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RevertNotReadyAwaitingQualityCheckUseCase = void 0;
4
+ const IssueRejectionEvaluator_1 = require("./IssueRejectionEvaluator");
5
+ const WorkflowStatus_1 = require("../entities/WorkflowStatus");
6
+ class RevertNotReadyAwaitingQualityCheckUseCase {
7
+ constructor(projectRepository, issueRepository, issueCommentRepository) {
8
+ this.projectRepository = projectRepository;
9
+ this.issueRepository = issueRepository;
10
+ this.issueCommentRepository = issueCommentRepository;
11
+ this.run = async (params) => {
12
+ const projectId = await this.projectRepository.findProjectIdByUrl(params.projectUrl);
13
+ if (!projectId) {
14
+ throw new Error(`Project not found. projectUrl: ${params.projectUrl}`);
15
+ }
16
+ const project = await this.projectRepository.getProject(projectId);
17
+ if (!project) {
18
+ throw new Error(`Project not found. projectId: ${projectId} projectUrl: ${params.projectUrl}`);
19
+ }
20
+ const awaitingWorkspaceStatusOption = project.status.statuses.find((s) => s.name === WorkflowStatus_1.AWAITING_WORKSPACE_STATUS_NAME);
21
+ if (!awaitingWorkspaceStatusOption) {
22
+ return;
23
+ }
24
+ const { issues } = await this.issueRepository.getAllIssues(projectId, params.allowIssueCacheMinutes);
25
+ const awaitingQualityCheckIssues = issues.filter((issue) => issue.status === WorkflowStatus_1.AWAITING_QUALITY_CHECK_STATUS_NAME);
26
+ for (const issue of awaitingQualityCheckIssues) {
27
+ const hasLlmAgentLabel = issue.labels.some((l) => l === 'llm-agent' || l.startsWith('llm-agent:'));
28
+ if (hasLlmAgentLabel) {
29
+ continue;
30
+ }
31
+ const { rejections } = await this.issueRejectionEvaluator.evaluate(issue);
32
+ if (rejections.length > 0) {
33
+ await this.issueRepository.updateStatus(project, issue, awaitingWorkspaceStatusOption.id);
34
+ await this.issueCommentRepository.createComment(issue, `Auto Status Check: REJECTED\n${rejections.map((r) => `- ${r.detail}`).join('\n')}`);
35
+ }
36
+ }
37
+ };
38
+ this.issueRejectionEvaluator = new IssueRejectionEvaluator_1.IssueRejectionEvaluator(issueRepository);
39
+ }
40
+ }
41
+ exports.RevertNotReadyAwaitingQualityCheckUseCase = RevertNotReadyAwaitingQualityCheckUseCase;
42
+ //# sourceMappingURL=RevertNotReadyAwaitingQualityCheckUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RevertNotReadyAwaitingQualityCheckUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts"],"names":[],"mappings":";;;AAGA,uEAAoE;AACpE,+DAGoC;AAEpC,MAAa,yCAAyC;IAGpD,YACmB,iBAGhB,EACgB,eAMhB,EACgB,sBAGhB;QAdgB,sBAAiB,GAAjB,iBAAiB,CAGjC;QACgB,oBAAe,GAAf,eAAe,CAM/B;QACgB,2BAAsB,GAAtB,sBAAsB,CAGtC;QAKH,QAAG,GAAG,KAAK,EAAE,MAGZ,EAAiB,EAAE;YAClB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,CAC/D,MAAM,CAAC,UAAU,CAClB,CAAC;YACF,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,kCAAkC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,iCAAiC,SAAS,gBAAgB,MAAM,CAAC,UAAU,EAAE,CAC9E,CAAC;YACJ,CAAC;YAED,MAAM,6BAA6B,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAChE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,+CAA8B,CACjD,CAAC;YACF,IAAI,CAAC,6BAA6B,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;YAED,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CACxD,SAAS,EACT,MAAM,CAAC,sBAAsB,CAC9B,CAAC;YAEF,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,CAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,mDAAkC,CAC/D,CAAC;YAEF,KAAK,MAAM,KAAK,IAAI,0BAA0B,EAAE,CAAC;gBAC/C,MAAM,gBAAgB,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,WAAW,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CACvD,CAAC;gBACF,IAAI,gBAAgB,EAAE,CAAC;oBACrB,SAAS;gBACX,CAAC;gBAED,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC1E,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CACrC,OAAO,EACP,KAAK,EACL,6BAA6B,CAAC,EAAE,CACjC,CAAC;oBACF,MAAM,IAAI,CAAC,sBAAsB,CAAC,aAAa,CAC7C,KAAK,EACL,gCAAgC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACpF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QAzDA,IAAI,CAAC,uBAAuB,GAAG,IAAI,iDAAuB,CAAC,eAAe,CAAC,CAAC;IAC9E,CAAC;CAyDF;AA9ED,8FA8EC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.52.0",
3
+ "version": "1.53.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -36,6 +36,7 @@ import { StartPreparationUseCase } from '../../../domain/usecases/StartPreparati
36
36
  import { NodeLocalCommandRunner } from '../../repositories/NodeLocalCommandRunner';
37
37
  import { OauthAPIProxyClaudeRepository } from '../../repositories/OauthAPIProxyClaudeRepository';
38
38
  import { RevertOrphanedPreparationUseCase } from '../../../domain/usecases/RevertOrphanedPreparationUseCase';
39
+ import { RevertNotReadyAwaitingQualityCheckUseCase } from '../../../domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase';
39
40
  import { GitHubIssueCommentRepository } from '../../repositories/GitHubIssueCommentRepository';
40
41
  import { SetupTowerDefenceProjectUseCase } from '../../../domain/usecases/SetupTowerDefenceProjectUseCase';
41
42
  import {
@@ -232,6 +233,12 @@ export class HandleScheduledEventUseCaseHandler {
232
233
  issueCommentRepository,
233
234
  nodeLocalCommandRunner,
234
235
  );
236
+ const revertNotReadyAwaitingQualityCheckUseCase =
237
+ new RevertNotReadyAwaitingQualityCheckUseCase(
238
+ projectRepository,
239
+ issueRepository,
240
+ issueCommentRepository,
241
+ );
235
242
 
236
243
  const handleScheduledEventUseCase = new HandleScheduledEventUseCase(
237
244
  setupTowerDefenceProjectUseCase,
@@ -250,6 +257,7 @@ export class HandleScheduledEventUseCaseHandler {
250
257
  updateIssueStatusByLabelUseCase,
251
258
  startPreparationUseCase,
252
259
  revertOrphanedPreparationUseCase,
260
+ revertNotReadyAwaitingQualityCheckUseCase,
253
261
  systemDateRepository,
254
262
  googleSpreadsheetRepository,
255
263
  projectRepository,
@@ -0,0 +1,251 @@
1
+ const mockPost = jest.fn();
2
+
3
+ jest.mock('ky', () => ({
4
+ default: {
5
+ post: mockPost,
6
+ get: jest.fn(),
7
+ put: jest.fn(),
8
+ patch: jest.fn(),
9
+ delete: jest.fn(),
10
+ extend: jest.fn(),
11
+ create: jest.fn(),
12
+ stop: jest.fn(),
13
+ },
14
+ __esModule: true,
15
+ }));
16
+
17
+ import { GraphqlProjectRepository } from './GraphqlProjectRepository';
18
+ import { LocalStorageRepository } from './LocalStorageRepository';
19
+
20
+ const mockJsonResponse = <T>(data: T) => ({
21
+ json: jest.fn().mockResolvedValue(data),
22
+ });
23
+
24
+ describe('GraphqlProjectRepository.fetchProjectId', () => {
25
+ const localStorageRepository = new LocalStorageRepository();
26
+ let repository: GraphqlProjectRepository;
27
+
28
+ beforeEach(() => {
29
+ jest.useFakeTimers();
30
+ mockPost.mockReset();
31
+ repository = new GraphqlProjectRepository(localStorageRepository, '');
32
+ });
33
+
34
+ afterEach(() => {
35
+ jest.useRealTimers();
36
+ });
37
+
38
+ describe('user-owned project', () => {
39
+ it('should resolve project ID from user owner when organization returns null', async () => {
40
+ mockPost.mockReturnValueOnce(
41
+ mockJsonResponse({
42
+ data: {
43
+ organization: null,
44
+ user: {
45
+ projectV2: {
46
+ id: 'PVT_user123',
47
+ databaseId: 999,
48
+ },
49
+ },
50
+ },
51
+ }),
52
+ );
53
+
54
+ const result = await repository.fetchProjectId('some-user', 1);
55
+
56
+ expect(result).toBe('PVT_user123');
57
+ });
58
+
59
+ it('should resolve project ID from organization owner when user returns null', async () => {
60
+ mockPost.mockReturnValueOnce(
61
+ mockJsonResponse({
62
+ data: {
63
+ organization: {
64
+ projectV2: {
65
+ id: 'PVT_org456',
66
+ databaseId: 111,
67
+ },
68
+ },
69
+ user: null,
70
+ },
71
+ }),
72
+ );
73
+
74
+ const result = await repository.fetchProjectId('some-org', 2);
75
+
76
+ expect(result).toBe('PVT_org456');
77
+ });
78
+ });
79
+
80
+ describe('memoization', () => {
81
+ it('should return cached project ID on subsequent calls without re-fetching', async () => {
82
+ mockPost.mockReturnValueOnce(
83
+ mockJsonResponse({
84
+ data: {
85
+ organization: null,
86
+ user: {
87
+ projectV2: {
88
+ id: 'PVT_cached',
89
+ databaseId: 777,
90
+ },
91
+ },
92
+ },
93
+ }),
94
+ );
95
+
96
+ const first = await repository.fetchProjectId('owner', 10);
97
+ const second = await repository.fetchProjectId('owner', 10);
98
+
99
+ expect(first).toBe('PVT_cached');
100
+ expect(second).toBe('PVT_cached');
101
+ expect(mockPost).toHaveBeenCalledTimes(1);
102
+ });
103
+
104
+ it('should use separate cache entries for different owner+projectNumber combinations', async () => {
105
+ mockPost
106
+ .mockReturnValueOnce(
107
+ mockJsonResponse({
108
+ data: {
109
+ organization: null,
110
+ user: { projectV2: { id: 'PVT_A', databaseId: 1 } },
111
+ },
112
+ }),
113
+ )
114
+ .mockReturnValueOnce(
115
+ mockJsonResponse({
116
+ data: {
117
+ organization: null,
118
+ user: { projectV2: { id: 'PVT_B', databaseId: 2 } },
119
+ },
120
+ }),
121
+ );
122
+
123
+ const resultA = await repository.fetchProjectId('ownerA', 1);
124
+ const resultB = await repository.fetchProjectId('ownerB', 1);
125
+
126
+ expect(resultA).toBe('PVT_A');
127
+ expect(resultB).toBe('PVT_B');
128
+ expect(mockPost).toHaveBeenCalledTimes(2);
129
+ });
130
+ });
131
+
132
+ describe('errors-only response hardening', () => {
133
+ it('should throw a clear error when response has no data field', async () => {
134
+ mockPost.mockReturnValueOnce(
135
+ mockJsonResponse({
136
+ errors: [{ message: 'Could not resolve to a User' }],
137
+ }),
138
+ );
139
+
140
+ await expect(repository.fetchProjectId('bad-owner', 1)).rejects.toThrow(
141
+ 'Could not resolve to a User',
142
+ );
143
+ });
144
+
145
+ it('should throw a clear error when data is null', async () => {
146
+ mockPost.mockReturnValueOnce(
147
+ mockJsonResponse({
148
+ data: null,
149
+ errors: [{ message: 'secondary rate limit' }],
150
+ }),
151
+ );
152
+
153
+ await expect(
154
+ repository.fetchProjectId('rate-limited', 1),
155
+ ).rejects.toThrow('secondary rate limit');
156
+ });
157
+
158
+ it('should throw a clear error when data has no project in either org or user', async () => {
159
+ mockPost.mockReturnValueOnce(
160
+ mockJsonResponse({
161
+ data: {
162
+ organization: null,
163
+ user: null,
164
+ },
165
+ }),
166
+ );
167
+
168
+ await expect(
169
+ repository.fetchProjectId('no-project-owner', 99),
170
+ ).rejects.toThrow('project not found');
171
+ });
172
+
173
+ it('should throw a clear error when network call fails', async () => {
174
+ mockPost.mockReturnValueOnce({
175
+ json: jest.fn().mockRejectedValue(new Error('network failure')),
176
+ });
177
+
178
+ await expect(repository.fetchProjectId('owner', 1)).rejects.toThrow(
179
+ 'network failure',
180
+ );
181
+ });
182
+ });
183
+
184
+ describe('backoff after failure', () => {
185
+ it('should not re-call GraphQL within 1 hour after a failure', async () => {
186
+ mockPost.mockReturnValueOnce(
187
+ mockJsonResponse({
188
+ errors: [{ message: 'auth failure' }],
189
+ }),
190
+ );
191
+
192
+ await expect(repository.fetchProjectId('owner', 5)).rejects.toThrow();
193
+
194
+ await expect(repository.fetchProjectId('owner', 5)).rejects.toThrow(
195
+ 'backoff',
196
+ );
197
+
198
+ expect(mockPost).toHaveBeenCalledTimes(1);
199
+ });
200
+
201
+ it('should retry after 1 hour backoff has elapsed', async () => {
202
+ mockPost
203
+ .mockReturnValueOnce(
204
+ mockJsonResponse({
205
+ errors: [{ message: 'temporary error' }],
206
+ }),
207
+ )
208
+ .mockReturnValueOnce(
209
+ mockJsonResponse({
210
+ data: {
211
+ organization: null,
212
+ user: { projectV2: { id: 'PVT_recovered', databaseId: 42 } },
213
+ },
214
+ }),
215
+ );
216
+
217
+ await expect(repository.fetchProjectId('owner', 7)).rejects.toThrow();
218
+
219
+ jest.advanceTimersByTime(60 * 60 * 1000 + 1);
220
+
221
+ const result = await repository.fetchProjectId('owner', 7);
222
+
223
+ expect(result).toBe('PVT_recovered');
224
+ expect(mockPost).toHaveBeenCalledTimes(2);
225
+ });
226
+
227
+ it('should apply backoff independently per owner+projectNumber', async () => {
228
+ mockPost
229
+ .mockReturnValueOnce(
230
+ mockJsonResponse({
231
+ errors: [{ message: 'error for owner A' }],
232
+ }),
233
+ )
234
+ .mockReturnValueOnce(
235
+ mockJsonResponse({
236
+ data: {
237
+ organization: null,
238
+ user: { projectV2: { id: 'PVT_B', databaseId: 2 } },
239
+ },
240
+ }),
241
+ );
242
+
243
+ await expect(repository.fetchProjectId('ownerA', 1)).rejects.toThrow();
244
+
245
+ const resultB = await repository.fetchProjectId('ownerB', 1);
246
+
247
+ expect(resultB).toBe('PVT_B');
248
+ expect(mockPost).toHaveBeenCalledTimes(2);
249
+ });
250
+ });
251
+ });
@@ -4,6 +4,8 @@ import { ProjectRepository } from '../../domain/usecases/adapter-interfaces/Proj
4
4
  import { FieldOption, Project } from '../../domain/entities/Project';
5
5
  import { normalizeFieldName } from './utils';
6
6
 
7
+ const ONE_HOUR_MS = 60 * 60 * 1000;
8
+
7
9
  export class GraphqlProjectRepository
8
10
  extends BaseGitHubRepository
9
11
  implements
@@ -16,6 +18,9 @@ export class GraphqlProjectRepository
16
18
  | 'updateStatusList'
17
19
  >
18
20
  {
21
+ private readonly projectIdCache = new Map<string, string>();
22
+ private readonly fetchProjectIdFailedAt = new Map<string, number>();
23
+
19
24
  extractProjectFromUrl = (
20
25
  projectUrl: string,
21
26
  ): {
@@ -32,6 +37,17 @@ export class GraphqlProjectRepository
32
37
  login: string,
33
38
  projectNumber: number,
34
39
  ): Promise<string> => {
40
+ const cacheKey = `${login}:${projectNumber}`;
41
+ const cached = this.projectIdCache.get(cacheKey);
42
+ if (cached) {
43
+ return cached;
44
+ }
45
+ const failedAt = this.fetchProjectIdFailedAt.get(cacheKey);
46
+ if (failedAt !== undefined && Date.now() - failedAt < ONE_HOUR_MS) {
47
+ throw new Error(
48
+ `fetchProjectId for ${login}/${projectNumber} is in backoff after a recent failure`,
49
+ );
50
+ }
35
51
  const graphqlQuery = {
36
52
  query: `query GetProjectID($login: String!, $number: Int!) {
37
53
  organization(login: $login) {
@@ -53,32 +69,41 @@ export class GraphqlProjectRepository
53
69
  },
54
70
  };
55
71
 
56
- const response = await ky
57
- .post('https://api.github.com/graphql', {
58
- json: graphqlQuery,
59
- headers: {
60
- Authorization: `Bearer ${this.ghToken}`,
61
- },
62
- })
63
- .json<{
64
- data?: {
65
- organization: {
66
- projectV2: {
67
- id: string;
68
- databaseId: number;
69
- };
70
- };
71
- user: {
72
- projectV2: {
73
- id: string;
74
- databaseId: number;
75
- };
76
- };
77
- };
78
- errors?: { message: string }[];
79
- }>();
72
+ let response: {
73
+ data?: {
74
+ organization?: {
75
+ projectV2?: {
76
+ id: string;
77
+ databaseId: number;
78
+ } | null;
79
+ } | null;
80
+ user?: {
81
+ projectV2?: {
82
+ id: string;
83
+ databaseId: number;
84
+ } | null;
85
+ } | null;
86
+ } | null;
87
+ errors?: { message: string }[];
88
+ };
89
+ try {
90
+ response = await ky
91
+ .post('https://api.github.com/graphql', {
92
+ json: graphqlQuery,
93
+ headers: {
94
+ Authorization: `Bearer ${this.ghToken}`,
95
+ },
96
+ })
97
+ .json();
98
+ } catch (error) {
99
+ this.fetchProjectIdFailedAt.set(cacheKey, Date.now());
100
+ throw new Error(
101
+ `fetchProjectId network error for ${login}/${projectNumber}: ${String(error)}`,
102
+ );
103
+ }
80
104
 
81
105
  if (!response.data) {
106
+ this.fetchProjectIdFailedAt.set(cacheKey, Date.now());
82
107
  const errorMessages = response.errors
83
108
  ? response.errors.map((e) => e.message).join('; ')
84
109
  : 'no data field in response';
@@ -90,8 +115,12 @@ export class GraphqlProjectRepository
90
115
  response.data.organization?.projectV2?.id ||
91
116
  response.data.user?.projectV2?.id;
92
117
  if (!projectId) {
93
- throw new Error('projectId is not found');
118
+ this.fetchProjectIdFailedAt.set(cacheKey, Date.now());
119
+ throw new Error(
120
+ `fetchProjectId: project not found for ${login}/${projectNumber}`,
121
+ );
94
122
  }
123
+ this.projectIdCache.set(cacheKey, projectId);
95
124
  return projectId;
96
125
  };
97
126
  findProjectIdByUrl = async (