github-issue-tower-defence-management 1.72.0 → 1.73.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.73.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.72.0...v1.73.0) (2026-06-06)
2
+
3
+
4
+ ### Features
5
+
6
+ * **core:** run change-target auto-approve check in periodic awaiting quality check cycle ([bf7f5b3](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/bf7f5b307c2d6af2f0377cab6d26e93b4e014e47)), closes [#770](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/issues/770)
7
+
1
8
  # [1.72.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.71.1...v1.72.0) (2026-06-06)
2
9
 
3
10
 
package/README.md CHANGED
@@ -364,7 +364,7 @@ The `schedule` command runs two distinct processing loops within a single invoca
364
364
 
365
365
  The following use cases execute on every `schedule` trigger (cadence is determined by the caller's cron/daemon, typically ~3 minutes):
366
366
 
367
- - `RevertNotReadyAwaitingQualityCheckUseCase` — reverts awaiting-quality-check issues whose linked PR is conflicting, draft, missing, multiplied, has failing or never-started CI checks, or has unresolved review comments, back to awaiting-workspace
367
+ - `RevertNotReadyAwaitingQualityCheckUseCase` — reverts awaiting-quality-check issues whose linked PR is conflicting, draft, missing, multiplied, has failing or never-started CI checks, or has unresolved review comments, back to awaiting-workspace. For awaiting-quality-check issues that have no rejections, it also runs the same `change-target:<path>` auto-approve check as `NotifyFinishedIssuePreparationUseCase`: when the issue carries one or more `change-target:` labels and every changed file of the ready PR is confined to the labeled paths, the PR is auto-approved (issues with an `llm-agent` label are skipped).
368
368
  - `RevertOrphanedPreparationUseCase` — reverts orphaned preparation issues back to awaiting-workspace
369
369
  - `StartPreparationUseCase` — starts preparation for issues ready to be worked on
370
370
  - `NotifyFinishedIssuePreparationUseCase` — checks preparation-status issues and advances them. When the issue carries one or more `change-target:<path>` labels and all auto status checks pass, the related pull request's full file list is fetched (paginated, no 100-file truncation) and the PR is auto-approved before transitioning to Awaiting Quality Check if every changed file is under at least one of the labeled paths. Matching is boundary-safe (`change-target:foo` matches `foo/bar.ts` but not `foobar/baz.ts`); multiple `change-target:` labels are OR-combined. When no `change-target:` label is present, behavior is unchanged.
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChangeTargetPullRequestApprover = void 0;
4
+ class ChangeTargetPullRequestApprover {
5
+ constructor(issueRepository) {
6
+ this.issueRepository = issueRepository;
7
+ this.approveIfConfined = async (issueLabels, approvedPrUrl) => {
8
+ if (approvedPrUrl === null) {
9
+ return;
10
+ }
11
+ const changeTargetPaths = this.extractChangeTargetPaths(issueLabels);
12
+ if (changeTargetPaths.length === 0) {
13
+ return;
14
+ }
15
+ const changedFilePaths = await this.issueRepository.getPullRequestChangedFilePaths(approvedPrUrl);
16
+ if (changedFilePaths.length === 0) {
17
+ return;
18
+ }
19
+ const allConfined = changedFilePaths.every((filePath) => this.isFilePathConfinedToAllowedPaths(filePath, changeTargetPaths));
20
+ if (!allConfined) {
21
+ return;
22
+ }
23
+ await this.issueRepository.approvePullRequest(approvedPrUrl);
24
+ };
25
+ this.extractChangeTargetPaths = (labels) => {
26
+ const prefix = 'change-target:';
27
+ const paths = [];
28
+ for (const label of labels) {
29
+ if (!label.startsWith(prefix))
30
+ continue;
31
+ const raw = label.slice(prefix.length).trim();
32
+ if (raw.length === 0)
33
+ continue;
34
+ const normalized = raw.replace(/\/+$/, '');
35
+ if (normalized.length === 0)
36
+ continue;
37
+ paths.push(normalized);
38
+ }
39
+ return paths;
40
+ };
41
+ this.isFilePathConfinedToAllowedPaths = (filePath, allowedPaths) => allowedPaths.some((allowedPath) => filePath === allowedPath || filePath.startsWith(`${allowedPath}/`));
42
+ }
43
+ }
44
+ exports.ChangeTargetPullRequestApprover = ChangeTargetPullRequestApprover;
45
+ //# sourceMappingURL=ChangeTargetPullRequestApprover.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangeTargetPullRequestApprover.js","sourceRoot":"","sources":["../../../src/domain/usecases/ChangeTargetPullRequestApprover.ts"],"names":[],"mappings":";;;AAEA,MAAa,+BAA+B;IAC1C,YACmB,eAGhB;QAHgB,oBAAe,GAAf,eAAe,CAG/B;QAGH,sBAAiB,GAAG,KAAK,EACvB,WAAqB,EACrB,aAA4B,EACb,EAAE;YACjB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;gBAC3B,OAAO;YACT,CAAC;YACD,MAAM,iBAAiB,GAAG,IAAI,CAAC,wBAAwB,CAAC,WAAW,CAAC,CAAC;YACrE,IAAI,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,OAAO;YACT,CAAC;YACD,MAAM,gBAAgB,GACpB,MAAM,IAAI,CAAC,eAAe,CAAC,8BAA8B,CAAC,aAAa,CAAC,CAAC;YAC3E,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CACtD,IAAI,CAAC,gCAAgC,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CACnE,CAAC;YACF,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,OAAO;YACT,CAAC;YACD,MAAM,IAAI,CAAC,eAAe,CAAC,kBAAkB,CAAC,aAAa,CAAC,CAAC;QAC/D,CAAC,CAAC;QAEM,6BAAwB,GAAG,CAAC,MAAgB,EAAY,EAAE;YAChE,MAAM,MAAM,GAAG,gBAAgB,CAAC;YAChC,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,SAAS;gBACxC,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9C,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBAC/B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;oBAAE,SAAS;gBACtC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACzB,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC,CAAC;QAEM,qCAAgC,GAAG,CACzC,QAAgB,EAChB,YAAsB,EACb,EAAE,CACX,YAAY,CAAC,IAAI,CACf,CAAC,WAAW,EAAE,EAAE,CACd,QAAQ,KAAK,WAAW,IAAI,QAAQ,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,CAAC,CACrE,CAAC;IAhDD,CAAC;CAiDL;AAvDD,0EAuDC"}
@@ -3,6 +3,7 @@ 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
5
  const IssueRejectionEvaluator_1 = require("./IssueRejectionEvaluator");
6
+ const ChangeTargetPullRequestApprover_1 = require("./ChangeTargetPullRequestApprover");
6
7
  class IssueNotFoundError extends Error {
7
8
  constructor(issueUrl) {
8
9
  super(`Issue not found: ${issueUrl}`);
@@ -99,7 +100,7 @@ class NotifyFinishedIssuePreparationUseCase {
99
100
  return;
100
101
  }
101
102
  if (rejections.length <= 0) {
102
- await this.maybeAutoApprovePrByChangeTarget(issue, approvedPrUrl);
103
+ await this.changeTargetPullRequestApprover.approveIfConfined(issue.labels, approvedPrUrl);
103
104
  issue.status = WorkflowStatus_1.AWAITING_QUALITY_CHECK_STATUS_NAME;
104
105
  await this.issueRepository.update(issue, project);
105
106
  await this.issueRepository.updateStatus(project, issue, awaitingQualityCheckStatusOption.id);
@@ -114,41 +115,6 @@ class NotifyFinishedIssuePreparationUseCase {
114
115
  await this.issueCommentRepository.createComment(issue, rejectionStatusMessage);
115
116
  };
116
117
  this.isAuthorTrusted = (author, allowedIssueAuthors) => allowedIssueAuthors === null || allowedIssueAuthors.includes(author);
117
- this.extractChangeTargetPaths = (labels) => {
118
- const prefix = 'change-target:';
119
- const paths = [];
120
- for (const label of labels) {
121
- if (!label.startsWith(prefix))
122
- continue;
123
- const raw = label.slice(prefix.length).trim();
124
- if (raw.length === 0)
125
- continue;
126
- const normalized = raw.replace(/\/+$/, '');
127
- if (normalized.length === 0)
128
- continue;
129
- paths.push(normalized);
130
- }
131
- return paths;
132
- };
133
- this.isFilePathConfinedToAllowedPaths = (filePath, allowedPaths) => allowedPaths.some((allowedPath) => filePath === allowedPath || filePath.startsWith(`${allowedPath}/`));
134
- this.maybeAutoApprovePrByChangeTarget = async (issue, approvedPrUrl) => {
135
- if (approvedPrUrl === null) {
136
- return;
137
- }
138
- const changeTargetPaths = this.extractChangeTargetPaths(issue.labels);
139
- if (changeTargetPaths.length === 0) {
140
- return;
141
- }
142
- const changedFilePaths = await this.issueRepository.getPullRequestChangedFilePaths(approvedPrUrl);
143
- if (changedFilePaths.length === 0) {
144
- return;
145
- }
146
- const allConfined = changedFilePaths.every((filePath) => this.isFilePathConfinedToAllowedPaths(filePath, changeTargetPaths));
147
- if (!allConfined) {
148
- return;
149
- }
150
- await this.issueRepository.approvePullRequest(approvedPrUrl);
151
- };
152
118
  this.collectRejections = async (issue, comments, isTrustedAuthor) => {
153
119
  const rejections = [];
154
120
  const lastComment = comments[comments.length - 1];
@@ -232,6 +198,7 @@ class NotifyFinishedIssuePreparationUseCase {
232
198
  }
233
199
  };
234
200
  this.issueRejectionEvaluator = new IssueRejectionEvaluator_1.IssueRejectionEvaluator(issueRepository);
201
+ this.changeTargetPullRequestApprover = new ChangeTargetPullRequestApprover_1.ChangeTargetPullRequestApprover(issueRepository);
235
202
  }
236
203
  }
237
204
  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":"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"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RevertNotReadyAwaitingQualityCheckUseCase = void 0;
4
4
  const IssueRejectionEvaluator_1 = require("./IssueRejectionEvaluator");
5
+ const ChangeTargetPullRequestApprover_1 = require("./ChangeTargetPullRequestApprover");
5
6
  const WorkflowStatus_1 = require("../entities/WorkflowStatus");
6
7
  class RevertNotReadyAwaitingQualityCheckUseCase {
7
8
  constructor(projectRepository, issueRepository, issueCommentRepository) {
@@ -28,14 +29,17 @@ class RevertNotReadyAwaitingQualityCheckUseCase {
28
29
  if (hasLlmAgentLabel) {
29
30
  continue;
30
31
  }
31
- const { rejections } = await this.issueRejectionEvaluator.evaluate(issue);
32
+ const { rejections, approvedPrUrl } = await this.issueRejectionEvaluator.evaluate(issue);
32
33
  if (rejections.length > 0) {
33
34
  await this.issueRepository.updateStatus(project, issue, awaitingWorkspaceStatusOption.id);
34
35
  await this.issueCommentRepository.createComment(issue, `Auto Status Check: REJECTED\n${rejections.map((r) => `- ${r.detail}`).join('\n')}`);
36
+ continue;
35
37
  }
38
+ await this.changeTargetPullRequestApprover.approveIfConfined(issue.labels, approvedPrUrl);
36
39
  }
37
40
  };
38
41
  this.issueRejectionEvaluator = new IssueRejectionEvaluator_1.IssueRejectionEvaluator(issueRepository);
42
+ this.changeTargetPullRequestApprover = new ChangeTargetPullRequestApprover_1.ChangeTargetPullRequestApprover(issueRepository);
39
43
  }
40
44
  }
41
45
  exports.RevertNotReadyAwaitingQualityCheckUseCase = RevertNotReadyAwaitingQualityCheckUseCase;
@@ -1 +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"}
1
+ {"version":3,"file":"RevertNotReadyAwaitingQualityCheckUseCase.js","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts"],"names":[],"mappings":";;;AAGA,uEAAoE;AACpE,uFAAoF;AACpF,+DAGoC;AAEpC,MAAa,yCAAyC;IAIpD,YACmB,iBAGhB,EACgB,eAQhB,EACgB,sBAGhB;QAhBgB,sBAAiB,GAAjB,iBAAiB,CAGjC;QACgB,oBAAe,GAAf,eAAe,CAQ/B;QACgB,2BAAsB,GAAtB,sBAAsB,CAGtC;QAQH,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,aAAa,EAAE,GACjC,MAAM,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACrD,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;oBACF,SAAS;gBACX,CAAC;gBAED,MAAM,IAAI,CAAC,+BAA+B,CAAC,iBAAiB,CAC1D,KAAK,CAAC,MAAM,EACZ,aAAa,CACd,CAAC;YACJ,CAAC;QACH,CAAC,CAAC;QAnEA,IAAI,CAAC,uBAAuB,GAAG,IAAI,iDAAuB,CAAC,eAAe,CAAC,CAAC;QAC5E,IAAI,CAAC,+BAA+B,GAAG,IAAI,iEAA+B,CACxE,eAAe,CAChB,CAAC;IACJ,CAAC;CAgEF;AA3FD,8FA2FC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "github-issue-tower-defence-management",
3
- "version": "1.72.0",
3
+ "version": "1.73.0",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -0,0 +1,131 @@
1
+ import { ChangeTargetPullRequestApprover } from './ChangeTargetPullRequestApprover';
2
+
3
+ describe('ChangeTargetPullRequestApprover', () => {
4
+ let mockIssueRepository: {
5
+ getPullRequestChangedFilePaths: jest.Mock;
6
+ approvePullRequest: jest.Mock;
7
+ };
8
+ let approver: ChangeTargetPullRequestApprover;
9
+ const prUrl = 'https://github.com/user/repo/pull/1';
10
+
11
+ beforeEach(() => {
12
+ jest.resetAllMocks();
13
+ mockIssueRepository = {
14
+ getPullRequestChangedFilePaths: jest.fn().mockResolvedValue([]),
15
+ approvePullRequest: jest.fn().mockResolvedValue(undefined),
16
+ };
17
+ approver = new ChangeTargetPullRequestApprover(mockIssueRepository);
18
+ });
19
+
20
+ it('should do nothing when approvedPrUrl is null', async () => {
21
+ await approver.approveIfConfined(['change-target:src/domain'], null);
22
+
23
+ expect(
24
+ mockIssueRepository.getPullRequestChangedFilePaths,
25
+ ).not.toHaveBeenCalled();
26
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
27
+ });
28
+
29
+ it('should do nothing when issue has no change-target label', async () => {
30
+ await approver.approveIfConfined(['category:e2e'], prUrl);
31
+
32
+ expect(
33
+ mockIssueRepository.getPullRequestChangedFilePaths,
34
+ ).not.toHaveBeenCalled();
35
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
36
+ });
37
+
38
+ it('should approve when all files are confined to the labeled path', async () => {
39
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
40
+ 'src/domain/entities/Foo.ts',
41
+ 'src/domain/usecases/Bar.ts',
42
+ ]);
43
+
44
+ await approver.approveIfConfined(['change-target:src/domain'], prUrl);
45
+
46
+ expect(
47
+ mockIssueRepository.getPullRequestChangedFilePaths,
48
+ ).toHaveBeenCalledWith(prUrl);
49
+ expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(prUrl);
50
+ });
51
+
52
+ it('should not approve when any file is outside the labeled path', async () => {
53
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
54
+ 'src/domain/entities/Foo.ts',
55
+ 'src/adapter/Outside.ts',
56
+ ]);
57
+
58
+ await approver.approveIfConfined(['change-target:src/domain'], prUrl);
59
+
60
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
61
+ });
62
+
63
+ it('should approve when files are confined under any of multiple labels', async () => {
64
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
65
+ 'src/domain/Foo.ts',
66
+ 'docs/intro.md',
67
+ ]);
68
+
69
+ await approver.approveIfConfined(
70
+ ['change-target:src/domain', 'change-target:docs'],
71
+ prUrl,
72
+ );
73
+
74
+ expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(prUrl);
75
+ });
76
+
77
+ it('should match boundary-safely (foo matches foo/bar.ts but not foobar/baz.ts)', async () => {
78
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
79
+ 'foo/bar.ts',
80
+ 'foobar/baz.ts',
81
+ ]);
82
+
83
+ await approver.approveIfConfined(['change-target:foo'], prUrl);
84
+
85
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
86
+ });
87
+
88
+ it('should approve when changed file equals the labeled path exactly', async () => {
89
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
90
+ 'README.md',
91
+ ]);
92
+
93
+ await approver.approveIfConfined(['change-target:README.md'], prUrl);
94
+
95
+ expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(prUrl);
96
+ });
97
+
98
+ it('should not approve when there are zero changed files', async () => {
99
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([]);
100
+
101
+ await approver.approveIfConfined(['change-target:src/domain'], prUrl);
102
+
103
+ expect(
104
+ mockIssueRepository.getPullRequestChangedFilePaths,
105
+ ).toHaveBeenCalledWith(prUrl);
106
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
107
+ });
108
+
109
+ it('should normalize trailing slashes in change-target label paths', async () => {
110
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
111
+ 'src/domain/entities/Foo.ts',
112
+ ]);
113
+
114
+ await approver.approveIfConfined(['change-target:src/domain/'], prUrl);
115
+
116
+ expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(prUrl);
117
+ });
118
+
119
+ it('should ignore empty change-target label values', async () => {
120
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
121
+ 'src/domain/Foo.ts',
122
+ ]);
123
+
124
+ await approver.approveIfConfined(['change-target:'], prUrl);
125
+
126
+ expect(
127
+ mockIssueRepository.getPullRequestChangedFilePaths,
128
+ ).not.toHaveBeenCalled();
129
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
130
+ });
131
+ });
@@ -0,0 +1,58 @@
1
+ import { IssueRepository } from './adapter-interfaces/IssueRepository';
2
+
3
+ export class ChangeTargetPullRequestApprover {
4
+ constructor(
5
+ private readonly issueRepository: Pick<
6
+ IssueRepository,
7
+ 'getPullRequestChangedFilePaths' | 'approvePullRequest'
8
+ >,
9
+ ) {}
10
+
11
+ approveIfConfined = async (
12
+ issueLabels: string[],
13
+ approvedPrUrl: string | null,
14
+ ): Promise<void> => {
15
+ if (approvedPrUrl === null) {
16
+ return;
17
+ }
18
+ const changeTargetPaths = this.extractChangeTargetPaths(issueLabels);
19
+ if (changeTargetPaths.length === 0) {
20
+ return;
21
+ }
22
+ const changedFilePaths =
23
+ await this.issueRepository.getPullRequestChangedFilePaths(approvedPrUrl);
24
+ if (changedFilePaths.length === 0) {
25
+ return;
26
+ }
27
+ const allConfined = changedFilePaths.every((filePath) =>
28
+ this.isFilePathConfinedToAllowedPaths(filePath, changeTargetPaths),
29
+ );
30
+ if (!allConfined) {
31
+ return;
32
+ }
33
+ await this.issueRepository.approvePullRequest(approvedPrUrl);
34
+ };
35
+
36
+ private extractChangeTargetPaths = (labels: string[]): string[] => {
37
+ const prefix = 'change-target:';
38
+ const paths: string[] = [];
39
+ for (const label of labels) {
40
+ if (!label.startsWith(prefix)) continue;
41
+ const raw = label.slice(prefix.length).trim();
42
+ if (raw.length === 0) continue;
43
+ const normalized = raw.replace(/\/+$/, '');
44
+ if (normalized.length === 0) continue;
45
+ paths.push(normalized);
46
+ }
47
+ return paths;
48
+ };
49
+
50
+ private isFilePathConfinedToAllowedPaths = (
51
+ filePath: string,
52
+ allowedPaths: string[],
53
+ ): boolean =>
54
+ allowedPaths.some(
55
+ (allowedPath) =>
56
+ filePath === allowedPath || filePath.startsWith(`${allowedPath}/`),
57
+ );
58
+ }
@@ -12,6 +12,7 @@ import {
12
12
  IssueRejectionEvaluator,
13
13
  PrRejectedReasonType,
14
14
  } from './IssueRejectionEvaluator';
