opencode-magi 0.1.0 → 0.2.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.
@@ -1,8 +1,9 @@
1
1
  import { mkdir, writeFile } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
- import { createWorktree, fetchPullRequest, fetchPullRequestCommits, fetchPullRequestReviews, fetchUnresolvedThreads, postApproval, postChangesRequested, postCloseComment, postReply, removeWorktree, resolveThread, } from "../github/commands";
3
+ import { createWorktree, fetchPullRequest, fetchPullRequestCommits, fetchPullRequestReviews, fetchUnresolvedThreads, closePullRequest, mergePullRequest, postApproval, postChangesRequested, postCloseComment, postReply, removeWorktree, resolveThread, } from "../github/commands";
4
4
  import { composeFindingValidationPrompt, composeCloseReconsiderationPrompt, composeRereviewPrompt, composeReviewPrompt, } from "../prompts/compose";
5
5
  import { prRunOutputDir } from "../config/output";
6
+ import { worktreeBaseDir } from "../config/worktree";
6
7
  import { parseCloseReconsiderationOutput, parseFindingValidationOutput, parseRereviewOutput, parseReviewOutput, } from "../prompts/output";
7
8
  import { throwIfAborted, withAbortSignal } from "./abort";
8
9
  import { waitForChecksWithClassification } from "./ci";
@@ -111,6 +112,9 @@ function reviewStateToVerdict(state) {
111
112
  return "CHANGES_REQUESTED";
112
113
  return "CLOSE";
113
114
  }
115
+ function hasBlockingCiReports(reports) {
116
+ return reports.some((report) => report.scopeInside.length || report.scopeOutsideUnresolved.length);
117
+ }
114
118
  function previousReviewText(review) {
115
119
  return JSON.stringify({
116
120
  body: review.body ?? "",
@@ -497,7 +501,7 @@ export async function runReview(input) {
497
501
  checkResult.report.scopeInside.length)) {
498
502
  await input.onProgress?.({ report: checkResult.report, type: "ci_report" });
499
503
  }
500
- const worktreeRoot = join(input.directory, input.config.worktree?.dir ?? ".magi/worktrees");
504
+ const worktreeRoot = worktreeBaseDir(input.directory, input.config, "pr");
501
505
  await input.onProgress?.({ phase: "creating worktree", type: "phase" });
502
506
  const worktree = await createWorktree(exec, input.repository, input.pr, worktreeRoot);
503
507
  const worktreePath = worktree.path;
@@ -752,6 +756,30 @@ export async function runReview(input) {
752
756
  : await postReviewOutput({ ...input, exec }, key, output),
753
757
  ]))),
754
758
  };
