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 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` or `unreviewed`, answer the points in a comment on the issue and call it again; Vortex reviews each reply. On `capped`, a person approves with an issue comment whose first line is `mergestorm-issue: approve`. `stack_adopt` and `stack_publish` refuse a pull request whose linked issue is not approved with `issue_not_approved`, naming each issue's state and points.
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 only once it is approved, with "Fixes #${issue.number}" in the commit or pull request body.`,
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.points.length} point${status.points.length === 1 ? "" : "s"} to answer. Do not open the pull request yet.`;
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: answer the points in a comment on each issue, call issue_review_wait until it returns approved, then try again.";
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.29";
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: answer any points in an issue comment (Vortex reviews each reply again), then call issue_review_wait again.";
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: answer any points in an issue comment (Vortex reviews each reply again), then call issue_review_wait again.",
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 or unreviewed, answer every point in a comment on the issue, then call again: Vortex reviews each reply, up to maxRounds rounds. On capped, a person approves with an issue comment whose first line is mergestorm-issue: approve.",
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) => [
@@ -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.29";
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): {
@@ -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.29";
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: answer any points in an issue comment (Vortex reviews each reply again), then call issue_review_wait again.";
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: answer any points in an issue comment (Vortex reviews each reply again), then call issue_review_wait again.",
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 or unreviewed, answer every point in a comment on the issue, then call again: Vortex reviews each reply, up to maxRounds rounds. On capped, a person approves with an issue comment whose first line is mergestorm-issue: approve.",
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 only once it is approved, with "Fixes #${issue.number}" in the commit or pull request body.`,
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: answer the points in a comment on each issue, call issue_review_wait until it returns approved, then try again.";
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
- ? `${ref} is approved by ${status.approvedBy === "human" ? "a person" : "Vortex"}; you may open the pull request.`
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 === "pending"
19
- ? `${ref}: Vortex is still reviewing${round}; call issue_review_wait again.`
20
- : `${ref}: ${status.state}${round}, ${status.points.length} point${status.points.length === 1 ? "" : "s"} to answer. Do not open the pull request yet.`;
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: answer the points in a comment on each issue, call issue_review_wait until it returns approved, then try again.";
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.29",
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.66",
42
+ "mergestorm": "0.3.67",
43
43
  "zod": "^3.24.2"
44
44
  },
45
45
  "devDependencies": {