15
+ import { ChangeTargetPullRequestApprover } from './ChangeTargetPullRequestApprover';
15
16
 
16
17
  export class IssueNotFoundError extends Error {
17
18
  constructor(issueUrl: string) {
@@ -38,6 +39,7 @@ type RejectedReasonType =
38
39
 
39
40
  export class NotifyFinishedIssuePreparationUseCase {
40
41
  private readonly issueRejectionEvaluator: IssueRejectionEvaluator;
42
+ private readonly changeTargetPullRequestApprover: ChangeTargetPullRequestApprover;
41
43
 
42
44
  constructor(
43
45
  private readonly projectRepository: Pick<ProjectRepository, 'getByUrl'>,
@@ -63,6 +65,9 @@ export class NotifyFinishedIssuePreparationUseCase {
63
65
  >,
64
66
  ) {
65
67
  this.issueRejectionEvaluator = new IssueRejectionEvaluator(issueRepository);
68
+ this.changeTargetPullRequestApprover = new ChangeTargetPullRequestApprover(
69
+ issueRepository,
70
+ );
66
71
  }
67
72
 
68
73
  run = async (params: {
@@ -227,7 +232,10 @@ export class NotifyFinishedIssuePreparationUseCase {
227
232
  }
228
233
 
229
234
  if (rejections.length <= 0) {
230
- await this.maybeAutoApprovePrByChangeTarget(issue, approvedPrUrl);
235
+ await this.changeTargetPullRequestApprover.approveIfConfined(
236
+ issue.labels,
237
+ approvedPrUrl,
238
+ );
231
239
  issue.status = AWAITING_QUALITY_CHECK_STATUS_NAME;
232
240
  await this.issueRepository.update(issue, project);
233
241
  await this.issueRepository.updateStatus(
@@ -274,54 +282,6 @@ export class NotifyFinishedIssuePreparationUseCase {
274
282
  ): boolean =>
275
283
  allowedIssueAuthors === null || allowedIssueAuthors.includes(author);
276
284
 
277
- private extractChangeTargetPaths = (labels: string[]): string[] => {
278
- const prefix = 'change-target:';
279
- const paths: string[] = [];
280
- for (const label of labels) {
281
- if (!label.startsWith(prefix)) continue;
282
- const raw = label.slice(prefix.length).trim();
283
- if (raw.length === 0) continue;
284
- const normalized = raw.replace(/\/+$/, '');
285
- if (normalized.length === 0) continue;
286
- paths.push(normalized);
287
- }
288
- return paths;
289
- };
290
-
291
- private isFilePathConfinedToAllowedPaths = (
292
- filePath: string,
293
- allowedPaths: string[],
294
- ): boolean =>
295
- allowedPaths.some(
296
- (allowedPath) =>
297
- filePath === allowedPath || filePath.startsWith(`${allowedPath}/`),
298
- );
299
-
300
- private maybeAutoApprovePrByChangeTarget = async (
301
- issue: { labels: string[] },
302
- approvedPrUrl: string | null,
303
- ): Promise<void> => {
304
- if (approvedPrUrl === null) {
305
- return;
306
- }
307
- const changeTargetPaths = this.extractChangeTargetPaths(issue.labels);
308
- if (changeTargetPaths.length === 0) {
309
- return;
310
- }
311
- const changedFilePaths =
312
- await this.issueRepository.getPullRequestChangedFilePaths(approvedPrUrl);
313
- if (changedFilePaths.length === 0) {
314
- return;
315
- }
316
- const allConfined = changedFilePaths.every((filePath) =>
317
- this.isFilePathConfinedToAllowedPaths(filePath, changeTargetPaths),
318
- );
319
- if (!allConfined) {
320
- return;
321
- }
322
- await this.issueRepository.approvePullRequest(approvedPrUrl);
323
- };
324
-
325
285
  private collectRejections = async (
326
286
  issue: { url: string; labels: string[]; isPr: boolean },
327
287
  comments: { author: string; content: string }[],
@@ -81,6 +81,8 @@ describe('RevertNotReadyAwaitingQualityCheckUseCase', () => {
81
81
  updateStatus: jest.Mock;
82
82
  findRelatedOpenPRs: jest.Mock;
83
83
  getOpenPullRequest: jest.Mock;
84
+ getPullRequestChangedFilePaths: jest.Mock;
85
+ approvePullRequest: jest.Mock;
84
86
  };
85
87
  let mockIssueCommentRepository: {
86
88
  createComment: jest.Mock;
@@ -105,6 +107,8 @@ describe('RevertNotReadyAwaitingQualityCheckUseCase', () => {
105
107
  updateStatus: jest.fn().mockResolvedValue(undefined),
106
108
  findRelatedOpenPRs: jest.fn().mockResolvedValue([]),
107
109
  getOpenPullRequest: jest.fn().mockResolvedValue(null),
110
+ getPullRequestChangedFilePaths: jest.fn().mockResolvedValue([]),
111
+ approvePullRequest: jest.fn().mockResolvedValue(undefined),
108
112
  };
109
113
 
110
114
  mockIssueCommentRepository = {
@@ -405,4 +409,225 @@ describe('RevertNotReadyAwaitingQualityCheckUseCase', () => {
405
409
  expect.stringContaining('REQUIRED_CI_JOB_NEVER_STARTED'),
406
410
  );
407
411
  });
412
+
413
+ describe('change-target label auto-approve', () => {
414
+ const setupReadyIssue = (labels: string[]) => {
415
+ const issue = createMockIssue({
416
+ status: 'Awaiting Quality Check',
417
+ labels,
418
+ });
419
+ mockIssueRepository.getAllIssues.mockResolvedValue({
420
+ issues: [issue],
421
+ cacheUsed: false,
422
+ });
423
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
424
+ createReadyPr(),
425
+ ]);
426
+ return issue;
427
+ };
428
+
429
+ const runCycle = () =>
430
+ useCase.run({
431
+ projectUrl: 'https://github.com/users/user/projects/1',
432
+ allowIssueCacheMinutes: 10,
433
+ });
434
+
435
+ it('should not approve PR when issue has no change-target label', async () => {
436
+ setupReadyIssue([]);
437
+
438
+ await runCycle();
439
+
440
+ expect(
441
+ mockIssueRepository.getPullRequestChangedFilePaths,
442
+ ).not.toHaveBeenCalled();
443
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
444
+ expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
445
+ });
446
+
447
+ it('should approve PR when issue has change-target label and all files are confined', async () => {
448
+ setupReadyIssue(['change-target:src/domain']);
449
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
450
+ 'src/domain/entities/Foo.ts',
451
+ 'src/domain/usecases/Bar.ts',
452
+ ]);
453
+
454
+ await runCycle();
455
+
456
+ expect(
457
+ mockIssueRepository.getPullRequestChangedFilePaths,
458
+ ).toHaveBeenCalledWith('https://github.com/user/repo/pull/1');
459
+ expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
460
+ 'https://github.com/user/repo/pull/1',
461
+ );
462
+ expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
463
+ });
464
+
465
+ it('should not approve PR when any changed file is outside the labeled path', async () => {
466
+ setupReadyIssue(['change-target:src/domain']);
467
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
468
+ 'src/domain/entities/Foo.ts',
469
+ 'src/adapter/repositories/Outside.ts',
470
+ ]);
471
+
472
+ await runCycle();
473
+
474
+ expect(
475
+ mockIssueRepository.getPullRequestChangedFilePaths,
476
+ ).toHaveBeenCalledWith('https://github.com/user/repo/pull/1');
477
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
478
+ });
479
+
480
+ it('should approve when files are confined under any of multiple change-target labels', async () => {
481
+ setupReadyIssue(['change-target:src/domain', 'change-target:docs']);
482
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
483
+ 'src/domain/entities/Foo.ts',
484
+ 'docs/intro.md',
485
+ ]);
486
+
487
+ await runCycle();
488
+
489
+ expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
490
+ 'https://github.com/user/repo/pull/1',
491
+ );
492
+ });
493
+
494
+ it('should not approve when PR has more than 100 changed files and one file beyond entry 100 is outside the labeled path', async () => {
495
+ setupReadyIssue(['change-target:src/domain']);
496
+ const filePaths: string[] = [];
497
+ for (let i = 0; i < 150; i += 1) {
498
+ filePaths.push(`src/domain/file${i}.ts`);
499
+ }
500
+ filePaths.push('src/adapter/Outside.ts');
501
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue(
502
+ filePaths,
503
+ );
504
+
505
+ await runCycle();
506
+
507
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
508
+ });
509
+
510
+ it('should match boundary-safely (change-target:foo matches foo/bar.ts but not foobar/baz.ts)', async () => {
511
+ setupReadyIssue(['change-target:foo']);
512
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
513
+ 'foo/bar.ts',
514
+ 'foobar/baz.ts',
515
+ ]);
516
+
517
+ await runCycle();
518
+
519
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
520
+ });
521
+
522
+ it('should approve when changed files match exact path or subpath of the labeled path', async () => {
523
+ setupReadyIssue(['change-target:foo']);
524
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
525
+ 'foo/bar.ts',
526
+ 'foo/nested/baz.ts',
527
+ ]);
528
+
529
+ await runCycle();
530
+
531
+ expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
532
+ 'https://github.com/user/repo/pull/1',
533
+ );
534
+ });
535
+
536
+ it('should not approve when PR has zero changed files', async () => {
537
+ setupReadyIssue(['change-target:src/domain']);
538
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([]);
539
+
540
+ await runCycle();
541
+
542
+ expect(
543
+ mockIssueRepository.getPullRequestChangedFilePaths,
544
+ ).toHaveBeenCalledWith('https://github.com/user/repo/pull/1');
545
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
546
+ });
547
+
548
+ it('should not approve when there is no ready PR even if change-target label is present', async () => {
549
+ const issue = createMockIssue({
550
+ status: 'Awaiting Quality Check',
551
+ labels: ['change-target:src/domain'],
552
+ });
553
+ mockIssueRepository.getAllIssues.mockResolvedValue({
554
+ issues: [issue],
555
+ cacheUsed: false,
556
+ });
557
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([]);
558
+
559
+ await runCycle();
560
+
561
+ expect(
562
+ mockIssueRepository.getPullRequestChangedFilePaths,
563
+ ).not.toHaveBeenCalled();
564
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
565
+ expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
566
+ mockProject,
567
+ issue,
568
+ 'awaiting-workspace-id',
569
+ );
570
+ });
571
+
572
+ it('should not approve when PR has unresolved rejections even with change-target label', async () => {
573
+ const issue = createMockIssue({
574
+ status: 'Awaiting Quality Check',
575
+ labels: ['change-target:src/domain'],
576
+ });
577
+ mockIssueRepository.getAllIssues.mockResolvedValue({
578
+ issues: [issue],
579
+ cacheUsed: false,
580
+ });
581
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
582
+ { ...createReadyPr(), isConflicted: true },
583
+ ]);
584
+
585
+ await runCycle();
586
+
587
+ expect(
588
+ mockIssueRepository.getPullRequestChangedFilePaths,
589
+ ).not.toHaveBeenCalled();
590
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
591
+ expect(mockIssueRepository.updateStatus).toHaveBeenCalledWith(
592
+ mockProject,
593
+ issue,
594
+ 'awaiting-workspace-id',
595
+ );
596
+ });
597
+
598
+ it('should skip change-target auto-approve for issue with llm-agent label', async () => {
599
+ const issue = createMockIssue({
600
+ status: 'Awaiting Quality Check',
601
+ labels: ['llm-agent', 'change-target:src/domain'],
602
+ });
603
+ mockIssueRepository.getAllIssues.mockResolvedValue({
604
+ issues: [issue],
605
+ cacheUsed: false,
606
+ });
607
+ mockIssueRepository.findRelatedOpenPRs.mockResolvedValue([
608
+ createReadyPr(),
609
+ ]);
610
+
611
+ await runCycle();
612
+
613
+ expect(
614
+ mockIssueRepository.getPullRequestChangedFilePaths,
615
+ ).not.toHaveBeenCalled();
616
+ expect(mockIssueRepository.approvePullRequest).not.toHaveBeenCalled();
617
+ expect(mockIssueRepository.updateStatus).not.toHaveBeenCalled();
618
+ });
619
+
620
+ it('should normalize trailing slashes in change-target label paths', async () => {
621
+ setupReadyIssue(['change-target:src/domain/']);
622
+ mockIssueRepository.getPullRequestChangedFilePaths.mockResolvedValue([
623
+ 'src/domain/entities/Foo.ts',
624
+ ]);
625
+
626
+ await runCycle();
627
+
628
+ expect(mockIssueRepository.approvePullRequest).toHaveBeenCalledWith(
629
+ 'https://github.com/user/repo/pull/1',
630
+ );
631
+ });
632
+ });
408
633
  });
