mergestorm-mcp 0.2.29 → 0.2.30
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 +1 -1
- package/dist/index.js +20 -14
- package/dist/lib/server.d.ts +1 -1
- package/dist/lib/server.js +9 -8
- package/dist/lib/tools/issue-create.js +1 -1
- package/dist/lib/tools/issue-review-wait.d.ts +1 -1
- package/dist/lib/tools/issue-review-wait.js +14 -7
- package/dist/lib/tools/repo-settings.js +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -18,7 +18,7 @@ Every tool declares MCP `annotations` for read-only access, destructive changes,
|
|
|
18
18
|
|
|
19
19
|
`issue_create({ title, body?, labels?, owner?, repo?, cwd? })` opens a GitHub issue through Mergestorm with no GitHub credentials: the Surge App creates it and names the caller in the body. It defaults to the origin repository of `cwd`. Labels must already exist on the repository. The same title again returns the open issue it already made (`created: false`), so a retry does not duplicate it. Then call `issue_review_wait` and open the pull request, with `Fixes #<number>` in the commit or pull request body, only once the issue is approved.
|
|
20
20
|
|
|
21
|
-
`issue_review_wait({ owner, repo, number, timeout_s? })` reads the Vortex review of an issue: `state` (`approved`, `needs_answers`, `pending`, `unreviewed`, `capped` or `off`), the round, the verdict, up to 8 points, the review comment link and `next`, one sentence saying what to do. `timeout_s: 0` reads it once; otherwise it waits while the review is pending, for up to 45s (the default), and returns `pending` when the slice ends. On `needs_answers
|
|
21
|
+
`issue_review_wait({ owner, repo, number, timeout_s? })` reads the Vortex review of an issue: `state` (`approved`, `needs_answers`, `pending`, `unreviewed`, `capped` or `off`), the round, the verdict, up to 8 points, the review comment link and `next`, one sentence saying what to do. `timeout_s: 0` reads it once; otherwise it waits while the review is pending, for up to 45s (the default), and returns `pending` when the slice ends. On `needs_answers`, reply once in a comment on the issue, accepting each blocking point's suggested fix or saying why not (notes do not block; the PR review checks them against the code), and call it again; Vortex re-checks only the blocking points, once, and approves the issue. On `unreviewed`, comment on the issue to start a review. A person can approve early with an issue comment whose first line is `mergestorm-issue: approve`. `stack_publish` refuses with `issue_not_approved`, naming each issue's state and points, when it would open a pull request, or register one no stack tracks, whose linked issue is not approved. `stack_adopt` does not check issues.
|
|
22
22
|
|
|
23
23
|
The agent tools start work on the user's own pull requests and repositories (`POST /api/v1/agents/...`):
|
|
24
24
|
|
package/dist/index.js
CHANGED
|
@@ -138,7 +138,7 @@ async function issueCreate(input, cfg, deps = {}) {
|
|
|
138
138
|
cfg
|
|
139
139
|
);
|
|
140
140
|
return {
|
|
141
|
-
summary: `${issue.created ? "Opened" : "Already open:"} ${target2.owner}/${target2.repo}#${issue.number} ${issue.url}. Call issue_review_wait for #${issue.number} and open the pull request
|
|
141
|
+
summary: `${issue.created ? "Opened" : "Already open:"} ${target2.owner}/${target2.repo}#${issue.number} ${issue.url}. Call issue_review_wait for #${issue.number} and open the pull request once it says you may, with "Fixes #${issue.number}" in the commit or pull request body.`,
|
|
142
142
|
data: { owner: target2.owner, repo: target2.repo, ...issue }
|
|
143
143
|
};
|
|
144
144
|
} catch (err) {
|
|
@@ -161,6 +161,7 @@ async function issueCreate(input, cfg, deps = {}) {
|
|
|
161
161
|
import {
|
|
162
162
|
CommandError as CommandError3,
|
|
163
163
|
IssueReviewTimeoutError,
|
|
164
|
+
NO_LINKED_ISSUE,
|
|
164
165
|
getIssueReview,
|
|
165
166
|
loadConfig as loadConfig2,
|
|
166
167
|
pollIssueReview
|
|
@@ -174,15 +175,18 @@ var issueReviewWaitSchema = {
|
|
|
174
175
|
timeout_s: z2.number().min(0).max(ISSUE_REVIEW_WAIT_MAX_S).optional()
|
|
175
176
|
};
|
|
176
177
|
var inputSchema2 = z2.object(issueReviewWaitSchema);
|
|
178
|
+
function blockingCount(status) {
|
|
179
|
+
return status.points.filter((point) => point.blocking !== false).length;
|
|
180
|
+
}
|
|
177
181
|
function issueReviewSummary(status) {
|
|
178
182
|
const ref = `${status.owner}/${status.repo}#${status.number}`;
|
|
179
183
|
const round = status.round ? ` (round ${status.round} of ${status.maxRounds})` : "";
|
|
180
|
-
const head = status.state === "approved" ? `${ref} is approved by ${status.approvedBy === "human" ? "a person" : "Vortex"}; you may open the pull request.` : status.state === "off" ? `Issue reviews are off for ${status.owner}/${status.repo}; ${ref} needs no approval.` : status.state === "pending" ? `${ref}: Vortex is still reviewing${round}; call issue_review_wait again.` : `${ref}: ${status.state}${round}, ${status
|
|
184
|
+
const head = status.state === "approved" ? status.approvedBy === null ? `The Vortex review of ${ref} failed, so it does not hold the pull request back; you may open it.` : `${ref} is approved by ${status.approvedBy === "human" ? "a person" : "Vortex"}; you may open the pull request.` : status.state === "off" ? `Issue reviews are off for ${status.owner}/${status.repo}; ${ref} needs no approval.` : status.mode === "mention" && status.state === "unreviewed" ? `Issue reviews for ${status.owner}/${status.repo} run on mention; ${ref} needs no approval, so you may open the pull request.` : status.state === "pending" ? `${ref}: Vortex is still reviewing${round}; call issue_review_wait again.` : `${ref}: ${status.state}${round}, ${blockingCount(status)} point${blockingCount(status) === 1 ? "" : "s"} to answer.${status.mode === "auto" ? " Do not open the pull request yet." : ""}`;
|
|
181
185
|
return status.next ? `${head} ${status.next}` : head;
|
|
182
186
|
}
|
|
183
|
-
var ISSUE_NOT_APPROVED_HINT = "Do not open the pull request yet:
|
|
187
|
+
var ISSUE_NOT_APPROVED_HINT = "Do not open the pull request yet: reply once in a comment on each issue, accepting each blocking point's suggested fix or saying why not (notes do not block), call issue_review_wait until it returns approved, then try again.";
|
|
184
188
|
function withIssueReviewHint(err, message) {
|
|
185
|
-
return err instanceof CommandError3 && err.code === "issue_not_approved" ? `${message}
|
|
189
|
+
return err instanceof CommandError3 && err.code === "issue_not_approved" && err.reason !== NO_LINKED_ISSUE ? `${message}
|
|
186
190
|
${ISSUE_NOT_APPROVED_HINT}` : message;
|
|
187
191
|
}
|
|
188
192
|
function failure(code, message, extra = {}) {
|
|
@@ -1334,7 +1338,8 @@ var ARG_BY_KEY = {
|
|
|
1334
1338
|
merge_queue_batch_size: "merge_queue_batch_size",
|
|
1335
1339
|
merge_queue_lands_alone_paths: "merge_queue_lands_alone_paths",
|
|
1336
1340
|
merge_queue_overdrive: "merge_queue_overdrive",
|
|
1337
|
-
issue_review_enabled: "issue_review"
|
|
1341
|
+
issue_review_enabled: "issue_review",
|
|
1342
|
+
issue_auto_review_enabled: "issue_auto_review"
|
|
1338
1343
|
};
|
|
1339
1344
|
function parseRepo(raw) {
|
|
1340
1345
|
const match = typeof raw === "string" ? /^([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)$/.exec(raw.trim()) : null;
|
|
@@ -1868,7 +1873,7 @@ var MCP_HOSTED_SERVER_INSTRUCTIONS = [
|
|
|
1868
1873
|
// src/server.ts
|
|
1869
1874
|
var BATCH_SIZE_ROW = BEARER_SETTINGS2.find((row) => row.key === "merge_queue_batch_size");
|
|
1870
1875
|
var MCP_SERVER_NAME = "mergestorm";
|
|
1871
|
-
var MCP_SERVER_VERSION = "0.2.
|
|
1876
|
+
var MCP_SERVER_VERSION = "0.2.30";
|
|
1872
1877
|
var MCP_TOOL_NAMES = [
|
|
1873
1878
|
"whoami",
|
|
1874
1879
|
"credits",
|
|
@@ -1953,7 +1958,7 @@ var HOSTED_REVIEW_WAIT_PR_DESCRIPTION = "Read the Vortex pass on a GitHub PR; re
|
|
|
1953
1958
|
var HOSTED_REVIEW_DISMISS_DESCRIPTION = `Dismiss Vortex findings you checked and found wrong or not actionable, at the PR's live head: head_sha, review_id, finding_ids (the GitHub review comment ids, offdiff-<n> for a body-only finding; preview: true lists them without writing) or scope "review" to dismiss every finding of that review, and a reason of at least 20 characters. A deferral needs evidence_url set to an open tracking issue in the same repository. Refused, with nothing written, when the head moved, an id is unknown or the user's GitHub account lacks write access; retries are idempotent. Returns which gates cleared (gate.vortex.cleared, else gate.vortex.message) and the stack watch.`;
|
|
1954
1959
|
var HOSTED_STACK_STATUS_DESCRIPTION = "Read one owned stack: its layers, checks and agent state, with the same attention, issues, repair and currentCandidate as stack_wait. Use it to see where a stack stands now; to wait for a change, use stack_wait.";
|
|
1955
1960
|
var HOSTED_STACK_WAIT_DESCRIPTION = "Wait up to timeout_s (1-45) for a stack to need attention, or read it once with 0. Returns a mergestorm.stack_watch/v1 envelope: attention names the PR, blocker and repair; waiting or in_progress means call again with watch.next.args; watch.done true means stop (landed, closed, archived or gone).";
|
|
1956
|
-
var HOSTED_ISSUE_CREATE_DESCRIPTION = "Open a GitHub issue through Mergestorm with no GitHub credentials: the Surge App creates it and names you in the body. Use it for the issue a pull request must have before it is opened, then put Fixes #<number> in the commit or pull request body. owner and repo name the repository. labels must already exist on the repository; an unknown one is refused with unknown_label and nothing is created. Calling it again with the same title returns the open issue it already made (created: false) when that issue is among the newest 100 open issues of the repository; an older one, or two calls at the same time, can still create a duplicate, so check the returned number before retrying after a lost response. Needs write access to the repository through your linked GitHub account and Surge installed on it. After creating it, call issue_review_wait with the returned number and do not open a pull request until the issue is approved:
|
|
1961
|
+
var HOSTED_ISSUE_CREATE_DESCRIPTION = "Open a GitHub issue through Mergestorm with no GitHub credentials: the Surge App creates it and names you in the body. Use it for the issue a pull request must have before it is opened, then put Fixes #<number> in the commit or pull request body. owner and repo name the repository. labels must already exist on the repository; an unknown one is refused with unknown_label and nothing is created. Calling it again with the same title returns the open issue it already made (created: false) when that issue is among the newest 100 open issues of the repository; an older one, or two calls at the same time, can still create a duplicate, so check the returned number before retrying after a lost response. Needs write access to the repository through your linked GitHub account and Surge installed on it. After creating it, call issue_review_wait with the returned number and do not open a pull request until the issue is approved: reply once in an issue comment, accepting each blocking point's suggested fix or saying why not (notes do not block; Vortex re-checks the blocking points once and approves), then call issue_review_wait again.";
|
|
1957
1962
|
function createMergestormMcpServer(options = {}) {
|
|
1958
1963
|
const { config, hosted = false } = options;
|
|
1959
1964
|
const chatId = breezeChatId(options.chatId ?? (hosted ? null : process.env.MERGESTORM_CHAT_ID));
|
|
@@ -2211,7 +2216,7 @@ function createMergestormMcpServer(options = {}) {
|
|
|
2211
2216
|
"issue_create",
|
|
2212
2217
|
{
|
|
2213
2218
|
title: "Open GitHub issue",
|
|
2214
|
-
description: hosted ? HOSTED_ISSUE_CREATE_DESCRIPTION : "Open a GitHub issue through Mergestorm with no GitHub credentials: the Surge App creates it and names you in the body. Use it for the issue a pull request must have before it is opened, then put Fixes #<number> in the commit or pull request body. Defaults to the origin repository of cwd; pass owner and repo together to name another. labels must already exist on the repository; an unknown one is refused with unknown_label and nothing is created. Calling it again with the same title returns the open issue it already made (created: false) when that issue is among the newest 100 open issues of the repository; an older one, or two calls at the same time, can still create a duplicate, so check the returned number before retrying after a lost response. Needs write access to the repository through your linked GitHub account and Surge installed on it. After creating it, call issue_review_wait with the returned number and do not open a pull request until the issue is approved:
|
|
2219
|
+
description: hosted ? HOSTED_ISSUE_CREATE_DESCRIPTION : "Open a GitHub issue through Mergestorm with no GitHub credentials: the Surge App creates it and names you in the body. Use it for the issue a pull request must have before it is opened, then put Fixes #<number> in the commit or pull request body. Defaults to the origin repository of cwd; pass owner and repo together to name another. labels must already exist on the repository; an unknown one is refused with unknown_label and nothing is created. Calling it again with the same title returns the open issue it already made (created: false) when that issue is among the newest 100 open issues of the repository; an older one, or two calls at the same time, can still create a duplicate, so check the returned number before retrying after a lost response. Needs write access to the repository through your linked GitHub account and Surge installed on it. After creating it, call issue_review_wait with the returned number and do not open a pull request until the issue is approved: reply once in an issue comment, accepting each blocking point's suggested fix or saying why not (notes do not block; Vortex re-checks the blocking points once and approves), then call issue_review_wait again.",
|
|
2215
2220
|
inputSchema: hosted ? hostedIssueCreateSchema : issueCreateSchema,
|
|
2216
2221
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true }
|
|
2217
2222
|
},
|
|
@@ -2227,7 +2232,7 @@ function createMergestormMcpServer(options = {}) {
|
|
|
2227
2232
|
"issue_review_wait",
|
|
2228
2233
|
{
|
|
2229
2234
|
title: "Wait for issue review",
|
|
2230
|
-
description: "Read the Vortex review of a GitHub issue, which on repositories with issue reviews on must approve the issue before any pull request is opened for it. Returns the review state (approved, needs_answers, pending, unreviewed, capped or off), the round, the verdict, the summary, up to 8 points, the review comment link and next, one sentence saying what to do. timeout_s: 0 reads it once; otherwise it waits while the review is pending for one slice of up to 45s (the default) and returns pending when the slice ends, so call again. Open the pull request only on approved or off. On needs_answers
|
|
2235
|
+
description: "Read the Vortex review of a GitHub issue, which on repositories with issue reviews on must approve the issue before any pull request is opened for it. Returns the review state (approved, needs_answers, pending, unreviewed, capped or off), the round, the verdict, the summary, up to 8 points, the review comment link and next, one sentence saying what to do. timeout_s: 0 reads it once; otherwise it waits while the review is pending for one slice of up to 45s (the default) and returns pending when the slice ends, so call again. Open the pull request only on approved or off. On needs_answers, reply once in a comment on the issue: for each blocking point, accept its suggested fix or say why not (notes do not block; the PR review checks them against the code). Vortex then re-checks only the blocking points and approves the issue. On unreviewed, comment on the issue tagging @mergestorm-vortex to start a review, unless mode is mention, where an unreviewed issue needs no approval. Then call again. A person can also approve with an issue comment whose first line is mergestorm-issue: approve.",
|
|
2231
2236
|
inputSchema: issueReviewWaitSchema,
|
|
2232
2237
|
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }
|
|
2233
2238
|
},
|
|
@@ -2422,7 +2427,7 @@ function createMergestormMcpServer(options = {}) {
|
|
|
2422
2427
|
"repo_settings_get",
|
|
2423
2428
|
{
|
|
2424
2429
|
title: "Get repository settings",
|
|
2425
|
-
description: "Read the repository-level Auto patch, Auto review, Auto land, merge queue (merge_queue_batch_enabled, merge_queue_batch_size, merge_queue_lands_alone_paths) and merge queue overdrive values for the repositories connected to this account. auto_patch_enabled, auto_review_enabled, auto_land_default, merge_queue_batch_enabled and merge_queue_overdrive are true, false, or null; merge_queue_batch_size is a whole number or null; merge_queue_lands_alone_paths is a list of path patterns or null. null means not set, so the account setting applies. Auto patch and Auto review precedence is the stack override (stack_set), then the repository value, then the account setting (settings_get). The Auto land repository value only seeds new stacks at adoption; it does not override an existing stack. merge_queue_overdrive is the repository value over the account default; while it resolves on, that repository batches up to 10 queued pull requests. issue_review_enabled is true, false, or null: the repository value for Vortex issue reviews over the account default (settings_get issue_review_enabled). Pass repo as owner/repo for one repository, or omit it for all.",
|
|
2430
|
+
description: "Read the repository-level Auto patch, Auto review, Auto land, merge queue (merge_queue_batch_enabled, merge_queue_batch_size, merge_queue_lands_alone_paths) and merge queue overdrive values for the repositories connected to this account. auto_patch_enabled, auto_review_enabled, auto_land_default, merge_queue_batch_enabled and merge_queue_overdrive are true, false, or null; merge_queue_batch_size is a whole number or null; merge_queue_lands_alone_paths is a list of path patterns or null. null means not set, so the account setting applies. Auto patch and Auto review precedence is the stack override (stack_set), then the repository value, then the account setting (settings_get). The Auto land repository value only seeds new stacks at adoption; it does not override an existing stack. merge_queue_overdrive is the repository value over the account default; while it resolves on, that repository batches up to 10 queued pull requests. issue_review_enabled is true, false, or null: the repository value for Vortex issue reviews over the account default (settings_get issue_review_enabled). issue_auto_review_enabled is true, false, or null the same way: while issue reviews are on, true reviews every new issue and reply, and false reviews only when a comment tags @mergestorm-vortex. Pass repo as owner/repo for one repository, or omit it for all.",
|
|
2426
2431
|
inputSchema: { repo: z8.string().min(3).optional() },
|
|
2427
2432
|
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }
|
|
2428
2433
|
},
|
|
@@ -2438,7 +2443,7 @@ function createMergestormMcpServer(options = {}) {
|
|
|
2438
2443
|
"repo_settings_set",
|
|
2439
2444
|
{
|
|
2440
2445
|
title: "Update repository settings",
|
|
2441
|
-
description: "Set Auto patch (Cyclone), Auto review (Vortex), the Auto land default, or the merge queue settings (merge_queue_batch, merge_queue_batch_size, merge_queue_lands_alone_paths, merge_queue_overdrive) for every stack and pull request in one repository connected to this account, and return the stored result. A value sets the repository value; null clears it so the account setting applies again. A stack override (stack_set) still wins for that stack. auto_patch and auto_review apply to open stacks without an override from their next decision; nothing is cancelled or re-queued. auto_land only seeds new stacks. merge_queue_lands_alone_paths is a list of folder prefixes or globs; a queued pull request that changes a matching file is never batched with others, and an empty list keeps only the built-in rule that a stack with more than one open pull request lands alone. merge_queue_overdrive true makes that repository batch up to 10 queued pull requests, even with batching off; false turns overdrive off for that repository whatever the account default is, and null clears the repository value so the account default (settings_get merge_queue_overdrive) applies again. issue_review true or false turns Vortex issue reviews on or off for that repository whatever the account default is; null clears the repository value so the account default (settings_get issue_review_enabled) applies again. Only the account that connected the repository can change it. Never changes account settings.",
|
|
2446
|
+
description: "Set Auto patch (Cyclone), Auto review (Vortex), the Auto land default, or the merge queue settings (merge_queue_batch, merge_queue_batch_size, merge_queue_lands_alone_paths, merge_queue_overdrive) for every stack and pull request in one repository connected to this account, and return the stored result. A value sets the repository value; null clears it so the account setting applies again. A stack override (stack_set) still wins for that stack. auto_patch and auto_review apply to open stacks without an override from their next decision; nothing is cancelled or re-queued. auto_land only seeds new stacks. merge_queue_lands_alone_paths is a list of folder prefixes or globs; a queued pull request that changes a matching file is never batched with others, and an empty list keeps only the built-in rule that a stack with more than one open pull request lands alone. merge_queue_overdrive true makes that repository batch up to 10 queued pull requests, even with batching off; false turns overdrive off for that repository whatever the account default is, and null clears the repository value so the account default (settings_get merge_queue_overdrive) applies again. issue_review true or false turns Vortex issue reviews on or off for that repository whatever the account default is; null clears the repository value so the account default (settings_get issue_review_enabled) applies again. issue_auto_review false makes those reviews run only when a comment tags @mergestorm-vortex (opening a PR then needs no issue approval), true reviews every new issue and reply, and null inherits the account default (settings_get issue_auto_review_enabled). Only the account that connected the repository can change it. Never changes account settings.",
|
|
2442
2447
|
inputSchema: {
|
|
2443
2448
|
repo: z8.string().min(3),
|
|
2444
2449
|
auto_patch: z8.boolean().nullable().optional(),
|
|
@@ -2448,7 +2453,8 @@ function createMergestormMcpServer(options = {}) {
|
|
|
2448
2453
|
merge_queue_batch_size: z8.number().int().min(BATCH_SIZE_ROW.min).max(BATCH_SIZE_ROW.max).nullable().optional(),
|
|
2449
2454
|
merge_queue_lands_alone_paths: z8.array(z8.string()).nullable().optional(),
|
|
2450
2455
|
merge_queue_overdrive: z8.boolean().nullable().optional(),
|
|
2451
|
-
issue_review: z8.boolean().nullable().optional()
|
|
2456
|
+
issue_review: z8.boolean().nullable().optional(),
|
|
2457
|
+
issue_auto_review: z8.boolean().nullable().optional()
|
|
2452
2458
|
},
|
|
2453
2459
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true }
|
|
2454
2460
|
},
|
|
@@ -2480,7 +2486,7 @@ function createMergestormMcpServer(options = {}) {
|
|
|
2480
2486
|
"settings_get",
|
|
2481
2487
|
{
|
|
2482
2488
|
title: "Get settings",
|
|
2483
|
-
description: "Read the Bearer /api/v1/settings toggles, including auto_patch_enabled, auto_land_settle_seconds (how long Auto land waits before queueing), merge_queue_batch_enabled and merge_queue_batch_size (whether the merge queue tests several pull requests on one CI run, and how many), merge_queue_overdrive (the account default for overdrive: the merge queue batches up to 10 queued pull requests per repository; repo_settings_set overrides it per repository), issue_review_enabled (the account default for Vortex issue reviews; repo_settings_set overrides it per repository), cyclone_connected (the Cyclone auto-patch App), and stacks_ready (whether stacks, the merge queue and Auto land can run for this account, which needs Mergestorm Surge).",
|
|
2489
|
+
description: "Read the Bearer /api/v1/settings toggles, including auto_patch_enabled, auto_land_settle_seconds (how long Auto land waits before queueing), merge_queue_batch_enabled and merge_queue_batch_size (whether the merge queue tests several pull requests on one CI run, and how many), merge_queue_overdrive (the account default for overdrive: the merge queue batches up to 10 queued pull requests per repository; repo_settings_set overrides it per repository), issue_review_enabled (the account default for Vortex issue reviews; repo_settings_set overrides it per repository), issue_auto_review_enabled (the account default for whether those reviews run on every issue or only when a comment tags @mergestorm-vortex), cyclone_connected (the Cyclone auto-patch App), and stacks_ready (whether stacks, the merge queue and Auto land can run for this account, which needs Mergestorm Surge).",
|
|
2484
2490
|
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true }
|
|
2485
2491
|
},
|
|
2486
2492
|
async () => {
|
|
@@ -2495,7 +2501,7 @@ function createMergestormMcpServer(options = {}) {
|
|
|
2495
2501
|
"settings_set",
|
|
2496
2502
|
{
|
|
2497
2503
|
title: "Update settings",
|
|
2498
|
-
description: "Update writable Bearer /api/v1/settings values and return the stored result. At least one key is required. auto_land_settle_seconds is a whole number of seconds from 15 through 300; it applies to settle clocks that start after the write. merge_queue_batch_enabled turns merge queue batching on or off for the account, merge_queue_batch_size is a whole number from 2 through 10, merge_queue_lands_alone_paths is the list of folder prefixes or globs whose changed files keep a pull request out of a batch, and merge_queue_overdrive is the account default for overdrive: while it resolves on, a repository batches up to 10 queued pull requests, even with batching off, without changing merge_queue_batch_size, and it stays on until turned off (repo_settings_set overrides each of these per repository). issue_review_enabled is the account default for Vortex issue reviews; repo_settings_set issue_review overrides it per repository. cyclone_connected and github_connected are read-only and cannot be set.",
|
|
2504
|
+
description: "Update writable Bearer /api/v1/settings values and return the stored result. At least one key is required. auto_land_settle_seconds is a whole number of seconds from 15 through 300; it applies to settle clocks that start after the write. merge_queue_batch_enabled turns merge queue batching on or off for the account, merge_queue_batch_size is a whole number from 2 through 10, merge_queue_lands_alone_paths is the list of folder prefixes or globs whose changed files keep a pull request out of a batch, and merge_queue_overdrive is the account default for overdrive: while it resolves on, a repository batches up to 10 queued pull requests, even with batching off, without changing merge_queue_batch_size, and it stays on until turned off (repo_settings_set overrides each of these per repository). issue_review_enabled is the account default for Vortex issue reviews; repo_settings_set issue_review overrides it per repository. issue_auto_review_enabled false makes them run only when a comment tags @mergestorm-vortex; repo_settings_set issue_auto_review overrides it per repository. cyclone_connected and github_connected are read-only and cannot be set.",
|
|
2499
2505
|
inputSchema: {
|
|
2500
2506
|
...Object.fromEntries(
|
|
2501
2507
|
BEARER_SETTINGS2.map((row) => [
|
package/dist/lib/server.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { type Config } from "mergestorm/client";
|
|
|
3
3
|
import { MCP_HOSTED_SERVER_INSTRUCTIONS } from "./pr-loop-instructions.js";
|
|
4
4
|
export { MCP_HOSTED_SERVER_INSTRUCTIONS };
|
|
5
5
|
export declare const MCP_SERVER_NAME = "mergestorm";
|
|
6
|
-
export declare const MCP_SERVER_VERSION = "0.2.
|
|
6
|
+
export declare const MCP_SERVER_VERSION = "0.2.30";
|
|
7
7
|
export declare const MCP_TOOL_NAMES: readonly ["whoami", "credits", "review_list", "review_submit", "review_wait", "review_wait_pr", "review_dismiss", "review_start_pr", "review_stop_pr", "cyclone_start", "cyclone_job", "issue_create", "issue_review_wait", "stack_adopt", "stack_enqueue", "stack_list", "stack_publish", "stack_publish_status", "stack_restack", "stack_set", "stack_status", "stack_wait", "queue_status", "settings_get", "settings_set", "repo_settings_get", "repo_settings_set", "surge_setup", "list_memories", "search_memory", "remember", "update_memory", "forget_memory", "get_memory_mode", "set_memory_mode", "web_search", "read_web_page"];
|
|
8
8
|
export declare const MCP_SERVER_INSTRUCTIONS: string;
|
|
9
9
|
export declare function fail(err: unknown): {
|
package/dist/lib/server.js
CHANGED
|
@@ -32,7 +32,7 @@ import { whoami } from "./tools/whoami.js";
|
|
|
32
32
|
import { MCP_FINDING_DEFERRAL_RULE, MCP_HOSTED_SERVER_INSTRUCTIONS, MCP_STACK_DONE_INSTRUCTIONS, MCP_PR_LOOP_INSTRUCTIONS, MCP_STACK_BASE_INSTRUCTIONS, MCP_STACK_WATCH_INSTRUCTIONS, } from "./pr-loop-instructions.js";
|
|
33
33
|
export { MCP_HOSTED_SERVER_INSTRUCTIONS };
|
|
34
34
|
export const MCP_SERVER_NAME = "mergestorm";
|
|
35
|
-
export const MCP_SERVER_VERSION = "0.2.
|
|
35
|
+
export const MCP_SERVER_VERSION = "0.2.30";
|
|
36
36
|
export const MCP_TOOL_NAMES = [
|
|
37
37
|
"whoami",
|
|
38
38
|
"credits",
|
|
@@ -121,7 +121,7 @@ const HOSTED_REVIEW_WAIT_PR_DESCRIPTION = "Read the Vortex pass on a GitHub PR;
|
|
|
121
121
|
const HOSTED_REVIEW_DISMISS_DESCRIPTION = "Dismiss Vortex findings you checked and found wrong or not actionable, at the PR's live head: head_sha, review_id, finding_ids (the GitHub review comment ids, offdiff-<n> for a body-only finding; preview: true lists them without writing) or scope \"review\" to dismiss every finding of that review, and a reason of at least 20 characters. A deferral needs evidence_url set to an open tracking issue in the same repository. Refused, with nothing written, when the head moved, an id is unknown or the user's GitHub account lacks write access; retries are idempotent. Returns which gates cleared (gate.vortex.cleared, else gate.vortex.message) and the stack watch.";
|
|
122
122
|
const HOSTED_STACK_STATUS_DESCRIPTION = "Read one owned stack: its layers, checks and agent state, with the same attention, issues, repair and currentCandidate as stack_wait. Use it to see where a stack stands now; to wait for a change, use stack_wait.";
|
|
123
123
|
const HOSTED_STACK_WAIT_DESCRIPTION = "Wait up to timeout_s (1-45) for a stack to need attention, or read it once with 0. Returns a mergestorm.stack_watch/v1 envelope: attention names the PR, blocker and repair; waiting or in_progress means call again with watch.next.args; watch.done true means stop (landed, closed, archived or gone).";
|
|
124
|
-
const HOSTED_ISSUE_CREATE_DESCRIPTION = "Open a GitHub issue through Mergestorm with no GitHub credentials: the Surge App creates it and names you in the body. Use it for the issue a pull request must have before it is opened, then put Fixes #<number> in the commit or pull request body. owner and repo name the repository. labels must already exist on the repository; an unknown one is refused with unknown_label and nothing is created. Calling it again with the same title returns the open issue it already made (created: false) when that issue is among the newest 100 open issues of the repository; an older one, or two calls at the same time, can still create a duplicate, so check the returned number before retrying after a lost response. Needs write access to the repository through your linked GitHub account and Surge installed on it. After creating it, call issue_review_wait with the returned number and do not open a pull request until the issue is approved:
|
|
124
|
+
const HOSTED_ISSUE_CREATE_DESCRIPTION = "Open a GitHub issue through Mergestorm with no GitHub credentials: the Surge App creates it and names you in the body. Use it for the issue a pull request must have before it is opened, then put Fixes #<number> in the commit or pull request body. owner and repo name the repository. labels must already exist on the repository; an unknown one is refused with unknown_label and nothing is created. Calling it again with the same title returns the open issue it already made (created: false) when that issue is among the newest 100 open issues of the repository; an older one, or two calls at the same time, can still create a duplicate, so check the returned number before retrying after a lost response. Needs write access to the repository through your linked GitHub account and Surge installed on it. After creating it, call issue_review_wait with the returned number and do not open a pull request until the issue is approved: reply once in an issue comment, accepting each blocking point's suggested fix or saying why not (notes do not block; Vortex re-checks the blocking points once and approves), then call issue_review_wait again.";
|
|
125
125
|
export function createMergestormMcpServer(options = {}) {
|
|
126
126
|
const { config, hosted = false } = options;
|
|
127
127
|
const chatId = breezeChatId(options.chatId ?? (hosted ? null : process.env.MERGESTORM_CHAT_ID));
|
|
@@ -338,7 +338,7 @@ export function createMergestormMcpServer(options = {}) {
|
|
|
338
338
|
title: "Open GitHub issue",
|
|
339
339
|
description: hosted
|
|
340
340
|
? HOSTED_ISSUE_CREATE_DESCRIPTION
|
|
341
|
-
: "Open a GitHub issue through Mergestorm with no GitHub credentials: the Surge App creates it and names you in the body. Use it for the issue a pull request must have before it is opened, then put Fixes #<number> in the commit or pull request body. Defaults to the origin repository of cwd; pass owner and repo together to name another. labels must already exist on the repository; an unknown one is refused with unknown_label and nothing is created. Calling it again with the same title returns the open issue it already made (created: false) when that issue is among the newest 100 open issues of the repository; an older one, or two calls at the same time, can still create a duplicate, so check the returned number before retrying after a lost response. Needs write access to the repository through your linked GitHub account and Surge installed on it. After creating it, call issue_review_wait with the returned number and do not open a pull request until the issue is approved:
|
|
341
|
+
: "Open a GitHub issue through Mergestorm with no GitHub credentials: the Surge App creates it and names you in the body. Use it for the issue a pull request must have before it is opened, then put Fixes #<number> in the commit or pull request body. Defaults to the origin repository of cwd; pass owner and repo together to name another. labels must already exist on the repository; an unknown one is refused with unknown_label and nothing is created. Calling it again with the same title returns the open issue it already made (created: false) when that issue is among the newest 100 open issues of the repository; an older one, or two calls at the same time, can still create a duplicate, so check the returned number before retrying after a lost response. Needs write access to the repository through your linked GitHub account and Surge installed on it. After creating it, call issue_review_wait with the returned number and do not open a pull request until the issue is approved: reply once in an issue comment, accepting each blocking point's suggested fix or saying why not (notes do not block; Vortex re-checks the blocking points once and approves), then call issue_review_wait again.",
|
|
342
342
|
inputSchema: hosted ? hostedIssueCreateSchema : issueCreateSchema,
|
|
343
343
|
annotations: { readOnlyHint: false, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
344
344
|
}, async (args) => {
|
|
@@ -351,7 +351,7 @@ export function createMergestormMcpServer(options = {}) {
|
|
|
351
351
|
});
|
|
352
352
|
addTool("issue_review_wait", {
|
|
353
353
|
title: "Wait for issue review",
|
|
354
|
-
description: "Read the Vortex review of a GitHub issue, which on repositories with issue reviews on must approve the issue before any pull request is opened for it. Returns the review state (approved, needs_answers, pending, unreviewed, capped or off), the round, the verdict, the summary, up to 8 points, the review comment link and next, one sentence saying what to do. timeout_s: 0 reads it once; otherwise it waits while the review is pending for one slice of up to 45s (the default) and returns pending when the slice ends, so call again. Open the pull request only on approved or off. On needs_answers
|
|
354
|
+
description: "Read the Vortex review of a GitHub issue, which on repositories with issue reviews on must approve the issue before any pull request is opened for it. Returns the review state (approved, needs_answers, pending, unreviewed, capped or off), the round, the verdict, the summary, up to 8 points, the review comment link and next, one sentence saying what to do. timeout_s: 0 reads it once; otherwise it waits while the review is pending for one slice of up to 45s (the default) and returns pending when the slice ends, so call again. Open the pull request only on approved or off. On needs_answers, reply once in a comment on the issue: for each blocking point, accept its suggested fix or say why not (notes do not block; the PR review checks them against the code). Vortex then re-checks only the blocking points and approves the issue. On unreviewed, comment on the issue tagging @mergestorm-vortex to start a review, unless mode is mention, where an unreviewed issue needs no approval. Then call again. A person can also approve with an issue comment whose first line is mergestorm-issue: approve.",
|
|
355
355
|
inputSchema: issueReviewWaitSchema,
|
|
356
356
|
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
357
357
|
}, async (args) => {
|
|
@@ -513,7 +513,7 @@ export function createMergestormMcpServer(options = {}) {
|
|
|
513
513
|
});
|
|
514
514
|
addTool("repo_settings_get", {
|
|
515
515
|
title: "Get repository settings",
|
|
516
|
-
description: "Read the repository-level Auto patch, Auto review, Auto land, merge queue (merge_queue_batch_enabled, merge_queue_batch_size, merge_queue_lands_alone_paths) and merge queue overdrive values for the repositories connected to this account. auto_patch_enabled, auto_review_enabled, auto_land_default, merge_queue_batch_enabled and merge_queue_overdrive are true, false, or null; merge_queue_batch_size is a whole number or null; merge_queue_lands_alone_paths is a list of path patterns or null. null means not set, so the account setting applies. Auto patch and Auto review precedence is the stack override (stack_set), then the repository value, then the account setting (settings_get). The Auto land repository value only seeds new stacks at adoption; it does not override an existing stack. merge_queue_overdrive is the repository value over the account default; while it resolves on, that repository batches up to 10 queued pull requests. issue_review_enabled is true, false, or null: the repository value for Vortex issue reviews over the account default (settings_get issue_review_enabled). Pass repo as owner/repo for one repository, or omit it for all.",
|
|
516
|
+
description: "Read the repository-level Auto patch, Auto review, Auto land, merge queue (merge_queue_batch_enabled, merge_queue_batch_size, merge_queue_lands_alone_paths) and merge queue overdrive values for the repositories connected to this account. auto_patch_enabled, auto_review_enabled, auto_land_default, merge_queue_batch_enabled and merge_queue_overdrive are true, false, or null; merge_queue_batch_size is a whole number or null; merge_queue_lands_alone_paths is a list of path patterns or null. null means not set, so the account setting applies. Auto patch and Auto review precedence is the stack override (stack_set), then the repository value, then the account setting (settings_get). The Auto land repository value only seeds new stacks at adoption; it does not override an existing stack. merge_queue_overdrive is the repository value over the account default; while it resolves on, that repository batches up to 10 queued pull requests. issue_review_enabled is true, false, or null: the repository value for Vortex issue reviews over the account default (settings_get issue_review_enabled). issue_auto_review_enabled is true, false, or null the same way: while issue reviews are on, true reviews every new issue and reply, and false reviews only when a comment tags @mergestorm-vortex. Pass repo as owner/repo for one repository, or omit it for all.",
|
|
517
517
|
inputSchema: { repo: z.string().min(3).optional() },
|
|
518
518
|
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
519
519
|
}, async (args) => {
|
|
@@ -526,7 +526,7 @@ export function createMergestormMcpServer(options = {}) {
|
|
|
526
526
|
});
|
|
527
527
|
addTool("repo_settings_set", {
|
|
528
528
|
title: "Update repository settings",
|
|
529
|
-
description: "Set Auto patch (Cyclone), Auto review (Vortex), the Auto land default, or the merge queue settings (merge_queue_batch, merge_queue_batch_size, merge_queue_lands_alone_paths, merge_queue_overdrive) for every stack and pull request in one repository connected to this account, and return the stored result. A value sets the repository value; null clears it so the account setting applies again. A stack override (stack_set) still wins for that stack. auto_patch and auto_review apply to open stacks without an override from their next decision; nothing is cancelled or re-queued. auto_land only seeds new stacks. merge_queue_lands_alone_paths is a list of folder prefixes or globs; a queued pull request that changes a matching file is never batched with others, and an empty list keeps only the built-in rule that a stack with more than one open pull request lands alone. merge_queue_overdrive true makes that repository batch up to 10 queued pull requests, even with batching off; false turns overdrive off for that repository whatever the account default is, and null clears the repository value so the account default (settings_get merge_queue_overdrive) applies again. issue_review true or false turns Vortex issue reviews on or off for that repository whatever the account default is; null clears the repository value so the account default (settings_get issue_review_enabled) applies again. Only the account that connected the repository can change it. Never changes account settings.",
|
|
529
|
+
description: "Set Auto patch (Cyclone), Auto review (Vortex), the Auto land default, or the merge queue settings (merge_queue_batch, merge_queue_batch_size, merge_queue_lands_alone_paths, merge_queue_overdrive) for every stack and pull request in one repository connected to this account, and return the stored result. A value sets the repository value; null clears it so the account setting applies again. A stack override (stack_set) still wins for that stack. auto_patch and auto_review apply to open stacks without an override from their next decision; nothing is cancelled or re-queued. auto_land only seeds new stacks. merge_queue_lands_alone_paths is a list of folder prefixes or globs; a queued pull request that changes a matching file is never batched with others, and an empty list keeps only the built-in rule that a stack with more than one open pull request lands alone. merge_queue_overdrive true makes that repository batch up to 10 queued pull requests, even with batching off; false turns overdrive off for that repository whatever the account default is, and null clears the repository value so the account default (settings_get merge_queue_overdrive) applies again. issue_review true or false turns Vortex issue reviews on or off for that repository whatever the account default is; null clears the repository value so the account default (settings_get issue_review_enabled) applies again. issue_auto_review false makes those reviews run only when a comment tags @mergestorm-vortex (opening a PR then needs no issue approval), true reviews every new issue and reply, and null inherits the account default (settings_get issue_auto_review_enabled). Only the account that connected the repository can change it. Never changes account settings.",
|
|
530
530
|
inputSchema: {
|
|
531
531
|
repo: z.string().min(3),
|
|
532
532
|
auto_patch: z.boolean().nullable().optional(),
|
|
@@ -537,6 +537,7 @@ export function createMergestormMcpServer(options = {}) {
|
|
|
537
537
|
merge_queue_lands_alone_paths: z.array(z.string()).nullable().optional(),
|
|
538
538
|
merge_queue_overdrive: z.boolean().nullable().optional(),
|
|
539
539
|
issue_review: z.boolean().nullable().optional(),
|
|
540
|
+
issue_auto_review: z.boolean().nullable().optional(),
|
|
540
541
|
},
|
|
541
542
|
annotations: { readOnlyHint: false, destructiveHint: true, idempotentHint: false, openWorldHint: true },
|
|
542
543
|
}, async (args) => {
|
|
@@ -562,7 +563,7 @@ export function createMergestormMcpServer(options = {}) {
|
|
|
562
563
|
});
|
|
563
564
|
addTool("settings_get", {
|
|
564
565
|
title: "Get settings",
|
|
565
|
-
description: "Read the Bearer /api/v1/settings toggles, including auto_patch_enabled, auto_land_settle_seconds (how long Auto land waits before queueing), merge_queue_batch_enabled and merge_queue_batch_size (whether the merge queue tests several pull requests on one CI run, and how many), merge_queue_overdrive (the account default for overdrive: the merge queue batches up to 10 queued pull requests per repository; repo_settings_set overrides it per repository), issue_review_enabled (the account default for Vortex issue reviews; repo_settings_set overrides it per repository), cyclone_connected (the Cyclone auto-patch App), and stacks_ready (whether stacks, the merge queue and Auto land can run for this account, which needs Mergestorm Surge).",
|
|
566
|
+
description: "Read the Bearer /api/v1/settings toggles, including auto_patch_enabled, auto_land_settle_seconds (how long Auto land waits before queueing), merge_queue_batch_enabled and merge_queue_batch_size (whether the merge queue tests several pull requests on one CI run, and how many), merge_queue_overdrive (the account default for overdrive: the merge queue batches up to 10 queued pull requests per repository; repo_settings_set overrides it per repository), issue_review_enabled (the account default for Vortex issue reviews; repo_settings_set overrides it per repository), issue_auto_review_enabled (the account default for whether those reviews run on every issue or only when a comment tags @mergestorm-vortex), cyclone_connected (the Cyclone auto-patch App), and stacks_ready (whether stacks, the merge queue and Auto land can run for this account, which needs Mergestorm Surge).",
|
|
566
567
|
annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
567
568
|
}, async () => {
|
|
568
569
|
try {
|
|
@@ -574,7 +575,7 @@ export function createMergestormMcpServer(options = {}) {
|
|
|
574
575
|
});
|
|
575
576
|
addTool("settings_set", {
|
|
576
577
|
title: "Update settings",
|
|
577
|
-
description: "Update writable Bearer /api/v1/settings values and return the stored result. At least one key is required. auto_land_settle_seconds is a whole number of seconds from 15 through 300; it applies to settle clocks that start after the write. merge_queue_batch_enabled turns merge queue batching on or off for the account, merge_queue_batch_size is a whole number from 2 through 10, merge_queue_lands_alone_paths is the list of folder prefixes or globs whose changed files keep a pull request out of a batch, and merge_queue_overdrive is the account default for overdrive: while it resolves on, a repository batches up to 10 queued pull requests, even with batching off, without changing merge_queue_batch_size, and it stays on until turned off (repo_settings_set overrides each of these per repository). issue_review_enabled is the account default for Vortex issue reviews; repo_settings_set issue_review overrides it per repository. cyclone_connected and github_connected are read-only and cannot be set.",
|
|
578
|
+
description: "Update writable Bearer /api/v1/settings values and return the stored result. At least one key is required. auto_land_settle_seconds is a whole number of seconds from 15 through 300; it applies to settle clocks that start after the write. merge_queue_batch_enabled turns merge queue batching on or off for the account, merge_queue_batch_size is a whole number from 2 through 10, merge_queue_lands_alone_paths is the list of folder prefixes or globs whose changed files keep a pull request out of a batch, and merge_queue_overdrive is the account default for overdrive: while it resolves on, a repository batches up to 10 queued pull requests, even with batching off, without changing merge_queue_batch_size, and it stays on until turned off (repo_settings_set overrides each of these per repository). issue_review_enabled is the account default for Vortex issue reviews; repo_settings_set issue_review overrides it per repository. issue_auto_review_enabled false makes them run only when a comment tags @mergestorm-vortex; repo_settings_set issue_auto_review overrides it per repository. cyclone_connected and github_connected are read-only and cannot be set.",
|
|
578
579
|
inputSchema: {
|
|
579
580
|
...Object.fromEntries(BEARER_SETTINGS.map((row) => [row.key,
|
|
580
581
|
("kind" in row
|
|
@@ -31,7 +31,7 @@ export async function issueCreate(input, cfg, deps = {}) {
|
|
|
31
31
|
}
|
|
32
32
|
const issue = await (deps.openStackIssue ?? openStackIssue)({ owner: target.owner, repo: target.repo, title, body: body ?? "", labels: labels ?? [] }, cfg);
|
|
33
33
|
return {
|
|
34
|
-
summary: `${issue.created ? "Opened" : "Already open:"} ${target.owner}/${target.repo}#${issue.number} ${issue.url}. Call issue_review_wait for #${issue.number} and open the pull request
|
|
34
|
+
summary: `${issue.created ? "Opened" : "Already open:"} ${target.owner}/${target.repo}#${issue.number} ${issue.url}. Call issue_review_wait for #${issue.number} and open the pull request once it says you may, with "Fixes #${issue.number}" in the commit or pull request body.`,
|
|
35
35
|
data: { owner: target.owner, repo: target.repo, ...issue },
|
|
36
36
|
};
|
|
37
37
|
}
|
|
@@ -31,7 +31,7 @@ export type IssueReviewWaitDeps = {
|
|
|
31
31
|
pollIntervalMs?: number;
|
|
32
32
|
};
|
|
33
33
|
export declare function issueReviewSummary(status: IssueReviewStatus): string;
|
|
34
|
-
export declare const ISSUE_NOT_APPROVED_HINT = "Do not open the pull request yet:
|
|
34
|
+
export declare const ISSUE_NOT_APPROVED_HINT = "Do not open the pull request yet: reply once in a comment on each issue, accepting each blocking point's suggested fix or saying why not (notes do not block), call issue_review_wait until it returns approved, then try again.";
|
|
35
35
|
export declare function withIssueReviewHint(err: unknown, message: string): string;
|
|
36
36
|
export declare function issueReviewWait(input: IssueReviewWaitInput, cfg?: Config, deps?: IssueReviewWaitDeps): Promise<ToolPayload>;
|
|
37
37
|
export {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CommandError, IssueReviewTimeoutError, getIssueReview, loadConfig, pollIssueReview, } from "mergestorm/client";
|
|
1
|
+
import { CommandError, IssueReviewTimeoutError, NO_LINKED_ISSUE, getIssueReview, loadConfig, pollIssueReview, } from "mergestorm/client";
|
|
2
2
|
import { z } from "zod";
|
|
3
3
|
export const ISSUE_REVIEW_WAIT_MAX_S = 45;
|
|
4
4
|
export const issueReviewWaitSchema = {
|
|
@@ -8,21 +8,28 @@ export const issueReviewWaitSchema = {
|
|
|
8
8
|
timeout_s: z.number().min(0).max(ISSUE_REVIEW_WAIT_MAX_S).optional(),
|
|
9
9
|
};
|
|
10
10
|
const inputSchema = z.object(issueReviewWaitSchema);
|
|
11
|
+
function blockingCount(status) {
|
|
12
|
+
return status.points.filter((point) => point.blocking !== false).length;
|
|
13
|
+
}
|
|
11
14
|
export function issueReviewSummary(status) {
|
|
12
15
|
const ref = `${status.owner}/${status.repo}#${status.number}`;
|
|
13
16
|
const round = status.round ? ` (round ${status.round} of ${status.maxRounds})` : "";
|
|
14
17
|
const head = status.state === "approved"
|
|
15
|
-
?
|
|
18
|
+
? status.approvedBy === null
|
|
19
|
+
? `The Vortex review of ${ref} failed, so it does not hold the pull request back; you may open it.`
|
|
20
|
+
: `${ref} is approved by ${status.approvedBy === "human" ? "a person" : "Vortex"}; you may open the pull request.`
|
|
16
21
|
: status.state === "off"
|
|
17
22
|
? `Issue reviews are off for ${status.owner}/${status.repo}; ${ref} needs no approval.`
|
|
18
|
-
: status.state === "
|
|
19
|
-
?
|
|
20
|
-
:
|
|
23
|
+
: status.mode === "mention" && status.state === "unreviewed"
|
|
24
|
+
? `Issue reviews for ${status.owner}/${status.repo} run on mention; ${ref} needs no approval, so you may open the pull request.`
|
|
25
|
+
: status.state === "pending"
|
|
26
|
+
? `${ref}: Vortex is still reviewing${round}; call issue_review_wait again.`
|
|
27
|
+
: `${ref}: ${status.state}${round}, ${blockingCount(status)} point${blockingCount(status) === 1 ? "" : "s"} to answer.${status.mode === "auto" ? " Do not open the pull request yet." : ""}`;
|
|
21
28
|
return status.next ? `${head} ${status.next}` : head;
|
|
22
29
|
}
|
|
23
|
-
export const ISSUE_NOT_APPROVED_HINT = "Do not open the pull request yet:
|
|
30
|
+
export const ISSUE_NOT_APPROVED_HINT = "Do not open the pull request yet: reply once in a comment on each issue, accepting each blocking point's suggested fix or saying why not (notes do not block), call issue_review_wait until it returns approved, then try again.";
|
|
24
31
|
export function withIssueReviewHint(err, message) {
|
|
25
|
-
return err instanceof CommandError && err.code === "issue_not_approved" ? `${message}\n${ISSUE_NOT_APPROVED_HINT}` : message;
|
|
32
|
+
return err instanceof CommandError && err.code === "issue_not_approved" && err.reason !== NO_LINKED_ISSUE ? `${message}\n${ISSUE_NOT_APPROVED_HINT}` : message;
|
|
26
33
|
}
|
|
27
34
|
function failure(code, message, extra = {}) {
|
|
28
35
|
return { summary: message, data: { error: { code, message, ...extra } }, isError: true };
|
|
@@ -8,6 +8,7 @@ const ARG_BY_KEY = {
|
|
|
8
8
|
merge_queue_lands_alone_paths: "merge_queue_lands_alone_paths",
|
|
9
9
|
merge_queue_overdrive: "merge_queue_overdrive",
|
|
10
10
|
issue_review_enabled: "issue_review",
|
|
11
|
+
issue_auto_review_enabled: "issue_auto_review",
|
|
11
12
|
};
|
|
12
13
|
function parseRepo(raw) {
|
|
13
14
|
const match = typeof raw === "string" ? /^([A-Za-z0-9_.-]+)\/([A-Za-z0-9_.-]+)$/.exec(raw.trim()) : null;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mergestorm-mcp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.30",
|
|
4
4
|
"description": "Mergestorm MCP server — identity, review, and read-only stack tools over stdio",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@modelcontextprotocol/sdk": "^1.30.0",
|
|
42
|
-
"mergestorm": "0.3.
|
|
42
|
+
"mergestorm": "0.3.67",
|
|
43
43
|
"zod": "^3.24.2"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|