759
+ const automationAccount = input.repository.agents.reviewers[0]?.account;
760
+ const enableReviewAutomation = input.enableReviewAutomation ?? true;
761
+ if (enableReviewAutomation &&
762
+ verdict === "MERGE" &&
763
+ input.repository.reviewAutomation?.merge) {
764
+ await input.onProgress?.({ phase: "merging PR", type: "phase" });
765
+ posted.automation = hasBlockingCiReports(ciReports)
766
+ ? "skipped: unresolved CI"
767
+ : input.dryRun
768
+ ? "dry-run:would-merge"
769
+ : automationAccount
770
+ ? await mergePullRequest(input.exec, input.repository, input.pr, automationAccount)
771
+ : "skipped: no review automation account";
772
+ }
773
+ if (enableReviewAutomation &&
774
+ verdict === "CLOSE" &&
775
+ input.repository.reviewAutomation?.close) {
776
+ await input.onProgress?.({ phase: "closing PR", type: "phase" });
777
+ posted.automation = input.dryRun
778
+ ? "dry-run:would-close"
779
+ : automationAccount
780
+ ? await closePullRequest(input.exec, input.repository, input.pr, automationAccount)
781
+ : "skipped: no review automation account";
782
+ }
755
783
  await writeFile(join(outputDir, "majority.json"), JSON.stringify({
756
784
  approvalPolicy: input.approvalPolicy ?? "majority",
757
785
  verdict,
@@ -2,6 +2,7 @@ import { randomUUID } from "node:crypto";
2
2
  import { mkdir, readFile, readdir, rm, rmdir, writeFile, } from "node:fs/promises";
3
3
  import { dirname, isAbsolute, join, relative, resolve } from "node:path";
4
4
  import { outputBaseDirs, prRunOutputDir } from "../config/output";
5
+ import { worktreeBaseDirs } from "../config/worktree";
5
6
  import { removeBranch, removeWorktree, } from "../github/commands";
6
7
  import { withGitHubApiRetry } from "../github/retry";
7
8
  import { runMerge, } from "./merge";
@@ -582,9 +583,7 @@ export class MagiRunManager {
582
583
  worktree: configured.worktree ?? DEFAULT_CLEAR_OPTIONS.worktree,
583
584
  };
584
585
  const states = await this.filteredStates(input);
585
- const cleanupDirs = new Set([
586
- join(this.input.directory, ".magi", "worktrees"),
587
- ]);
586
+ const cleanupDirs = new Set(this.absoluteWorktreeDirs(input));
588
587
  const cleanupTrees = new Set(this.emptyOutputCleanupRoots(input));
589
588
  const summary = {
590
589
  branchDeleted: 0,
@@ -1566,6 +1565,14 @@ export class MagiRunManager {
1566
1565
  absoluteOutputDir(dir) {
1567
1566
  return isAbsolute(dir) ? dir : join(this.input.directory, dir);
1568
1567
  }
1568
+ absoluteWorktreeDirs(input) {
1569
+ const worktreeDirs = Array.isArray(input.worktreeDir)
1570
+ ? input.worktreeDir
1571
+ : input.worktreeDir
1572
+ ? [input.worktreeDir]
1573
+ : worktreeBaseDirs(this.input.directory);
1574
+ return worktreeDirs.map((dir) => isAbsolute(dir) ? dir : join(this.input.directory, dir));
1575
+ }
1569
1576
  emptyOutputCleanupRoots(input) {
1570
1577
  const outputDirs = Array.isArray(input.outputDir)
1571
1578
  ? input.outputDir
@@ -34,7 +34,7 @@ function repositoryValues(repository) {
34
34
  };
35
35
  }
36
36
  function reviewValues(input) {
37
- const ciFailureContext = input.ciFailureContext?.trim() ?? input.ciFailureLogs?.trim() ?? "";
37
+ const ciFailureContext = input.ciFailureContext?.trim() ?? "";
38
38
  return {
39
39
  ...repositoryValues(input.repository),
40
40
  baseSha: input.baseSha,
@@ -42,10 +42,6 @@ function reviewValues(input) {
42
42
  ciFailureContextBlock: ciFailureContext
43
43
  ? `<ci_failure_context>\n${ciFailureContext}\n</ci_failure_context>`
44
44
  : "",
45
- ciFailureLogs: ciFailureContext,
46
- ciFailureLogsBlock: ciFailureContext
47
- ? `<ci_failure_context>\n${ciFailureContext}\n</ci_failure_context>`
48
- : "",
49
45
  headSha: input.headSha,
50
46
  jsonEncodedWorktreePath: JSON.stringify(input.worktreePath),
51
47
  pr: String(input.pr),
@@ -104,7 +100,7 @@ async function sessionContextBlocks(input) {
104
100
  export async function composeReviewPrompt(input) {
105
101
  const values = reviewValues(input);
106
102
  const task = await taskBlock({
107
- builtin: "review",
103
+ builtin: "review/review",
108
104
  customPath: input.repository.prompts.review,
109
105
  directory: input.directory,
110
106
  values,
@@ -126,7 +122,7 @@ export async function composeReviewPrompt(input) {
126
122
  export async function composeRereviewPrompt(input) {
127
123
  const values = rereviewValues(input);
128
124
  const task = await taskBlock({
129
- builtin: "rereview",
125
+ builtin: "review/rereview",
130
126
  customPath: input.repository.prompts.rereview,
131
127
  directory: input.directory,
132
128
  values,
@@ -154,7 +150,7 @@ export async function composeRereviewPrompt(input) {
154
150
  export async function composeEditPrompt(input) {
155
151
  const values = editValues(input);
156
152
  const task = await taskBlock({
157
- builtin: "edit",
153
+ builtin: "merge/edit",
158
154
  customPath: input.repository.prompts.edit,
159
155
  directory: input.directory,
160
156
  values,
@@ -177,7 +173,7 @@ export async function composeEditPrompt(input) {
177
173
  export async function composeFindingValidationPrompt(input) {
178
174
  const values = { ...reviewValues(input), findings: input.findings };
179
175
  const task = await taskBlock({
180
- builtin: "finding-validation",
176
+ builtin: "review/finding-validation",
181
177
  customPath: input.repository.prompts.findingValidation,
182
178
  directory: input.directory,
183
179
  values,
@@ -203,7 +199,7 @@ export async function composeCloseReconsiderationPrompt(input) {
203
199
  closeReason: input.closeReason ?? "",
204
200
  };
205
201
  const task = await taskBlock({
206
- builtin: "close-reconsideration",
202
+ builtin: "review/close-reconsideration",
207
203
  customPath: input.repository.prompts.closeReconsideration,
208
204
  directory: input.directory,
209
205
  values,
@@ -230,8 +226,8 @@ export async function composeRereviewCloseReconsiderationPrompt(input) {
230
226
  previousHeadSha: input.previousHeadSha,
231
227
  };
232
228
  const task = await taskBlock({
233
- builtin: "rereview-close-reconsideration",
234
- customPath: input.repository.prompts.rereviewCloseReconsideration,
229
+ builtin: "review/close-reconsideration",
230
+ customPath: input.repository.prompts.closeReconsideration,
235
231
  directory: input.directory,
236
232
  values,
237
233
  });
@@ -257,7 +253,7 @@ export async function composeCiClassificationPrompt(input) {
257
253
  pr: String(input.pr),
258
254
  };
259
255
  const task = await taskBlock({
260
- builtin: "ci-classification",
256
+ builtin: "review/ci-classification",
261
257
  customPath: input.repository.prompts.ciClassification,
262
258
  directory: input.directory,
263
259
  values,
@@ -282,7 +278,7 @@ export async function composeCiClassificationAfterEditPrompt(input) {
282
278
  worktreePath: input.worktreePath,
283
279
  };
284
280
  const task = await taskBlock({
285
- builtin: "ci-classification-after-edit",
281
+ builtin: "merge/ci-classification",
286
282
  customPath: input.repository.prompts.ciClassificationAfterEdit ??
287
283
  input.repository.prompts.ciClassification,
288
284
  directory: input.directory,
@@ -1,6 +1,5 @@
1
1
  You requested CLOSE for pull request #{pr} in {owner}/{repo}, but the other reviewers did not.
2
- Reconsider your decision and choose MERGE or CHANGES_REQUESTED instead.
3
- Use the existing review session context.
2
+ Reconsider your decision using the existing session context and choose MERGE or CHANGES_REQUESTED instead.
4
3
  Original close reason:
5
4
  {closeReason}
6
5
  Do not edit files or perform write operations.
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "opencode-magi",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Multi-agent PR review and merge orchestration plugin for OpenCode.",
5
5
  "license": "MIT",
6
6
  "author": "Hirotomo Yamada <hirotomo.yamada@avap.co.jp>",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "https://github.com/hirotomoyamada/opencode-magi"
9
+ "url": "https://github.com/magi-ai/opencode-magi"
10
10
  },
11
11
  "bugs": {
12
- "url": "https://github.com/hirotomoyamada/opencode-magi/issues"
12
+ "url": "https://github.com/magi-ai/opencode-magi/issues"
13
13
  },
14
14
  "keywords": [
15
15
  "opencode",
@@ -27,24 +27,8 @@
27
27
  "dist",
28
28
  "schema.json"
29
29
  ],
30
- "packageManager": "pnpm@10.33.0",
31
- "scripts": {
32
- "prebuild": "node scripts/copy-data.ts",
33
- "build": "tsgo -p tsconfig.build.json",
34
- "clean": "rimraf node_modules dist coverage",
35
- "format:check": "oxfmt --check .",
36
- "format:write": "oxfmt --write .",
37
- "lint:check": "oxlint . --max-warnings=0",
38
- "lint:fix": "oxlint . --max-warnings=0 --fix",
39
- "prepare": "git rev-parse --is-inside-work-tree >/dev/null 2>&1 && lefthook install || true",
40
- "quality": "pnpm format:check && pnpm lint:check && pnpm typecheck && pnpm test",
41
- "test": "vitest run",
42
- "typecheck": "tsgo --noEmit",
43
- "release": "changeset publish",
44
- "release:version": "changeset version"
45
- },
46
30
  "dependencies": {
47
- "@opencode-ai/plugin": "latest",
31
+ "@opencode-ai/plugin": "^1.15.5",
48
32
  "ajv": "^8.20.0",
49
33
  "picomatch": "^4.0.4",
50
34
  "valibot": "^1.4.0"
@@ -54,16 +38,30 @@
54
38
  "@changesets/cli": "^2.30.0",
55
39
  "@commitlint/cli": "^21.0.1",
56
40
  "@commitlint/config-conventional": "^21.0.1",
57
- "@types/node": "^25.7.0",
41
+ "@types/node": "^25.9.0",
58
42
  "@types/picomatch": "^4.0.3",
59
- "@typescript/native-preview": "7.0.0-dev.20260513.1",
43
+ "@typescript/native-preview": "7.0.0-dev.20260518.1",
60
44
  "eslint-plugin-perfectionist": "^5.9.0",
61
45
  "eslint-plugin-unused-imports": "^4.4.1",
62
46
  "lefthook": "^2.1.6",
63
- "oxfmt": "^0.49.0",
64
- "oxlint": "^1.64.0",
65
- "oxlint-tsgolint": "^0.22.1",
47
+ "oxfmt": "^0.50.0",
48
+ "oxlint": "^1.65.0",
49
+ "oxlint-tsgolint": "^0.23.0",
66
50
  "rimraf": "^6.1.3",
67
51
  "vitest": "^4.1.5"
52
+ },
53
+ "scripts": {
54
+ "prebuild": "node scripts/copy-data.ts",
55
+ "build": "tsgo -p tsconfig.build.json",
56
+ "clean": "rimraf node_modules dist coverage",
57
+ "format:check": "oxfmt --check .",
58
+ "format:write": "oxfmt --write .",
59
+ "lint:check": "oxlint . --max-warnings=0",
60
+ "lint:fix": "oxlint . --max-warnings=0 --fix",
61
+ "quality": "pnpm format:check && pnpm lint:check && pnpm typecheck && pnpm test",
62
+ "test": "vitest run",
63
+ "typecheck": "tsgo --noEmit",
64
+ "release": "changeset publish",
65
+ "release:dev": "changeset version --snapshot dev && changeset publish --tag dev"
68
66
  }
69
- }
67
+ }
package/schema.json CHANGED
@@ -5,13 +5,11 @@
5
5
  "additionalProperties": false,
6
6
  "properties": {
7
7
  "$schema": { "type": "string" },
8
- "agents": { "$ref": "#/$defs/agents" },
9
- "automation": {
8
+ "agents": {
10
9
  "type": "object",
11
10
  "additionalProperties": false,
12
11
  "properties": {
13
- "merge": { "type": "boolean", "default": true },
14
- "close": { "type": "boolean", "default": true }
12
+ "permissions": { "$ref": "#/$defs/permissions" }
15
13
  }
16
14
  },
17
15
  "clear": {
@@ -24,24 +22,6 @@
24
22
  "branch": { "type": "boolean", "default": true }
25
23
  }
26
24
  },
27
- "checks": {
28
- "type": "object",
29
- "additionalProperties": false,
30
- "properties": {
31
- "exclude": { "type": "array", "items": { "type": "string" } },
32
- "waitAfterEdit": { "type": "boolean" },
33
- "waitBeforeReview": { "type": "boolean" },
34
- "retryFailedJobs": { "type": "integer", "minimum": 0, "default": 3 }
35
- }
36
- },
37
- "concurrency": {
38
- "type": "object",
39
- "additionalProperties": false,
40
- "properties": {
41
- "runs": { "type": "integer", "minimum": 1, "default": 3 },
42
- "reviewers": { "type": "integer", "minimum": 1, "default": 3 }
43
- }
44
- },
45
25
  "github": {
46
26
  "type": "object",
47
27
  "required": ["owner", "repo"],
@@ -59,58 +39,15 @@
59
39
  }
60
40
  },
61
41
  "language": { "type": "string" },
62
- "merge": {
63
- "type": "object",
64
- "additionalProperties": false,
65
- "properties": {
66
- "approvalPolicy": {
67
- "enum": ["majority", "unanimous"],
68
- "default": "majority"
69
- },
70
- "method": { "enum": ["merge", "squash", "rebase"] },
71
- "auto": { "type": "boolean" },
72
- "deleteBranch": { "type": "boolean" },
73
- "mergeQueue": { "type": "boolean", "default": false },
74
- "maxThreadResolutionCycles": {
75
- "type": "integer",
76
- "minimum": 0,
77
- "default": 5,
78
- "description": "Maximum resolution attempts per unresolved review thread. Set 0 for unlimited attempts."
79
- }
80
- }
81
- },
42
+ "merge": { "$ref": "#/$defs/merge" },
82
43
  "output": {
83
44
  "type": "object",
84
45
  "additionalProperties": false,
85
46
  "properties": {
86
- "dirs": {
87
- "type": "object",
88
- "additionalProperties": false,
89
- "properties": {
90
- "pr": { "type": "string" }
91
- }
92
- },
93
47
  "repairAttempts": { "type": "integer", "minimum": 0, "default": 3 }
94
48
  }
95
49
  },
96
- "prompts": { "$ref": "#/$defs/prompts" },
97
- "safety": {
98
- "type": "object",
99
- "additionalProperties": false,
100
- "properties": {
101
- "allowAuthors": { "type": "array", "items": { "type": "string" } },
102
- "blockedPaths": { "type": "array", "items": { "type": "string" } },
103
- "maxChangedFiles": { "type": "integer", "minimum": 0 },
104
- "requiredLabels": { "type": "array", "items": { "type": "string" } }
105
- }
106
- },
107
- "worktree": {
108
- "type": "object",
109
- "additionalProperties": false,
110
- "properties": {
111
- "dir": { "type": "string" }
112
- }
113
- }
50
+ "review": { "$ref": "#/$defs/review" }
114
51
  },
115
52
  "$defs": {
116
53
  "reviewer": {
@@ -122,7 +59,7 @@
122
59
  "model": { "type": "string", "minLength": 1 },
123
60
  "options": { "type": "object", "additionalProperties": true },
124
61
  "account": { "type": "string", "minLength": 1 },
125
- "permission": { "$ref": "#/$defs/permission" },
62
+ "permissions": { "$ref": "#/$defs/permissions" },
126
63
  "persona": { "type": "string" }
127
64
  }
128
65
  },
@@ -143,21 +80,120 @@
143
80
  "email": { "type": "string", "minLength": 1 }
144
81
  }
145
82
  },
146
- "permission": { "$ref": "#/$defs/permission" },
83
+ "permissions": { "$ref": "#/$defs/permissions" },
147
84
  "persona": { "type": "string" }
148
85
  }
149
86
  },
150
- "agents": {
87
+ "automation": {
88
+ "type": "object",
89
+ "additionalProperties": false,
90
+ "properties": {
91
+ "merge": { "type": "boolean" },
92
+ "close": { "type": "boolean" }
93
+ }
94
+ },
95
+ "reviewChecks": {
96
+ "type": "object",
97
+ "additionalProperties": false,
98
+ "properties": {
99
+ "exclude": { "type": "array", "items": { "type": "string" } },
100
+ "wait": { "type": "boolean", "default": true },
101
+ "retryFailedJobs": { "type": "integer", "minimum": 0, "default": 3 }
102
+ }
103
+ },
104
+ "mergeChecks": {
105
+ "type": "object",
106
+ "additionalProperties": false,
107
+ "properties": {
108
+ "wait": { "type": "boolean", "default": true }
109
+ }
110
+ },
111
+ "concurrency": {
112
+ "type": "object",
113
+ "additionalProperties": false,
114
+ "properties": {
115
+ "runs": { "type": "integer", "minimum": 1, "default": 3 },
116
+ "reviewers": { "type": "integer", "minimum": 1, "default": 3 }
117
+ }
118
+ },
119
+ "safety": {
120
+ "type": "object",
121
+ "additionalProperties": false,
122
+ "properties": {
123
+ "allowAuthors": { "type": "array", "items": { "type": "string" } },
124
+ "blockedPaths": { "type": "array", "items": { "type": "string" } },
125
+ "maxChangedFiles": { "type": "integer", "minimum": 0 },
126
+ "requiredLabels": { "type": "array", "items": { "type": "string" } }
127
+ }
128
+ },
129
+ "reviewPrompts": {
130
+ "type": "object",
131
+ "additionalProperties": false,
132
+ "properties": {
133
+ "review": { "type": "string" },
134
+ "rereview": { "type": "string" },
135
+ "reviewGuidelines": { "type": "string" },
136
+ "ciClassification": { "type": "string" },
137
+ "findingValidation": { "type": "string" },
138
+ "closeReconsideration": { "type": "string" }
139
+ }
140
+ },
141
+ "mergePrompts": {
142
+ "type": "object",
143
+ "additionalProperties": false,
144
+ "properties": {
145
+ "edit": { "type": "string" },
146
+ "editGuidelines": { "type": "string" },
147
+ "ciClassification": { "type": "string" }
148
+ }
149
+ },
150
+ "reviewMerge": {
151
+ "type": "object",
152
+ "additionalProperties": false,
153
+ "properties": {
154
+ "approvalPolicy": {
155
+ "enum": ["majority", "unanimous"],
156
+ "default": "majority"
157
+ },
158
+ "method": { "enum": ["merge", "squash", "rebase"] },
159
+ "auto": { "type": "boolean" },
160
+ "deleteBranch": { "type": "boolean" },
161
+ "queue": { "type": "boolean", "default": false }
162
+ }
163
+ },
164
+ "review": {
151
165
  "type": "object",
152
166
  "additionalProperties": false,
153
167
  "properties": {
154
- "permissions": { "$ref": "#/$defs/permission" },
155
- "reviewers": {
168
+ "agents": {
156
169
  "type": "array",
157
170
  "minItems": 3,
158
171
  "items": { "$ref": "#/$defs/reviewer" }
159
172
  },
160
- "editor": { "$ref": "#/$defs/editor" }
173
+ "prompts": { "$ref": "#/$defs/reviewPrompts" },
174
+ "checks": { "$ref": "#/$defs/reviewChecks" },
175
+ "safety": { "$ref": "#/$defs/safety" },
176
+ "automation": { "$ref": "#/$defs/automation" },
177
+ "concurrency": { "$ref": "#/$defs/concurrency" },
178
+ "merge": { "$ref": "#/$defs/reviewMerge" },
179
+ "output": { "type": "string" },
180
+ "worktree": { "type": "string" }
181
+ }
182
+ },
183
+ "merge": {
184
+ "type": "object",
185
+ "additionalProperties": false,
186
+ "properties": {
187
+ "editor": { "$ref": "#/$defs/editor" },
188
+ "checks": { "$ref": "#/$defs/mergeChecks" },
189
+ "prompts": { "$ref": "#/$defs/mergePrompts" },
190
+ "automation": { "$ref": "#/$defs/automation" },
191
+ "maxThreadResolutionCycles": {
192
+ "type": "integer",
193
+ "minimum": 0,
194
+ "default": 5,
195
+ "description": "Maximum resolution attempts per unresolved review thread. Set 0 for unlimited attempts."
196
+ }
161
197
  }
162
198
  },
163
199
  "permissionAction": { "enum": ["allow", "ask", "deny"] },
@@ -170,7 +206,7 @@
170
206
  }
171
207
  ]
172
208
  },
173
- "permission": {
209
+ "permissions": {
174
210
  "oneOf": [
175
211
  { "$ref": "#/$defs/permissionAction" },
176
212
  {
@@ -178,23 +214,6 @@
178
214
  "additionalProperties": { "$ref": "#/$defs/permissionRule" }
179
215
  }
180
216
  ]
181
- },
182
- "prompts": {
183
- "type": "object",
184
- "additionalProperties": false,
185
- "properties": {
186
- "review": { "type": "string" },
187
- "rereview": { "type": "string" },
188
- "edit": { "type": "string" },
189
- "editGuidelines": { "type": "string" },
190
- "findingValidation": { "type": "string" },
191
- "closeReconsideration": { "type": "string" },
192
- "rereviewCloseReconsideration": { "type": "string" },
193
- "ciClassification": { "type": "string" },
194
- "ciClassificationAfterEdit": { "type": "string" },
195
- "report": { "type": "string" },
196
- "reviewGuidelines": { "type": "string" }
197
- }
198
217
  }
199
218
  }
200
219
  }
@@ -1,6 +0,0 @@
1
- You requested CLOSE while re-reviewing pull request #{pr} in {owner}/{repo}, but the other reviewers did not.
2
- Reconsider your decision and choose MERGE or CHANGES_REQUESTED instead.
3
- Use the existing re-review session context.
4
- Original close reason:
5
- {closeReason}
6
- Do not edit files or perform write operations.