@@ -2,6 +2,7 @@ import { IssueRepository } from './adapter-interfaces/IssueRepository';
2
2
  import { ProjectRepository } from './adapter-interfaces/ProjectRepository';
3
3
  import { IssueCommentRepository } from './adapter-interfaces/IssueCommentRepository';
4
4
  import { IssueRejectionEvaluator } from './IssueRejectionEvaluator';
5
+ import { ChangeTargetPullRequestApprover } from './ChangeTargetPullRequestApprover';
5
6
  import {
6
7
  AWAITING_QUALITY_CHECK_STATUS_NAME,
7
8
  AWAITING_WORKSPACE_STATUS_NAME,
@@ -9,6 +10,7 @@ import {
9
10
 
10
11
  export class RevertNotReadyAwaitingQualityCheckUseCase {
11
12
  private readonly issueRejectionEvaluator: IssueRejectionEvaluator;
13
+ private readonly changeTargetPullRequestApprover: ChangeTargetPullRequestApprover;
12
14
 
13
15
  constructor(
14
16
  private readonly projectRepository: Pick<
@@ -21,6 +23,8 @@ export class RevertNotReadyAwaitingQualityCheckUseCase {
21
23
  | 'updateStatus'
22
24
  | 'findRelatedOpenPRs'
23
25
  | 'getOpenPullRequest'
26
+ | 'getPullRequestChangedFilePaths'
27
+ | 'approvePullRequest'
24
28
  >,
25
29
  private readonly issueCommentRepository: Pick<
26
30
  IssueCommentRepository,
@@ -28,6 +32,9 @@ export class RevertNotReadyAwaitingQualityCheckUseCase {
28
32
  >,
29
33
  ) {
30
34
  this.issueRejectionEvaluator = new IssueRejectionEvaluator(issueRepository);
35
+ this.changeTargetPullRequestApprover = new ChangeTargetPullRequestApprover(
36
+ issueRepository,
37
+ );
31
38
  }
32
39
 
33
40
  run = async (params: {
@@ -71,7 +78,8 @@ export class RevertNotReadyAwaitingQualityCheckUseCase {
71
78
  continue;
72
79
  }
73
80
 
74
- const { rejections } = await this.issueRejectionEvaluator.evaluate(issue);
81
+ const { rejections, approvedPrUrl } =
82
+ await this.issueRejectionEvaluator.evaluate(issue);
75
83
  if (rejections.length > 0) {
76
84
  await this.issueRepository.updateStatus(
77
85
  project,
@@ -82,7 +90,13 @@ export class RevertNotReadyAwaitingQualityCheckUseCase {
82
90
  issue,
83
91
  `Auto Status Check: REJECTED\n${rejections.map((r) => `- ${r.detail}`).join('\n')}`,
84
92
  );
93
+ continue;
85
94
  }
95
+
96
+ await this.changeTargetPullRequestApprover.approveIfConfined(
97
+ issue.labels,
98
+ approvedPrUrl,
99
+ );
86
100
  }
87
101
  };
88
102
  }
@@ -0,0 +1,9 @@
1
+ import { IssueRepository } from './adapter-interfaces/IssueRepository';
2
+ export declare class ChangeTargetPullRequestApprover {
3
+ private readonly issueRepository;
4
+ constructor(issueRepository: Pick<IssueRepository, 'getPullRequestChangedFilePaths' | 'approvePullRequest'>);
5
+ approveIfConfined: (issueLabels: string[], approvedPrUrl: string | null) => Promise<void>;
6
+ private extractChangeTargetPaths;
7
+ private isFilePathConfinedToAllowedPaths;
8
+ }
9
+ //# sourceMappingURL=ChangeTargetPullRequestApprover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChangeTargetPullRequestApprover.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/ChangeTargetPullRequestApprover.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAEvE,qBAAa,+BAA+B;IAExC,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAAf,eAAe,EAAE,IAAI,CACpC,eAAe,EACf,gCAAgC,GAAG,oBAAoB,CACxD;IAGH,iBAAiB,GACf,aAAa,MAAM,EAAE,EACrB,eAAe,MAAM,GAAG,IAAI,KAC3B,OAAO,CAAC,IAAI,CAAC,CAoBd;IAEF,OAAO,CAAC,wBAAwB,CAY9B;IAEF,OAAO,CAAC,gCAAgC,CAOpC;CACL"}
@@ -14,6 +14,7 @@ export declare class NotifyFinishedIssuePreparationUseCase {
14
14
  private readonly issueCommentRepository;
15
15
  private readonly webhookRepository;
16
16
  private readonly issueRejectionEvaluator;
17
+ private readonly changeTargetPullRequestApprover;
17
18
  constructor(projectRepository: Pick<ProjectRepository, 'getByUrl'>, issueRepository: Pick<IssueRepository, 'get' | 'update' | 'updateStatus' | 'findRelatedOpenPRs' | 'getStoryObjectMap' | 'getOpenPullRequest' | 'getPullRequestChangedFilePaths' | 'approvePullRequest' | 'setDependedIssueUrl'>, issueCommentRepository: Pick<IssueCommentRepository, 'getCommentsFromIssue' | 'createComment'>, webhookRepository: Pick<WebhookRepository, 'sendGetRequest'>);
18
19
  run: (params: {
19
20
  projectUrl: string;
@@ -23,9 +24,6 @@ export declare class NotifyFinishedIssuePreparationUseCase {
23
24
  allowedIssueAuthors?: string[] | null;
24
25
  }) => Promise<void>;
25
26
  private isAuthorTrusted;
26
- private extractChangeTargetPaths;
27
- private isFilePathConfinedToAllowedPaths;
28
- private maybeAutoApprovePrByChangeTarget;
29
27
  private collectRejections;
30
28
  private reportBodyHasNextStep;
31
29
  private setDependedIssueUrlForAllOpenPRs;
@@ -1 +1 @@
1
- {"version":3,"file":"NotifyFinishedIssuePreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAY3E,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,QAAQ,EAAE,MAAM;CAI7B;AACD,qBAAa,uBAAwB,SAAQ,KAAK;gBAE9C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,cAAc,EAAE,MAAM,GAAG,IAAI;CAOhC;AAMD,qBAAa,qCAAqC;IAI9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAYhC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAIvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IApBpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;gBAG/C,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EACtD,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,KAAK,GACL,QAAQ,GACR,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,oBAAoB,GACpB,gCAAgC,GAChC,oBAAoB,GACpB,qBAAqB,CACxB,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,sBAAsB,GAAG,eAAe,CACzC,EACgB,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,gBAAgB,CACjB;IAKH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,iCAAiC,EAAE,MAAM,GAAG,IAAI,CAAC;QACjD,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KACvC,KAAG,OAAO,CAAC,IAAI,CAAC,CAmMf;IAEF,OAAO,CAAC,eAAe,CAIgD;IAEvE,OAAO,CAAC,wBAAwB,CAY9B;IAEF,OAAO,CAAC,gCAAgC,CAOpC;IAEJ,OAAO,CAAC,gCAAgC,CAuBtC;IAEF,OAAO,CAAC,iBAAiB,CA8BvB;IAEF,OAAO,CAAC,qBAAqB,CAuB3B;IAEF,OAAO,CAAC,gCAAgC,CAiBtC;IAEF,OAAO,CAAC,uBAAuB,CAQ7B;IAEF,OAAO,CAAC,+BAA+B,CAkCrC;CACH"}
1
+ {"version":3,"file":"NotifyFinishedIssuePreparationUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/NotifyFinishedIssuePreparationUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAa3E,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,QAAQ,EAAE,MAAM;CAI7B;AACD,qBAAa,uBAAwB,SAAQ,KAAK;gBAE9C,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,cAAc,EAAE,MAAM,GAAG,IAAI;CAOhC;AAMD,qBAAa,qCAAqC;IAK9C,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAYhC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAIvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IArBpC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;IAClE,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAkC;gBAG/D,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,EACtD,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,KAAK,GACL,QAAQ,GACR,cAAc,GACd,oBAAoB,GACpB,mBAAmB,GACnB,oBAAoB,GACpB,gCAAgC,GAChC,oBAAoB,GACpB,qBAAqB,CACxB,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,sBAAsB,GAAG,eAAe,CACzC,EACgB,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,gBAAgB,CACjB;IAQH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,sBAAsB,EAAE,MAAM,CAAC;QAC/B,iCAAiC,EAAE,MAAM,GAAG,IAAI,CAAC;QACjD,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;KACvC,KAAG,OAAO,CAAC,IAAI,CAAC,CAsMf;IAEF,OAAO,CAAC,eAAe,CAIgD;IAEvE,OAAO,CAAC,iBAAiB,CA8BvB;IAEF,OAAO,CAAC,qBAAqB,CAuB3B;IAEF,OAAO,CAAC,gCAAgC,CAiBtC;IAEF,OAAO,CAAC,uBAAuB,CAQ7B;IAEF,OAAO,CAAC,+BAA+B,CAkCrC;CACH"}
@@ -6,7 +6,8 @@ export declare class RevertNotReadyAwaitingQualityCheckUseCase {
6
6
  private readonly issueRepository;
7
7
  private readonly issueCommentRepository;
8
8
  private readonly issueRejectionEvaluator;
9
- constructor(projectRepository: Pick<ProjectRepository, 'findProjectIdByUrl' | 'getProject'>, issueRepository: Pick<IssueRepository, 'getAllIssues' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest'>, issueCommentRepository: Pick<IssueCommentRepository, 'createComment'>);
9
+ private readonly changeTargetPullRequestApprover;
10
+ constructor(projectRepository: Pick<ProjectRepository, 'findProjectIdByUrl' | 'getProject'>, issueRepository: Pick<IssueRepository, 'getAllIssues' | 'updateStatus' | 'findRelatedOpenPRs' | 'getOpenPullRequest' | 'getPullRequestChangedFilePaths' | 'approvePullRequest'>, issueCommentRepository: Pick<IssueCommentRepository, 'createComment'>);
10
11
  run: (params: {
11
12
  projectUrl: string;
12
13
  allowIssueCacheMinutes: number;
@@ -1 +1 @@
1
- {"version":3,"file":"RevertNotReadyAwaitingQualityCheckUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAOrF,qBAAa,yCAAyC;IAIlD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAOhC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAdzC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;gBAG/C,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,oBAAoB,GAAG,YAAY,CACpC,EACgB,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,CACvB,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,eAAe,CAChB;IAKH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,sBAAsB,EAAE,MAAM,CAAC;KAChC,KAAG,OAAO,CAAC,IAAI,CAAC,CAmDf;CACH"}
1
+ {"version":3,"file":"RevertNotReadyAwaitingQualityCheckUseCase.d.ts","sourceRoot":"","sources":["../../../src/domain/usecases/RevertNotReadyAwaitingQualityCheckUseCase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AAQrF,qBAAa,yCAAyC;IAKlD,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAIlC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAShC,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IAjBzC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAA0B;IAClE,OAAO,CAAC,QAAQ,CAAC,+BAA+B,CAAkC;gBAG/D,iBAAiB,EAAE,IAAI,CACtC,iBAAiB,EACjB,oBAAoB,GAAG,YAAY,CACpC,EACgB,eAAe,EAAE,IAAI,CACpC,eAAe,EACb,cAAc,GACd,cAAc,GACd,oBAAoB,GACpB,oBAAoB,GACpB,gCAAgC,GAChC,oBAAoB,CACvB,EACgB,sBAAsB,EAAE,IAAI,CAC3C,sBAAsB,EACtB,eAAe,CAChB;IAQH,GAAG,GAAU,QAAQ;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,sBAAsB,EAAE,MAAM,CAAC;KAChC,KAAG,OAAO,CAAC,IAAI,CAAC,CA0Df;CACH"}