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.
- package/README.md +14 -10
- package/dist/config/output.js +1 -1
- package/dist/config/resolve.js +44 -26
- package/dist/config/validate.js +199 -191
- package/dist/config/worktree.js +13 -0
- package/dist/github/commands.js +8 -4
- package/dist/index.js +5 -1
- package/dist/orchestrator/merge.js +8 -1
- package/dist/orchestrator/review.js +30 -2
- package/dist/orchestrator/run-manager.js +10 -3
- package/dist/prompts/compose.js +10 -14
- package/dist/prompts/templates/{close-reconsideration.md → review/close-reconsideration.md} +1 -2
- package/package.json +24 -26
- package/schema.json +110 -91
- package/dist/prompts/templates/rereview-close-reconsideration.md +0 -6
- /package/dist/prompts/templates/{ci-classification-after-edit.md → merge/ci-classification.md} +0 -0
- /package/dist/prompts/templates/{edit.md → merge/edit.md} +0 -0
- /package/dist/prompts/templates/{ci-classification.md → review/ci-classification.md} +0 -0
- /package/dist/prompts/templates/{finding-validation.md → review/finding-validation.md} +0 -0
- /package/dist/prompts/templates/{rereview.md → review/rereview.md} +0 -0
- /package/dist/prompts/templates/{review.md → review/review.md} +0 -0
|
@@ -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 =
|
|
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
|
package/dist/prompts/compose.js
CHANGED
|
@@ -34,7 +34,7 @@ function repositoryValues(repository) {
|
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
36
|
function reviewValues(input) {
|
|
37
|
-
const ciFailureContext = input.ciFailureContext?.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: "
|
|
234
|
-
customPath: input.repository.prompts.
|
|
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
|
|
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.
|
|
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/
|
|
9
|
+
"url": "https://github.com/magi-ai/opencode-magi"
|
|
10
10
|
},
|
|
11
11
|
"bugs": {
|
|
12
|
-
"url": "https://github.com/
|
|
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": "
|
|
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.
|
|
41
|
+
"@types/node": "^25.9.0",
|
|
58
42
|
"@types/picomatch": "^4.0.3",
|
|
59
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
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.
|
|
64
|
-
"oxlint": "^1.
|
|
65
|
-
"oxlint-tsgolint": "^0.
|
|
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": {
|
|
9
|
-
"automation": {
|
|
8
|
+
"agents": {
|
|
10
9
|
"type": "object",
|
|
11
10
|
"additionalProperties": false,
|
|
12
11
|
"properties": {
|
|
13
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
"
|
|
83
|
+
"permissions": { "$ref": "#/$defs/permissions" },
|
|
147
84
|
"persona": { "type": "string" }
|
|
148
85
|
}
|
|
149
86
|
},
|
|
150
|
-
"
|
|
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
|
-
"
|
|
155
|
-
"reviewers": {
|
|
168
|
+
"agents": {
|
|
156
169
|
"type": "array",
|
|
157
170
|
"minItems": 3,
|
|
158
171
|
"items": { "$ref": "#/$defs/reviewer" }
|
|
159
172
|
},
|
|
160
|
-
"
|
|
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
|
-
"
|
|
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.
|
/package/dist/prompts/templates/{ci-classification-after-edit.md → merge/ci-classification.md}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|