@mushi-mushi/mcp 0.28.0 → 0.29.1
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/LICENSE +1 -1
- package/README.md +2 -2
- package/dist/catalog.js +1 -1
- package/dist/{chunk-PVN7VPVW.js → chunk-6SHKBN6R.js} +48 -4
- package/dist/{chunk-DJCVJ3YZ.js → chunk-7RWHDJPZ.js} +5 -0
- package/dist/clients.d.ts +1 -1
- package/dist/clients.js +2 -2
- package/dist/feature-groups.js +1 -1
- package/dist/index.js +286 -13
- package/dist/server.js +235 -11
- package/package.json +3 -3
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ Restart the editor and ask *"what's broken in prod?"*. For Cursor and Claude, `s
|
|
|
29
29
|
"mcpServers": {
|
|
30
30
|
"mushi-mushi": {
|
|
31
31
|
"command": "npx",
|
|
32
|
-
"args": ["-y", "@mushi-mushi/mcp@0.
|
|
32
|
+
"args": ["-y", "@mushi-mushi/mcp@0.29.1"],
|
|
33
33
|
"env": {
|
|
34
34
|
"MUSHI_API_KEY": "mushi_xxxxxxxxxxxxxxxxxxxx",
|
|
35
35
|
"MUSHI_PROJECT_ID": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
|
|
@@ -59,7 +59,7 @@ Claude Desktop does not expand `${VAR}` references in this file; Cursor and VS C
|
|
|
59
59
|
| `diagnose_setup` | Explains a broken install and the one next step |
|
|
60
60
|
| `search_mushi_docs` | Answers setup and API questions from the docs |
|
|
61
61
|
|
|
62
|
-
The full catalog has
|
|
62
|
+
The full catalog has 124 tools, plus 8 resources (`project://dashboard`, `project://stats`, …) and 4 prompts (`summarize_report_for_fix`, `triage_next_steps`, …). Every tool carries read-only and destructive hints, so your editor can ask before it changes anything. Full list: [MCP tool reference](https://kensaur.us/mushi-mushi/docs/sdks/mcp-tools).
|
|
63
63
|
|
|
64
64
|
**Tool groups.** New installs get a lean default: `triage`, `fixes`, `inventory`, `setup`, `docs`. Turn on more with `MUSHI_FEATURES=triage,qa,codebase` (stdio) or `?features=…` on the hosted URL, or everything with `all`. Groups: `qa`, `skills`, `codebase`, `rewards`, `admin`, `audit`, `usage`. Add `?read_only=1` to the hosted URL to hide every write tool.
|
|
65
65
|
|
package/dist/catalog.js
CHANGED
|
@@ -64,6 +64,15 @@ var TOOL_CATALOG = [
|
|
|
64
64
|
returnsUntrusted: true,
|
|
65
65
|
useCase: "Why did this fix attempt fail \u2014 show me every step."
|
|
66
66
|
},
|
|
67
|
+
{
|
|
68
|
+
name: "get_fix_verification",
|
|
69
|
+
title: "Fix merge checks",
|
|
70
|
+
description: "Return whether one fix attempt's PR is proven to work on its current head commit (ADR 0035): gates in order review (Opus review says merge), ci (every check green; a stopped test machine is pending, not a failure), fail_to_pass (the host's Mushi verify check: a changed test fails without the fix and passes with it; not_set_up until .github/workflows/mushi-verify.yml exists), protected (no deleted or weakened tests, no test skips or lint/type suppressions added, no CI config or lockfile change, no protected path), budget (small enough to merge on its own) and second_review (a second model family; runs only after the others pass). Each gate is { id, status (pass | fail | pending | unavailable | not_set_up), label, detail (what to do when it is not pass), evidence }. Also passed, secondJudge (summary and findings are model output from untrusted input), autoMerge { state (none | eligible | merged | skipped | failed), detail }, and regressions after a Mushi merge [{ signal (ci_failed_on_merge | report_reopened | new_report_in_changed_file), revertState, revertPrUrl }]. Returns { headSha, gates, passed, secondJudge, autoMerge, regressions, mergedAt, mergeSha, evaluatedAt }; 404 NOT_FOUND until Mushi first checks the fix (every 10 minutes for open cloud-agent PRs). Read-only. Use before merge_fix to see what is still unproven; use get_fix_timeline for the attempt's full lifecycle.",
|
|
71
|
+
scope: "mcp:read",
|
|
72
|
+
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
73
|
+
returnsUntrusted: true,
|
|
74
|
+
useCase: "Is this agent fix proven to work, and what is still missing before it can merge?"
|
|
75
|
+
},
|
|
67
76
|
{
|
|
68
77
|
name: "get_blast_radius",
|
|
69
78
|
title: "Blast radius",
|
|
@@ -111,7 +120,7 @@ var TOOL_CATALOG = [
|
|
|
111
120
|
{
|
|
112
121
|
name: "list_gate_findings",
|
|
113
122
|
title: "Gate findings",
|
|
114
|
-
description: "List recent inventory gate runs and their findings for a project, newest first. Returns { runs: [{ id, gate, status, findings_count, \u2026 }], findings: [{ severity, rule_id, message, file_path, node_id, \u2026 }] }. Filter by gate (dead_handler | mock_leak | api_contract | crawl | status_claim | spec_drift | orphan_endpoint | unknown_call | schema_drift | code_health | design_drift | ci_drift | deploy_drift | env_drift | radar | portfolio_radar | portfolio_radar_ci | store_review) or finding severity (info | warn | error). The *_drift gates are the App Recipe checks: design_drift is code that drifts off the design tokens, ci_drift / deploy_drift / env_drift are CI, deploy and env vars that drift from the recipe; radar is the Mushi setup checks (a rejected provider key, no spend cap or AI budget, a webhook that never delivered, a stale code index), each with a suggested_fix (a spend-cap fix is applied in the console by a signed-in project admin, not through an API key); portfolio_radar / portfolio_radar_ci / store_review are the app hole checks (prefer get_radar). Available on every plan. Read-only. Use to see which CI gates failed on the last crawl; use diff_inventory to compare two commits, or get_inventory for the full snapshot.",
|
|
123
|
+
description: "List recent inventory gate runs and their findings for a project, newest first. Returns { runs: [{ id, gate, status, findings_count, \u2026 }], findings: [{ severity, rule_id, message, file_path, node_id, \u2026 }] }. Filter by gate (dead_handler | mock_leak | api_contract | crawl | status_claim | spec_drift | orphan_endpoint | unknown_call | schema_drift | code_health | design_drift | ci_drift | deploy_drift | env_drift | radar | portfolio_radar | portfolio_radar_ci | portfolio_radar_vulns | store_review) or finding severity (info | warn | error). The *_drift gates are the App Recipe checks: design_drift is code that drifts off the design tokens, ci_drift / deploy_drift / env_drift are CI, deploy and env vars that drift from the recipe; radar is the Mushi setup checks (a rejected provider key, no spend cap or AI budget, a webhook that never delivered, a stale code index), each with a suggested_fix (a spend-cap fix is applied in the console by a signed-in project admin, not through an API key); portfolio_radar / portfolio_radar_ci / portfolio_radar_vulns / store_review are the app hole checks (prefer get_radar). Available on every plan. Read-only. Use to see which CI gates failed on the last crawl; use diff_inventory to compare two commits, or get_inventory for the full snapshot.",
|
|
115
124
|
scope: "mcp:read",
|
|
116
125
|
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
117
126
|
useCase: "Show me what CI gates failed on the last run."
|
|
@@ -277,6 +286,33 @@ var TOOL_CATALOG = [
|
|
|
277
286
|
returnsUntrusted: true,
|
|
278
287
|
useCase: "Which files are too big to change safely, and is the bundle growing?"
|
|
279
288
|
},
|
|
289
|
+
{
|
|
290
|
+
name: "get_ci_overview",
|
|
291
|
+
title: "CI runners and why fixes wait",
|
|
292
|
+
description: "Return where this project's tests run and why a fix is slow to land (ADR 0033): the machines that send a runner heartbeat (hostname, platform, memory, swap, load, free disk, and per runner service its memory use, memory limit and out-of-memory kills), the GitHub runners seen (online | offline, busy, labels), repos, the latest jobs with their verdict (passed, running, queued, waiting_for_runner, runner_lost, queue_expired, cancelled, code_failure; waiting_for_runner, runner_lost and queue_expired are infra: the test machine stopped and the fix was not tested, which is not a code failure), and stats { queueP50s, queueP95s, durationP50s, durationP95s, passRate, infraFailures, codeFailures, byRunner, byWorkflow, slowSteps }, plus advice [{ id, severity (high | medium | low), title, detail, evidence, fix }] with the evidence for each rule. Optional projectId (default: the configured project; with an account-level key and no project, every project you can read), days (1-30, default 7) and refresh (true reads GitHub first instead of the last 10-minute sync, at most once a minute per project). permissions { jobs, runners } is ok | missing | unknown: jobs need Actions: read on GitHub, the runner list needs Administration: read (without it runners come from jobs only). Repo, workflow, job, step and runner names come from the repos. Returns { generatedAt, refreshedAt, window, permissions, hosts, runners, repos, jobs, stats, advice }. Read-only. When a fix's CI failed with an infra verdict, re-run the tests instead of changing code.",
|
|
293
|
+
scope: "mcp:read",
|
|
294
|
+
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
295
|
+
returnsUntrusted: true,
|
|
296
|
+
useCase: "Did my fix fail, or did the test machine stop? Why do my fixes wait to be tested?"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
name: "get_ci_costs",
|
|
300
|
+
title: "CI cost and speed",
|
|
301
|
+
description: "Return what this project's CI costs and how fast it runs on GitHub-hosted runners versus your own machines (Plan 022, ADR 0037). Rows per repo \xD7 runner class [{ repo, runnerClass (github_hosted | self_hosted | unknown = never picked up), os, labels, runner, machine, jobs, expired, queueP50s, queueP95s, runP50s, runP95s, prPassRate (pull-request jobs only), infraRate, rawMinutes, billedMinutes (each job rounded up to a whole minute), rerunJobs, tinyJobs, monthCost, costBasis (github_list | github_public_free | github_larger_unpriced | self_hosted | unknown), currency }]; repos with visibility (public repos run GitHub-hosted minutes free); accounts per GitHub owner (plan, includedMinutes, monthMinutes, monthListCost, monthCost after included minutes); machines (busyHours as the union of job intervals, busyShare, monthEnergyCost and monthWearCost from the organization's own figures); speed factors (only passed jobs that ran on both classes, at least 5 each, with sample sizes); whatIfs for moving a workflow (minutes moved, jobs that stay and why, speed, cost delta, target wait and busy share, warnings); explain (re-runs, tiny jobs, expired jobs, pinned-to-GitHub jobs with their YAML reason, main and Dependabot runs that always use GitHub); advice with evidence; fields says which numbers are measured and which estimated; rates gives GitHub's list prices and the date they were read. Optional projectId (default: the configured project; an account-level key with none reads every project) and days (1-30, default 30). lowConfidence is true under 7 days of data. Returns { window, dataDays, lowConfidence, source, sourceNote, rates, fields, settings, repos, rows, accounts, machines, speed, whatIfs, explain, advice }. Read-only: it changes nothing on GitHub. Every money figure is an estimate.",
|
|
302
|
+
scope: "mcp:read",
|
|
303
|
+
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
304
|
+
returnsUntrusted: true,
|
|
305
|
+
useCase: "What does my CI cost, and would it be cheaper or faster on my own machine?"
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
name: "request_ci_placement_change",
|
|
309
|
+
title: "Ask to change where CI runs (needs approval)",
|
|
310
|
+
description: `Ask to change where one repository's CI runs by setting or removing one repo Actions variable that its workflows read in runs-on (ADR 0037). Only LINUX_RUNNER and RUNNER_<WORKFLOW> may be changed; value is one runner label, or null to remove the variable so jobs use the workflow's fallback (usually GitHub-hosted). Mushi builds the change itself from a fresh preview: the jobs that move and the ones that stay (pinned to GitHub, main-branch and Dependabot runs), the target runners and their wait, the cost change, and the variable's current value, which the change must still match when it runs. Your organization's CI policy is checked now and again when it runs: no paid GitHub-hosted minutes on private repos when that rule is on, repos managed by an external controller are refused, standby runners are never a target. This only creates a request: a team owner or admin approves it in the console and runs it there within an hour; this tool can never approve or run it, and Mushi never changes runner labels or registrations. Confirm with the user first. Returns { id, status: "pending_approval", payloadSha256, preview }, or an error with the reason (VARIABLE_NOT_ALLOWED, POLICY_NO_PAID_HOSTED, EXTERNAL_CONTROLLER, POLICY_STANDBY_TARGET, VARIABLE_UNREADABLE, NO_CHANGE) and the preview. Write.`,
|
|
311
|
+
scope: "mcp:write",
|
|
312
|
+
hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
|
|
313
|
+
returnsUntrusted: true,
|
|
314
|
+
useCase: "Ask to run yen-yen's PR jobs on the Alienware runner instead of paid GitHub minutes, for a person to approve."
|
|
315
|
+
},
|
|
280
316
|
{
|
|
281
317
|
name: "explain_finding",
|
|
282
318
|
title: "Explain one finding",
|
|
@@ -629,6 +665,14 @@ var TOOL_CATALOG = [
|
|
|
629
665
|
hints: { readOnly: false, destructive: false, idempotent: true, openWorld: true },
|
|
630
666
|
useCase: "Pull my open Sentry issues into Mushi so I can triage and fix them."
|
|
631
667
|
},
|
|
668
|
+
{
|
|
669
|
+
name: "file_report",
|
|
670
|
+
title: "File a report",
|
|
671
|
+
description: "File a free-form report on a project by hand: a bug you found yourself, a backlog item, or work for an agent. Pass title (3-200 chars) and description (up to 10000 chars: what happens, steps, what you expected, how to check it is fixed); severity (critical | high | medium | low) and component are optional hints that triage may refine. The report is stored with status new and goes through the same triage as a user report (classification, diagnosis), so it can then be dispatched with dispatch_fix. Returns { reportId, projectId, title, status, severity, component }. Write; not idempotent (a retry files a second report); at most 30 filed reports per project an hour; viewers cannot file. Use for work no user reported; for issues already in Sentry use import_sentry_issues. Then call triage_issue on the new reportId.",
|
|
672
|
+
scope: "mcp:write",
|
|
673
|
+
hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
|
|
674
|
+
useCase: "Log this bug I found (or this backlog item) in Mushi so it gets triaged and fixed."
|
|
675
|
+
},
|
|
632
676
|
{
|
|
633
677
|
name: "triage_next_steps",
|
|
634
678
|
title: "What should I work on now?",
|
|
@@ -820,7 +864,7 @@ var TDD_TOOL_CATALOG = [
|
|
|
820
864
|
{
|
|
821
865
|
name: "list_byok_keys",
|
|
822
866
|
title: "List your API key pool",
|
|
823
|
-
description: "List the
|
|
867
|
+
description: "List the BYOK API keys this project uses, grouped by provider (anthropic | openai | openrouter | firecrawl | browserbase | cursor | supabase). Returns pooled { keys: [{ id, provider_slug, label, priority, status, cooldown_until, test_status, key_hint, base_url, last_tested_at, last_used_at, scope }] } where scope is project (this app), organization (every app in its organization) or universal (every app its organization owner owns); they are tried in that order, after the legacy credential. Also read-only { legacyKeys } metadata for credentials saved before the pooled lifecycle \u2014 never the raw secret. Read-only. Use to see which keys are validated, active, pending, legacy, shared, or rate-limited; use add_byok_key to add one.",
|
|
824
868
|
scope: "mcp:read",
|
|
825
869
|
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
826
870
|
useCase: "Which API keys are active and which are rate-limited?"
|
|
@@ -828,7 +872,7 @@ var TDD_TOOL_CATALOG = [
|
|
|
828
872
|
{
|
|
829
873
|
name: "add_byok_key",
|
|
830
874
|
title: "Add an API key",
|
|
831
|
-
description: "Add and immediately validate a BYOK API key for anthropic | openai | openrouter | firecrawl | browserbase | cursor | supabase (a scoped, read-only Supabase access token, checked against the linked supabase_project_ref). The raw key is stored encrypted in Supabase Vault and never returned; failed probes remain quarantined. Optional baseUrl is accepted only for allow-listed OpenAI-compatible HTTPS providers. Write; NOT idempotent.",
|
|
875
|
+
description: "Add and immediately validate a BYOK API key for anthropic | openai | openrouter | firecrawl | browserbase | cursor | supabase (a scoped, read-only Supabase access token, checked against the linked supabase_project_ref). The raw key is stored encrypted in Supabase Vault and never returned; failed probes remain quarantined. Optional baseUrl is accepted only for allow-listed OpenAI-compatible HTTPS providers. The key is added to this one app; a key for every app in the organization or every app you own (universal) is added in the console, Settings \u2192 AI keys. Write; NOT idempotent.",
|
|
832
876
|
scope: "mcp:write",
|
|
833
877
|
hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
|
|
834
878
|
useCase: "Add a backup Anthropic key to the pool."
|
|
@@ -852,7 +896,7 @@ var TDD_TOOL_CATALOG = [
|
|
|
852
896
|
{
|
|
853
897
|
name: "get_spend_down_status",
|
|
854
898
|
title: "Spend-down status of Cursor keys",
|
|
855
|
-
description: "For each Cursor key this project can use, show spend-down mode (ADR 0028): whether it is on, when the credits expire, the window state (off | not_started | active | expired | key_unusable), fixes started today out of the daily limit, the apps the key pays for, and what the last worker tick did. Returns { keys: [{ id, label, keyHint, scope, enabled, creditsExpireAt, model, dailyLimit, windowDays, state, startsAt, dispatchedToday, remainingToday, projects, lastRunAt, lastSummary }] }. Read-only. Use to see whether expiring Cursor credits are being used; use set_byok_spend_down to change it.",
|
|
899
|
+
description: "For each Cursor key this project can use, show spend-down mode (ADR 0028): whether it is on, when the credits expire, the window state (off | not_started | active | expired | key_unusable), fixes started today out of the daily limit, the apps the key pays for that this project can see (each with its stop-loss state: paused when, over its spend-down runs of the last 14 days with 20+ samples, the 95% Wilson bound puts its Opus merge rate under 20%, hold rate over 35% or no-PR share over 50%; a paused app still gets 1 probe fix a day), a count of its other apps, the last 7 days' scoreboard (key-wide totals; per app \xD7 model \xD7 day rows for visible apps: runs, PRs, no-PR verdicts, other failures, Opus merge / fix_first / hold, merged, latest review cost per PR, merge and mergeable yield), and what the last worker tick did. Returns { keys: [{ id, label, keyHint, scope, enabled, creditsExpireAt, model, dailyLimit, windowDays, state, startsAt, dispatchedToday, remainingToday, projects: [{ id, name, canResume, stopLoss }], otherApps, projectsNote, stopLossNote, scoreboard: { days, since, totals, rows } | null, scoreboardNote, lastRunAt, lastSummary }], reviewFollowups: { days, dispatched, finished, pushed, noChange, verdictsAfter: { merge, fix_first, hold }, awaitingReview, conversionRate, skipped, apps } | null } \u2014 reviewFollowups (ADR 0032) is what sending fix_first PRs back to an agent with the Opus findings produced in the last 7 days, over the apps you can access. Read-only. Use to see whether expiring Cursor credits are being used and what they produce; use set_byok_spend_down to change it.",
|
|
856
900
|
scope: "mcp:read",
|
|
857
901
|
hints: { readOnly: true, idempotent: true, openWorld: false },
|
|
858
902
|
useCase: "Are my expiring Cursor credits being spent on fixes?"
|
|
@@ -41,6 +41,7 @@ var TOOL_FEATURE_MAP = {
|
|
|
41
41
|
get_report_evidence: "triage",
|
|
42
42
|
triage_issue: "triage",
|
|
43
43
|
import_sentry_issues: "triage",
|
|
44
|
+
file_report: "triage",
|
|
44
45
|
query_lessons: "triage",
|
|
45
46
|
list_lessons: "triage",
|
|
46
47
|
suggest_fix: "triage",
|
|
@@ -92,6 +93,10 @@ var TOOL_FEATURE_MAP = {
|
|
|
92
93
|
transition_status: "fixes",
|
|
93
94
|
merge_fix: "fixes",
|
|
94
95
|
refresh_ci: "fixes",
|
|
96
|
+
get_ci_overview: "fixes",
|
|
97
|
+
get_ci_costs: "fixes",
|
|
98
|
+
request_ci_placement_change: "fixes",
|
|
99
|
+
get_fix_verification: "fixes",
|
|
95
100
|
reopen_report: "fixes",
|
|
96
101
|
reply_to_reporter: "fixes",
|
|
97
102
|
request_reporter_info: "fixes",
|
package/dist/clients.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ import { FeatureGroup } from './feature-groups.js';
|
|
|
49
49
|
* editor launch. Synced to package.json by `scripts/sync-mcp-pin.mjs` — never
|
|
50
50
|
* hand-edit the version.
|
|
51
51
|
*/
|
|
52
|
-
declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.
|
|
52
|
+
declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.29.1";
|
|
53
53
|
interface StdioConfig {
|
|
54
54
|
command: string;
|
|
55
55
|
args: string[];
|
package/dist/clients.js
CHANGED
|
@@ -5,10 +5,10 @@ import {
|
|
|
5
5
|
DEFAULT_FEATURE_GROUPS,
|
|
6
6
|
appendFeaturesToUrl,
|
|
7
7
|
featuresQueryString
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-7RWHDJPZ.js";
|
|
9
9
|
|
|
10
10
|
// src/clients.ts
|
|
11
|
-
var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.
|
|
11
|
+
var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.29.1";
|
|
12
12
|
var PIN_SPEC_RE = /^@mushi-mushi\/mcp@\d+\.\d+\.\d+$/;
|
|
13
13
|
function pinOf(pinSpec) {
|
|
14
14
|
return pinSpec && PIN_SPEC_RE.test(pinSpec) ? pinSpec : MCP_PIN_SPEC;
|
package/dist/feature-groups.js
CHANGED
package/dist/index.js
CHANGED
|
@@ -140,6 +140,15 @@ var TOOL_CATALOG = [
|
|
|
140
140
|
returnsUntrusted: true,
|
|
141
141
|
useCase: "Why did this fix attempt fail \u2014 show me every step."
|
|
142
142
|
},
|
|
143
|
+
{
|
|
144
|
+
name: "get_fix_verification",
|
|
145
|
+
title: "Fix merge checks",
|
|
146
|
+
description: "Return whether one fix attempt's PR is proven to work on its current head commit (ADR 0035): gates in order review (Opus review says merge), ci (every check green; a stopped test machine is pending, not a failure), fail_to_pass (the host's Mushi verify check: a changed test fails without the fix and passes with it; not_set_up until .github/workflows/mushi-verify.yml exists), protected (no deleted or weakened tests, no test skips or lint/type suppressions added, no CI config or lockfile change, no protected path), budget (small enough to merge on its own) and second_review (a second model family; runs only after the others pass). Each gate is { id, status (pass | fail | pending | unavailable | not_set_up), label, detail (what to do when it is not pass), evidence }. Also passed, secondJudge (summary and findings are model output from untrusted input), autoMerge { state (none | eligible | merged | skipped | failed), detail }, and regressions after a Mushi merge [{ signal (ci_failed_on_merge | report_reopened | new_report_in_changed_file), revertState, revertPrUrl }]. Returns { headSha, gates, passed, secondJudge, autoMerge, regressions, mergedAt, mergeSha, evaluatedAt }; 404 NOT_FOUND until Mushi first checks the fix (every 10 minutes for open cloud-agent PRs). Read-only. Use before merge_fix to see what is still unproven; use get_fix_timeline for the attempt's full lifecycle.",
|
|
147
|
+
scope: "mcp:read",
|
|
148
|
+
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
149
|
+
returnsUntrusted: true,
|
|
150
|
+
useCase: "Is this agent fix proven to work, and what is still missing before it can merge?"
|
|
151
|
+
},
|
|
143
152
|
{
|
|
144
153
|
name: "get_blast_radius",
|
|
145
154
|
title: "Blast radius",
|
|
@@ -187,7 +196,7 @@ var TOOL_CATALOG = [
|
|
|
187
196
|
{
|
|
188
197
|
name: "list_gate_findings",
|
|
189
198
|
title: "Gate findings",
|
|
190
|
-
description: "List recent inventory gate runs and their findings for a project, newest first. Returns { runs: [{ id, gate, status, findings_count, \u2026 }], findings: [{ severity, rule_id, message, file_path, node_id, \u2026 }] }. Filter by gate (dead_handler | mock_leak | api_contract | crawl | status_claim | spec_drift | orphan_endpoint | unknown_call | schema_drift | code_health | design_drift | ci_drift | deploy_drift | env_drift | radar | portfolio_radar | portfolio_radar_ci | store_review) or finding severity (info | warn | error). The *_drift gates are the App Recipe checks: design_drift is code that drifts off the design tokens, ci_drift / deploy_drift / env_drift are CI, deploy and env vars that drift from the recipe; radar is the Mushi setup checks (a rejected provider key, no spend cap or AI budget, a webhook that never delivered, a stale code index), each with a suggested_fix (a spend-cap fix is applied in the console by a signed-in project admin, not through an API key); portfolio_radar / portfolio_radar_ci / store_review are the app hole checks (prefer get_radar). Available on every plan. Read-only. Use to see which CI gates failed on the last crawl; use diff_inventory to compare two commits, or get_inventory for the full snapshot.",
|
|
199
|
+
description: "List recent inventory gate runs and their findings for a project, newest first. Returns { runs: [{ id, gate, status, findings_count, \u2026 }], findings: [{ severity, rule_id, message, file_path, node_id, \u2026 }] }. Filter by gate (dead_handler | mock_leak | api_contract | crawl | status_claim | spec_drift | orphan_endpoint | unknown_call | schema_drift | code_health | design_drift | ci_drift | deploy_drift | env_drift | radar | portfolio_radar | portfolio_radar_ci | portfolio_radar_vulns | store_review) or finding severity (info | warn | error). The *_drift gates are the App Recipe checks: design_drift is code that drifts off the design tokens, ci_drift / deploy_drift / env_drift are CI, deploy and env vars that drift from the recipe; radar is the Mushi setup checks (a rejected provider key, no spend cap or AI budget, a webhook that never delivered, a stale code index), each with a suggested_fix (a spend-cap fix is applied in the console by a signed-in project admin, not through an API key); portfolio_radar / portfolio_radar_ci / portfolio_radar_vulns / store_review are the app hole checks (prefer get_radar). Available on every plan. Read-only. Use to see which CI gates failed on the last crawl; use diff_inventory to compare two commits, or get_inventory for the full snapshot.",
|
|
191
200
|
scope: "mcp:read",
|
|
192
201
|
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
193
202
|
useCase: "Show me what CI gates failed on the last run."
|
|
@@ -353,6 +362,33 @@ var TOOL_CATALOG = [
|
|
|
353
362
|
returnsUntrusted: true,
|
|
354
363
|
useCase: "Which files are too big to change safely, and is the bundle growing?"
|
|
355
364
|
},
|
|
365
|
+
{
|
|
366
|
+
name: "get_ci_overview",
|
|
367
|
+
title: "CI runners and why fixes wait",
|
|
368
|
+
description: "Return where this project's tests run and why a fix is slow to land (ADR 0033): the machines that send a runner heartbeat (hostname, platform, memory, swap, load, free disk, and per runner service its memory use, memory limit and out-of-memory kills), the GitHub runners seen (online | offline, busy, labels), repos, the latest jobs with their verdict (passed, running, queued, waiting_for_runner, runner_lost, queue_expired, cancelled, code_failure; waiting_for_runner, runner_lost and queue_expired are infra: the test machine stopped and the fix was not tested, which is not a code failure), and stats { queueP50s, queueP95s, durationP50s, durationP95s, passRate, infraFailures, codeFailures, byRunner, byWorkflow, slowSteps }, plus advice [{ id, severity (high | medium | low), title, detail, evidence, fix }] with the evidence for each rule. Optional projectId (default: the configured project; with an account-level key and no project, every project you can read), days (1-30, default 7) and refresh (true reads GitHub first instead of the last 10-minute sync, at most once a minute per project). permissions { jobs, runners } is ok | missing | unknown: jobs need Actions: read on GitHub, the runner list needs Administration: read (without it runners come from jobs only). Repo, workflow, job, step and runner names come from the repos. Returns { generatedAt, refreshedAt, window, permissions, hosts, runners, repos, jobs, stats, advice }. Read-only. When a fix's CI failed with an infra verdict, re-run the tests instead of changing code.",
|
|
369
|
+
scope: "mcp:read",
|
|
370
|
+
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
371
|
+
returnsUntrusted: true,
|
|
372
|
+
useCase: "Did my fix fail, or did the test machine stop? Why do my fixes wait to be tested?"
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
name: "get_ci_costs",
|
|
376
|
+
title: "CI cost and speed",
|
|
377
|
+
description: "Return what this project's CI costs and how fast it runs on GitHub-hosted runners versus your own machines (Plan 022, ADR 0037). Rows per repo \xD7 runner class [{ repo, runnerClass (github_hosted | self_hosted | unknown = never picked up), os, labels, runner, machine, jobs, expired, queueP50s, queueP95s, runP50s, runP95s, prPassRate (pull-request jobs only), infraRate, rawMinutes, billedMinutes (each job rounded up to a whole minute), rerunJobs, tinyJobs, monthCost, costBasis (github_list | github_public_free | github_larger_unpriced | self_hosted | unknown), currency }]; repos with visibility (public repos run GitHub-hosted minutes free); accounts per GitHub owner (plan, includedMinutes, monthMinutes, monthListCost, monthCost after included minutes); machines (busyHours as the union of job intervals, busyShare, monthEnergyCost and monthWearCost from the organization's own figures); speed factors (only passed jobs that ran on both classes, at least 5 each, with sample sizes); whatIfs for moving a workflow (minutes moved, jobs that stay and why, speed, cost delta, target wait and busy share, warnings); explain (re-runs, tiny jobs, expired jobs, pinned-to-GitHub jobs with their YAML reason, main and Dependabot runs that always use GitHub); advice with evidence; fields says which numbers are measured and which estimated; rates gives GitHub's list prices and the date they were read. Optional projectId (default: the configured project; an account-level key with none reads every project) and days (1-30, default 30). lowConfidence is true under 7 days of data. Returns { window, dataDays, lowConfidence, source, sourceNote, rates, fields, settings, repos, rows, accounts, machines, speed, whatIfs, explain, advice }. Read-only: it changes nothing on GitHub. Every money figure is an estimate.",
|
|
378
|
+
scope: "mcp:read",
|
|
379
|
+
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
380
|
+
returnsUntrusted: true,
|
|
381
|
+
useCase: "What does my CI cost, and would it be cheaper or faster on my own machine?"
|
|
382
|
+
},
|
|
383
|
+
{
|
|
384
|
+
name: "request_ci_placement_change",
|
|
385
|
+
title: "Ask to change where CI runs (needs approval)",
|
|
386
|
+
description: `Ask to change where one repository's CI runs by setting or removing one repo Actions variable that its workflows read in runs-on (ADR 0037). Only LINUX_RUNNER and RUNNER_<WORKFLOW> may be changed; value is one runner label, or null to remove the variable so jobs use the workflow's fallback (usually GitHub-hosted). Mushi builds the change itself from a fresh preview: the jobs that move and the ones that stay (pinned to GitHub, main-branch and Dependabot runs), the target runners and their wait, the cost change, and the variable's current value, which the change must still match when it runs. Your organization's CI policy is checked now and again when it runs: no paid GitHub-hosted minutes on private repos when that rule is on, repos managed by an external controller are refused, standby runners are never a target. This only creates a request: a team owner or admin approves it in the console and runs it there within an hour; this tool can never approve or run it, and Mushi never changes runner labels or registrations. Confirm with the user first. Returns { id, status: "pending_approval", payloadSha256, preview }, or an error with the reason (VARIABLE_NOT_ALLOWED, POLICY_NO_PAID_HOSTED, EXTERNAL_CONTROLLER, POLICY_STANDBY_TARGET, VARIABLE_UNREADABLE, NO_CHANGE) and the preview. Write.`,
|
|
387
|
+
scope: "mcp:write",
|
|
388
|
+
hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
|
|
389
|
+
returnsUntrusted: true,
|
|
390
|
+
useCase: "Ask to run yen-yen's PR jobs on the Alienware runner instead of paid GitHub minutes, for a person to approve."
|
|
391
|
+
},
|
|
356
392
|
{
|
|
357
393
|
name: "explain_finding",
|
|
358
394
|
title: "Explain one finding",
|
|
@@ -705,6 +741,14 @@ var TOOL_CATALOG = [
|
|
|
705
741
|
hints: { readOnly: false, destructive: false, idempotent: true, openWorld: true },
|
|
706
742
|
useCase: "Pull my open Sentry issues into Mushi so I can triage and fix them."
|
|
707
743
|
},
|
|
744
|
+
{
|
|
745
|
+
name: "file_report",
|
|
746
|
+
title: "File a report",
|
|
747
|
+
description: "File a free-form report on a project by hand: a bug you found yourself, a backlog item, or work for an agent. Pass title (3-200 chars) and description (up to 10000 chars: what happens, steps, what you expected, how to check it is fixed); severity (critical | high | medium | low) and component are optional hints that triage may refine. The report is stored with status new and goes through the same triage as a user report (classification, diagnosis), so it can then be dispatched with dispatch_fix. Returns { reportId, projectId, title, status, severity, component }. Write; not idempotent (a retry files a second report); at most 30 filed reports per project an hour; viewers cannot file. Use for work no user reported; for issues already in Sentry use import_sentry_issues. Then call triage_issue on the new reportId.",
|
|
748
|
+
scope: "mcp:write",
|
|
749
|
+
hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
|
|
750
|
+
useCase: "Log this bug I found (or this backlog item) in Mushi so it gets triaged and fixed."
|
|
751
|
+
},
|
|
708
752
|
{
|
|
709
753
|
name: "triage_next_steps",
|
|
710
754
|
title: "What should I work on now?",
|
|
@@ -812,7 +856,7 @@ var TDD_TOOL_CATALOG = [
|
|
|
812
856
|
{
|
|
813
857
|
name: "list_byok_keys",
|
|
814
858
|
title: "List your API key pool",
|
|
815
|
-
description: "List the
|
|
859
|
+
description: "List the BYOK API keys this project uses, grouped by provider (anthropic | openai | openrouter | firecrawl | browserbase | cursor | supabase). Returns pooled { keys: [{ id, provider_slug, label, priority, status, cooldown_until, test_status, key_hint, base_url, last_tested_at, last_used_at, scope }] } where scope is project (this app), organization (every app in its organization) or universal (every app its organization owner owns); they are tried in that order, after the legacy credential. Also read-only { legacyKeys } metadata for credentials saved before the pooled lifecycle \u2014 never the raw secret. Read-only. Use to see which keys are validated, active, pending, legacy, shared, or rate-limited; use add_byok_key to add one.",
|
|
816
860
|
scope: "mcp:read",
|
|
817
861
|
hints: { readOnly: true, idempotent: true, openWorld: true },
|
|
818
862
|
useCase: "Which API keys are active and which are rate-limited?"
|
|
@@ -820,7 +864,7 @@ var TDD_TOOL_CATALOG = [
|
|
|
820
864
|
{
|
|
821
865
|
name: "add_byok_key",
|
|
822
866
|
title: "Add an API key",
|
|
823
|
-
description: "Add and immediately validate a BYOK API key for anthropic | openai | openrouter | firecrawl | browserbase | cursor | supabase (a scoped, read-only Supabase access token, checked against the linked supabase_project_ref). The raw key is stored encrypted in Supabase Vault and never returned; failed probes remain quarantined. Optional baseUrl is accepted only for allow-listed OpenAI-compatible HTTPS providers. Write; NOT idempotent.",
|
|
867
|
+
description: "Add and immediately validate a BYOK API key for anthropic | openai | openrouter | firecrawl | browserbase | cursor | supabase (a scoped, read-only Supabase access token, checked against the linked supabase_project_ref). The raw key is stored encrypted in Supabase Vault and never returned; failed probes remain quarantined. Optional baseUrl is accepted only for allow-listed OpenAI-compatible HTTPS providers. The key is added to this one app; a key for every app in the organization or every app you own (universal) is added in the console, Settings \u2192 AI keys. Write; NOT idempotent.",
|
|
824
868
|
scope: "mcp:write",
|
|
825
869
|
hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
|
|
826
870
|
useCase: "Add a backup Anthropic key to the pool."
|
|
@@ -844,7 +888,7 @@ var TDD_TOOL_CATALOG = [
|
|
|
844
888
|
{
|
|
845
889
|
name: "get_spend_down_status",
|
|
846
890
|
title: "Spend-down status of Cursor keys",
|
|
847
|
-
description: "For each Cursor key this project can use, show spend-down mode (ADR 0028): whether it is on, when the credits expire, the window state (off | not_started | active | expired | key_unusable), fixes started today out of the daily limit, the apps the key pays for, and what the last worker tick did. Returns { keys: [{ id, label, keyHint, scope, enabled, creditsExpireAt, model, dailyLimit, windowDays, state, startsAt, dispatchedToday, remainingToday, projects, lastRunAt, lastSummary }] }. Read-only. Use to see whether expiring Cursor credits are being used; use set_byok_spend_down to change it.",
|
|
891
|
+
description: "For each Cursor key this project can use, show spend-down mode (ADR 0028): whether it is on, when the credits expire, the window state (off | not_started | active | expired | key_unusable), fixes started today out of the daily limit, the apps the key pays for that this project can see (each with its stop-loss state: paused when, over its spend-down runs of the last 14 days with 20+ samples, the 95% Wilson bound puts its Opus merge rate under 20%, hold rate over 35% or no-PR share over 50%; a paused app still gets 1 probe fix a day), a count of its other apps, the last 7 days' scoreboard (key-wide totals; per app \xD7 model \xD7 day rows for visible apps: runs, PRs, no-PR verdicts, other failures, Opus merge / fix_first / hold, merged, latest review cost per PR, merge and mergeable yield), and what the last worker tick did. Returns { keys: [{ id, label, keyHint, scope, enabled, creditsExpireAt, model, dailyLimit, windowDays, state, startsAt, dispatchedToday, remainingToday, projects: [{ id, name, canResume, stopLoss }], otherApps, projectsNote, stopLossNote, scoreboard: { days, since, totals, rows } | null, scoreboardNote, lastRunAt, lastSummary }], reviewFollowups: { days, dispatched, finished, pushed, noChange, verdictsAfter: { merge, fix_first, hold }, awaitingReview, conversionRate, skipped, apps } | null } \u2014 reviewFollowups (ADR 0032) is what sending fix_first PRs back to an agent with the Opus findings produced in the last 7 days, over the apps you can access. Read-only. Use to see whether expiring Cursor credits are being used and what they produce; use set_byok_spend_down to change it.",
|
|
848
892
|
scope: "mcp:read",
|
|
849
893
|
hints: { readOnly: true, idempotent: true, openWorld: false },
|
|
850
894
|
useCase: "Are my expiring Cursor credits being spent on fixes?"
|
|
@@ -1240,6 +1284,7 @@ var TOOL_FEATURE_MAP = {
|
|
|
1240
1284
|
get_report_evidence: "triage",
|
|
1241
1285
|
triage_issue: "triage",
|
|
1242
1286
|
import_sentry_issues: "triage",
|
|
1287
|
+
file_report: "triage",
|
|
1243
1288
|
query_lessons: "triage",
|
|
1244
1289
|
list_lessons: "triage",
|
|
1245
1290
|
suggest_fix: "triage",
|
|
@@ -1291,6 +1336,10 @@ var TOOL_FEATURE_MAP = {
|
|
|
1291
1336
|
transition_status: "fixes",
|
|
1292
1337
|
merge_fix: "fixes",
|
|
1293
1338
|
refresh_ci: "fixes",
|
|
1339
|
+
get_ci_overview: "fixes",
|
|
1340
|
+
get_ci_costs: "fixes",
|
|
1341
|
+
request_ci_placement_change: "fixes",
|
|
1342
|
+
get_fix_verification: "fixes",
|
|
1294
1343
|
reopen_report: "fixes",
|
|
1295
1344
|
reply_to_reporter: "fixes",
|
|
1296
1345
|
request_reporter_info: "fixes",
|
|
@@ -1440,7 +1489,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
1440
1489
|
route: "/",
|
|
1441
1490
|
markdown: "index.md",
|
|
1442
1491
|
keywords: ["know", "ai-built", "app", "broke", "fix", "ready"],
|
|
1443
|
-
headings: ["
|
|
1492
|
+
headings: ["The problem it solves", "A real example from our own sites", "What this is (and is not)", "Where it stands today", "This is what a diagnosis looks like", "See it in action", "Get started", "Install it in your app"],
|
|
1444
1493
|
excerpt: "Your AI shipped it. Mushi tells you why it broke: a plain-English diagnosis and a ready fix in your editor. Open source, Sentry optional."
|
|
1445
1494
|
},
|
|
1446
1495
|
{
|
|
@@ -1497,6 +1546,24 @@ var MUSHI_DOCS_INDEX = [
|
|
|
1497
1546
|
headings: ["Reading your usage card", "Usage breakdown", "Predictability controls", "Upgrading your plan", "Changing plan", "Managing payment and invoices", "CLI parity", "Related docs"],
|
|
1498
1547
|
excerpt: "The Billing page shows your diagnosis quota, usage alerts at 50% and 80%, your projected bill, and spend caps for your Mushi plan."
|
|
1499
1548
|
},
|
|
1549
|
+
{
|
|
1550
|
+
title: "Checks",
|
|
1551
|
+
url: docUrl("/admin/checks"),
|
|
1552
|
+
route: "/admin/checks",
|
|
1553
|
+
markdown: "admin/checks.md",
|
|
1554
|
+
keywords: ["admin", "checks"],
|
|
1555
|
+
headings: ["App checks", "AI quality"],
|
|
1556
|
+
excerpt: "The Checks page lists every automatic check on this app. Each card opens that check, with the same live count the sidebar shows."
|
|
1557
|
+
},
|
|
1558
|
+
{
|
|
1559
|
+
title: "CI runners",
|
|
1560
|
+
url: docUrl("/admin/ci"),
|
|
1561
|
+
route: "/admin/ci",
|
|
1562
|
+
markdown: "admin/ci.md",
|
|
1563
|
+
keywords: ["admin", "ci", "runners"],
|
|
1564
|
+
headings: ["Test machine or your code", "Queue and wait", "Runner map", "What would make fixes land sooner", "When nothing has reported in", "Related pages"],
|
|
1565
|
+
excerpt: "The console CI runners page shows where tests run, how long they wait for a machine, and whether a red check was your code or the test machine."
|
|
1566
|
+
},
|
|
1500
1567
|
{
|
|
1501
1568
|
title: "CLI device auth",
|
|
1502
1569
|
url: docUrl("/admin/cli-auth"),
|
|
@@ -1551,6 +1618,15 @@ var MUSHI_DOCS_INDEX = [
|
|
|
1551
1618
|
headings: ["What's tracked", "Charts", "Controlling costs", "Export", "Related pages"],
|
|
1552
1619
|
excerpt: "The Cost page shows LLM token use and estimated spend per model and pipeline for a Mushi project, so you can see what each diagnosis costs."
|
|
1553
1620
|
},
|
|
1621
|
+
{
|
|
1622
|
+
title: "Spend credits",
|
|
1623
|
+
url: docUrl("/admin/credits"),
|
|
1624
|
+
route: "/admin/credits",
|
|
1625
|
+
markdown: "admin/credits.md",
|
|
1626
|
+
keywords: ["admin", "credits", "spend"],
|
|
1627
|
+
headings: ["Cursor: fix bugs", "Cursor: improve your apps with skills", "Firecrawl: find bugs on your live sites", "Site audit", "Search rank", "Where the fixes go"],
|
|
1628
|
+
excerpt: "Spend credits lists expiring Cursor and Firecrawl credits and every way Mushi can spend them fixing bugs, improving apps with skills and checking sites."
|
|
1629
|
+
},
|
|
1554
1630
|
{
|
|
1555
1631
|
title: "Dashboard",
|
|
1556
1632
|
url: docUrl("/admin/dashboard"),
|
|
@@ -1560,6 +1636,15 @@ var MUSHI_DOCS_INDEX = [
|
|
|
1560
1636
|
headings: ["What to look for first", "Flow canvas", "KPI tiles (14-day window)", "Charts row (14 days)", "Triage queue", "Insights row", "Common tasks", "Morning check (2 minutes)"],
|
|
1561
1637
|
excerpt: "The Mushi dashboard answers whether anything broke since your last release \u2014 new reports, overnight fix runs and pipeline health on one screen."
|
|
1562
1638
|
},
|
|
1639
|
+
{
|
|
1640
|
+
title: "Design system",
|
|
1641
|
+
url: docUrl("/admin/design"),
|
|
1642
|
+
route: "/admin/design",
|
|
1643
|
+
markdown: "admin/design.md",
|
|
1644
|
+
keywords: ["admin", "design", "system"],
|
|
1645
|
+
headings: ["Tokens", "The deviance score", "How an edit becomes a draft PR", "Related"],
|
|
1646
|
+
excerpt: "The Design system page shows your tokens, contrast pairs, type scale and a deviance score for off-token code. Token and rule edits open a draft pull request."
|
|
1647
|
+
},
|
|
1563
1648
|
{
|
|
1564
1649
|
title: "Docs bridge",
|
|
1565
1650
|
url: docUrl("/admin/docs-bridge"),
|
|
@@ -1839,6 +1924,15 @@ var MUSHI_DOCS_INDEX = [
|
|
|
1839
1924
|
headings: ["Presence", "Comments", "Writing a comment", "Editing and deleting", "Timestamps", "Notifications", "Audit log", "See also"],
|
|
1840
1925
|
excerpt: "How Mushi report pages support real-time collaboration \u2014 see who else is viewing a report and watch new comments arrive without a refresh."
|
|
1841
1926
|
},
|
|
1927
|
+
{
|
|
1928
|
+
title: "App blueprint",
|
|
1929
|
+
url: docUrl("/admin/recipe"),
|
|
1930
|
+
route: "/admin/recipe",
|
|
1931
|
+
markdown: "admin/recipe.md",
|
|
1932
|
+
keywords: ["admin", "recipe", "app", "blueprint"],
|
|
1933
|
+
headings: ["Refresh and status", "Diagram and list", 'What "not connected" means', "Side panel", "Risk checks", "Related"],
|
|
1934
|
+
excerpt: "The App blueprint page shows what this app is built from, the state of each part, and the draft pull request a change opens."
|
|
1935
|
+
},
|
|
1842
1936
|
{
|
|
1843
1937
|
title: "Releases",
|
|
1844
1938
|
url: docUrl("/admin/releases"),
|
|
@@ -1980,9 +2074,18 @@ var MUSHI_DOCS_INDEX = [
|
|
|
1980
2074
|
route: "/admin/ux-runs",
|
|
1981
2075
|
markdown: "admin/ux-runs.md",
|
|
1982
2076
|
keywords: ["admin", "ux-runs", "runs", "ux"],
|
|
1983
|
-
headings: ["Run in the cloud", "What you see", "File as bug", "Where the changes are"],
|
|
2077
|
+
headings: ["Run in the cloud", "What you see", "File as bug", "Audit signed-in screens", "Where the changes are"],
|
|
1984
2078
|
excerpt: "Each screen your coding agent worked on in a mushi ux run, with its plan, every attempt, before and after screenshots, and what was kept."
|
|
1985
2079
|
},
|
|
2080
|
+
{
|
|
2081
|
+
title: "Verified merge",
|
|
2082
|
+
url: docUrl("/admin/verified-merge"),
|
|
2083
|
+
route: "/admin/verified-merge",
|
|
2084
|
+
markdown: "admin/verified-merge.md",
|
|
2085
|
+
keywords: ["admin", "verified-merge", "verified", "merge"],
|
|
2086
|
+
headings: ["The gates", "Add the workflow", "What the check does", "The test command", "Run it on your own machine", "Turn on automatic merge", "After the merge", "Check one fix"],
|
|
2087
|
+
excerpt: "Mushi merges an agent's fix on its own only with proof \u2014 a test that fails without the fix and passes with it, run in your own CI."
|
|
2088
|
+
},
|
|
1986
2089
|
{
|
|
1987
2090
|
title: "Voice intake",
|
|
1988
2091
|
url: docUrl("/admin/voice"),
|
|
@@ -2124,7 +2227,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
2124
2227
|
route: "/concepts/agent-pr-review",
|
|
2125
2228
|
markdown: "concepts/agent-pr-review.md",
|
|
2126
2229
|
keywords: ["concepts", "agent-pr-review", "agent", "review", "pr"],
|
|
2127
|
-
headings: ["What you see", "What the review checks", "Re-running a review", "Cost and keys", "For operators"],
|
|
2230
|
+
headings: ["What you see", "What the review checks", "Re-running a review", 'When the review says "fix first"', "Spend-down and its safety stop", "Cost and keys", "For operators"],
|
|
2128
2231
|
excerpt: 'Claude Opus 5.5 reviews every pull request a cloud coding agent opens as a fix, and a "hold" stops Mushi from merging it until you choose to.'
|
|
2129
2232
|
},
|
|
2130
2233
|
{
|
|
@@ -2244,6 +2347,15 @@ var MUSHI_DOCS_INDEX = [
|
|
|
2244
2347
|
headings: ["Storage", "Why both pgvector and AGE?", "Indexing", "Bug Ontology"],
|
|
2245
2348
|
excerpt: "How Mushi links reports, components, fixes and developers in a per-project knowledge graph, with pgvector for similarity and Apache AGE for traversal."
|
|
2246
2349
|
},
|
|
2350
|
+
{
|
|
2351
|
+
title: "Known holes in dependencies",
|
|
2352
|
+
url: docUrl("/concepts/known-holes"),
|
|
2353
|
+
route: "/concepts/known-holes",
|
|
2354
|
+
markdown: "concepts/known-holes.md",
|
|
2355
|
+
keywords: ["concepts", "known-holes", "known", "holes", "dependencies"],
|
|
2356
|
+
headings: ["What Mushi checks", "What becomes a report", "How bad is it", "The fix", "What leaves Mushi", "Where to see it", "Data sources"],
|
|
2357
|
+
excerpt: "Mushi checks the exact versions in your lockfiles and runtime pins against published advisories, and files each fixable hole as a bug with the upgrade."
|
|
2358
|
+
},
|
|
2247
2359
|
{
|
|
2248
2360
|
title: "Multi-repo coordinated fixes",
|
|
2249
2361
|
url: docUrl("/concepts/multi-repo-fixes"),
|
|
@@ -2259,8 +2371,8 @@ var MUSHI_DOCS_INDEX = [
|
|
|
2259
2371
|
route: "/concepts/open-source",
|
|
2260
2372
|
markdown: "concepts/open-source.md",
|
|
2261
2373
|
keywords: ["concepts", "open-source", "open", "source", "licensing"],
|
|
2262
|
-
headings: ["Open-core, one repo", "Why MIT for the SDK?", "Why AGPLv3 for the server?", "No lock-in", "What's paid and what's free"
|
|
2263
|
-
excerpt: "What is open
|
|
2374
|
+
headings: ["Open-core, one repo", "Why MIT for the SDK?", "Why AGPLv3 for the server?", "Why AGPLv3 for the console?", "What the hosted service keeps", "Contributing", "No lock-in", "What's paid and what's free"],
|
|
2375
|
+
excerpt: "What is open in Mushi: MIT SDKs to embed anywhere, an AGPLv3 server and console to self-host, a small commercial edition, and what the hosted service keeps."
|
|
2264
2376
|
},
|
|
2265
2377
|
{
|
|
2266
2378
|
title: "Connecting your orchestrator (MCP / A2A / REST / AG-UI)",
|
|
@@ -2532,6 +2644,15 @@ var MUSHI_DOCS_INDEX = [
|
|
|
2532
2644
|
headings: ["What lives here", "The four independent deploy paths"],
|
|
2533
2645
|
excerpt: "Runbooks for maintainers running Mushi Cloud or publishing the open-source packages \u2014 deployment, releases and status. Not needed to use the SDK."
|
|
2534
2646
|
},
|
|
2647
|
+
{
|
|
2648
|
+
title: "CI runners",
|
|
2649
|
+
url: docUrl("/operating/ci-runners"),
|
|
2650
|
+
route: "/operating/ci-runners",
|
|
2651
|
+
markdown: "operating/ci-runners.md",
|
|
2652
|
+
keywords: ["operating", "ci-runners", "runners", "ci"],
|
|
2653
|
+
headings: ["Your fix failed, or the test machine stopped", "The CI view", "GitHub permissions", "What CI costs, and where it should run", "Why it costs what it costs", "Your figures", "Advice", "Change where CI runs"],
|
|
2654
|
+
excerpt: "See where your tests run and why a fix waits. Tell a broken fix from a stopped test machine, and add your own machine as a runner safely."
|
|
2655
|
+
},
|
|
2535
2656
|
{
|
|
2536
2657
|
title: "Deployment & releases",
|
|
2537
2658
|
url: docUrl("/operating/deployment"),
|
|
@@ -2709,7 +2830,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
2709
2830
|
route: "/quickstart",
|
|
2710
2831
|
markdown: "quickstart/index.md",
|
|
2711
2832
|
keywords: ["quickstart", "fix", "first", "bug", "60", "seconds", "choose", "stack"],
|
|
2712
|
-
headings: ["Start here (
|
|
2833
|
+
headings: ["What you need", "The fastest way: one command", "Start here (editor first)", "Pick your stack", "How do I install the SDK?", "Troubleshooting"],
|
|
2713
2834
|
excerpt: "Install Mushi with npx mushi-mushi, connect Cursor or Claude Code over MCP, and turn user bug reports into plain-English diagnoses with ready fixes."
|
|
2714
2835
|
},
|
|
2715
2836
|
{
|
|
@@ -2844,7 +2965,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
2844
2965
|
route: "/roadmap",
|
|
2845
2966
|
markdown: "roadmap.md",
|
|
2846
2967
|
keywords: ["roadmap"],
|
|
2847
|
-
headings: ["Live boards", "Release waves", "Wave E details (in-flight)", "Wave D highlights (shipped)", "Completed highlights (Wave C, v0.8.0)"],
|
|
2968
|
+
headings: ["Live boards", "Release waves", "Wave E details (in-flight)", "Agent fixes you can trust (October 2026)", "Wave D highlights (shipped)", "Completed highlights (Wave C, v0.8.0)"],
|
|
2848
2969
|
excerpt: "Where Mushi Mushi is headed \u2014 upcoming SDK platforms, diagnosis speed targets, and console features, updated as work lands."
|
|
2849
2970
|
},
|
|
2850
2971
|
{
|
|
@@ -2925,7 +3046,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
2925
3046
|
route: "/sdks/cli",
|
|
2926
3047
|
markdown: "sdks/cli.md",
|
|
2927
3048
|
keywords: ["sdks", "cli", "@mushi-mushi/cli"],
|
|
2928
|
-
headings: ["Console \u2194 CLI setup loop", "Setup & health", "mushi doctor", "mushi nudge", "Reports & lessons", "Sentry issues already open", "Reporter updates held for review"
|
|
3049
|
+
headings: ["Console \u2194 CLI setup loop", "Setup & health", "mushi doctor", "mushi nudge", "Reports & lessons", "Sentry issues already open", "File a report yourself", "Reporter updates held for review"],
|
|
2929
3050
|
excerpt: "Reference for @mushi-mushi/cli \u2014 log in, connect a project, run doctor, list reports, dispatch agent fixes and merge their pull requests from the terminal."
|
|
2930
3051
|
},
|
|
2931
3052
|
{
|
|
@@ -3786,6 +3907,7 @@ var GATE_IDS = [
|
|
|
3786
3907
|
"radar",
|
|
3787
3908
|
"portfolio_radar",
|
|
3788
3909
|
"portfolio_radar_ci",
|
|
3910
|
+
"portfolio_radar_vulns",
|
|
3789
3911
|
"store_review"
|
|
3790
3912
|
];
|
|
3791
3913
|
var GATE_FINDING_SEVERITIES = ["info", "warn", "error"];
|
|
@@ -4328,6 +4450,22 @@ function createMushiServer(config) {
|
|
|
4328
4450
|
return jsonText(await apiCall(`/v1/admin/fixes/${args.fixId}/timeline`, { headers }));
|
|
4329
4451
|
}
|
|
4330
4452
|
);
|
|
4453
|
+
server.registerTool(
|
|
4454
|
+
"get_fix_verification",
|
|
4455
|
+
{
|
|
4456
|
+
title: titleOf("get_fix_verification"),
|
|
4457
|
+
description: descOf("get_fix_verification"),
|
|
4458
|
+
annotations: annotationsFor("get_fix_verification"),
|
|
4459
|
+
inputSchema: z.object({
|
|
4460
|
+
fixId: z.string().describe("fix_attempt UUID"),
|
|
4461
|
+
projectId: z.string().optional().describe("Project UUID \u2014 required for org-scoped keys with multiple projects.")
|
|
4462
|
+
})
|
|
4463
|
+
},
|
|
4464
|
+
async (args) => {
|
|
4465
|
+
const { headers } = await projectScopeHeaders(args.projectId);
|
|
4466
|
+
return jsonText(await apiCall(`/v1/admin/fixes/${encodeURIComponent(args.fixId)}/verification`, { headers }));
|
|
4467
|
+
}
|
|
4468
|
+
);
|
|
4331
4469
|
server.registerTool(
|
|
4332
4470
|
"get_blast_radius",
|
|
4333
4471
|
{
|
|
@@ -4792,6 +4930,104 @@ function createMushiServer(config) {
|
|
|
4792
4930
|
return jsonText(await apiCall(`/v1/admin/code-health?${qs}`));
|
|
4793
4931
|
}
|
|
4794
4932
|
);
|
|
4933
|
+
const CI_ADVICE_OUTPUT = z.looseObject({
|
|
4934
|
+
id: z.string(),
|
|
4935
|
+
severity: z.string(),
|
|
4936
|
+
title: z.string(),
|
|
4937
|
+
detail: z.string().nullable().optional(),
|
|
4938
|
+
evidence: z.unknown().optional(),
|
|
4939
|
+
fix: z.string().nullable().optional()
|
|
4940
|
+
});
|
|
4941
|
+
server.registerTool(
|
|
4942
|
+
"get_ci_overview",
|
|
4943
|
+
{
|
|
4944
|
+
title: titleOf("get_ci_overview"),
|
|
4945
|
+
description: descOf("get_ci_overview"),
|
|
4946
|
+
annotations: annotationsFor("get_ci_overview"),
|
|
4947
|
+
inputSchema: z.object({
|
|
4948
|
+
projectId: z.string().optional().describe("Project UUID \u2014 defaults to the server-configured project; omitted with an account-level key, every project you can read"),
|
|
4949
|
+
days: z.number().int().min(1).max(30).optional().describe("Window in days (default 7)"),
|
|
4950
|
+
refresh: z.boolean().optional().describe("Read GitHub first instead of the last 10-minute sync (at most once a minute per project)")
|
|
4951
|
+
}),
|
|
4952
|
+
outputSchema: z.looseObject({
|
|
4953
|
+
generatedAt: z.string().optional(),
|
|
4954
|
+
refreshedAt: z.string().nullable().optional(),
|
|
4955
|
+
window: z.unknown().optional(),
|
|
4956
|
+
permissions: z.unknown().optional(),
|
|
4957
|
+
hosts: z.array(z.looseObject({})).optional().describe("Machines that send a runner heartbeat"),
|
|
4958
|
+
runners: z.array(z.looseObject({})).optional().describe("GitHub runners seen, with status"),
|
|
4959
|
+
repos: z.array(z.looseObject({})).optional(),
|
|
4960
|
+
jobs: z.array(z.looseObject({})).optional().describe("Latest jobs with their infra or code verdict"),
|
|
4961
|
+
stats: z.looseObject({}).nullable().optional(),
|
|
4962
|
+
advice: z.array(CI_ADVICE_OUTPUT).optional().describe("Rule-based advice with evidence, most severe first")
|
|
4963
|
+
})
|
|
4964
|
+
},
|
|
4965
|
+
async (args) => {
|
|
4966
|
+
const pid = args.projectId ? await resolveProjectId(args.projectId) : projectId || void 0;
|
|
4967
|
+
const qs = new URLSearchParams({ days: String(args.days ?? 7) });
|
|
4968
|
+
if (pid) qs.set("project_id", pid);
|
|
4969
|
+
if (args.refresh) qs.set("refresh", "1");
|
|
4970
|
+
return jsonResult(
|
|
4971
|
+
await apiCall(`/v1/admin/ci/overview?${qs}`, void 0, args.refresh ? { minTimeoutMs: 6e4 } : void 0)
|
|
4972
|
+
);
|
|
4973
|
+
}
|
|
4974
|
+
);
|
|
4975
|
+
server.registerTool(
|
|
4976
|
+
"get_ci_costs",
|
|
4977
|
+
{
|
|
4978
|
+
title: titleOf("get_ci_costs"),
|
|
4979
|
+
description: descOf("get_ci_costs"),
|
|
4980
|
+
annotations: annotationsFor("get_ci_costs"),
|
|
4981
|
+
inputSchema: z.object({
|
|
4982
|
+
projectId: z.string().optional().describe("Project UUID \u2014 defaults to the server-configured project; omitted with an account-level key, every project you can read"),
|
|
4983
|
+
days: z.number().int().min(1).max(30).optional().describe("Window in days (default 30)")
|
|
4984
|
+
}),
|
|
4985
|
+
outputSchema: z.looseObject({
|
|
4986
|
+
window: z.unknown().optional(),
|
|
4987
|
+
dataDays: z.number().optional(),
|
|
4988
|
+
lowConfidence: z.boolean().optional().describe("Under 7 days of data"),
|
|
4989
|
+
source: z.string().optional(),
|
|
4990
|
+
sourceNote: z.string().nullable().optional(),
|
|
4991
|
+
rates: z.unknown().optional().describe("GitHub list prices and the date they were read"),
|
|
4992
|
+
fields: z.record(z.string(), z.string()).optional().describe("measured | estimated per field"),
|
|
4993
|
+
settings: z.array(z.looseObject({})).optional(),
|
|
4994
|
+
repos: z.array(z.looseObject({})).optional(),
|
|
4995
|
+
rows: z.array(z.looseObject({})).optional().describe("Per repo \xD7 runner class: wait, run time, pass rate, minutes, cost"),
|
|
4996
|
+
accounts: z.array(z.looseObject({})).optional().describe("Included minutes per GitHub owner"),
|
|
4997
|
+
machines: z.array(z.looseObject({})).optional(),
|
|
4998
|
+
speed: z.array(z.looseObject({})).optional(),
|
|
4999
|
+
whatIfs: z.array(z.looseObject({})).optional(),
|
|
5000
|
+
explain: z.looseObject({}).optional(),
|
|
5001
|
+
advice: z.array(CI_ADVICE_OUTPUT).optional()
|
|
5002
|
+
})
|
|
5003
|
+
},
|
|
5004
|
+
async (args) => {
|
|
5005
|
+
const pid = args.projectId ? await resolveProjectId(args.projectId) : projectId || void 0;
|
|
5006
|
+
const qs = new URLSearchParams({ days: String(args.days ?? 30) });
|
|
5007
|
+
if (pid) qs.set("project_id", pid);
|
|
5008
|
+
return jsonResult(await apiCall(`/v1/admin/ci/compare?${qs}`, void 0, { minTimeoutMs: 6e4 }));
|
|
5009
|
+
}
|
|
5010
|
+
);
|
|
5011
|
+
server.registerTool(
|
|
5012
|
+
"request_ci_placement_change",
|
|
5013
|
+
{
|
|
5014
|
+
title: titleOf("request_ci_placement_change"),
|
|
5015
|
+
description: descOf("request_ci_placement_change"),
|
|
5016
|
+
annotations: annotationsFor("request_ci_placement_change"),
|
|
5017
|
+
inputSchema: z.object({
|
|
5018
|
+
projectId: z.string().optional().describe("Project UUID \u2014 defaults to the server-configured project"),
|
|
5019
|
+
repo: z.string().regex(/^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/).describe("owner/repo, connected to the project"),
|
|
5020
|
+
variable: z.string().regex(/^(?:LINUX_RUNNER|RUNNER_[A-Z0-9_]{1,60})$/).describe("LINUX_RUNNER or RUNNER_<WORKFLOW>"),
|
|
5021
|
+
value: z.string().min(1).max(100).nullable().describe("One runner label, or null to remove the variable"),
|
|
5022
|
+
reason: z.string().max(500).optional().describe("Why, shown to the approver")
|
|
5023
|
+
})
|
|
5024
|
+
},
|
|
5025
|
+
async (args) => {
|
|
5026
|
+
const pid = await resolveProjectId(args.projectId);
|
|
5027
|
+
const body = { projectId: pid, repo: args.repo, variable: args.variable, value: args.value, ...args.reason ? { reason: args.reason } : {} };
|
|
5028
|
+
return jsonText(await apiCall("/v1/admin/ci/placement/requests", { method: "POST", body: JSON.stringify(body) }));
|
|
5029
|
+
}
|
|
5030
|
+
);
|
|
4795
5031
|
server.registerTool(
|
|
4796
5032
|
"explain_finding",
|
|
4797
5033
|
{
|
|
@@ -6078,6 +6314,42 @@ function createMushiServer(config) {
|
|
|
6078
6314
|
return jsonResult(data);
|
|
6079
6315
|
}
|
|
6080
6316
|
);
|
|
6317
|
+
server.registerTool(
|
|
6318
|
+
"file_report",
|
|
6319
|
+
{
|
|
6320
|
+
title: titleOf("file_report"),
|
|
6321
|
+
description: descOf("file_report"),
|
|
6322
|
+
annotations: annotationsFor("file_report"),
|
|
6323
|
+
inputSchema: z.object({
|
|
6324
|
+
title: z.string().min(3).max(200).describe("One-line title (3-200 characters)"),
|
|
6325
|
+
description: z.string().min(1).max(1e4).describe("What happens, steps to reproduce, what you expected, and how to check it is fixed"),
|
|
6326
|
+
severity: z.enum(["critical", "high", "medium", "low"]).optional().describe("Your severity hint; triage may refine it"),
|
|
6327
|
+
component: z.string().max(200).optional().describe('Area of the app, e.g. "checkout"'),
|
|
6328
|
+
projectId: z.string().optional().describe("Project UUID. Defaults to configured project.")
|
|
6329
|
+
}),
|
|
6330
|
+
outputSchema: z.object({
|
|
6331
|
+
reportId: z.string().describe("The new report id; pass it to triage_issue or dispatch_fix"),
|
|
6332
|
+
projectId: z.string(),
|
|
6333
|
+
title: z.string(),
|
|
6334
|
+
status: z.string().describe("Always new: triage starts right away"),
|
|
6335
|
+
severity: z.string().nullable(),
|
|
6336
|
+
component: z.string().nullable()
|
|
6337
|
+
})
|
|
6338
|
+
},
|
|
6339
|
+
async (args) => {
|
|
6340
|
+
const pid = await resolveProjectId(args.projectId);
|
|
6341
|
+
const data = await apiCall(`/v1/admin/projects/${pid}/reports`, {
|
|
6342
|
+
method: "POST",
|
|
6343
|
+
body: JSON.stringify({
|
|
6344
|
+
title: args.title,
|
|
6345
|
+
description: args.description,
|
|
6346
|
+
severity: args.severity,
|
|
6347
|
+
component: args.component
|
|
6348
|
+
})
|
|
6349
|
+
});
|
|
6350
|
+
return jsonResult(data);
|
|
6351
|
+
}
|
|
6352
|
+
);
|
|
6081
6353
|
server.registerTool(
|
|
6082
6354
|
"transition_status",
|
|
6083
6355
|
{
|
|
@@ -6112,7 +6384,8 @@ function createMushiServer(config) {
|
|
|
6112
6384
|
method: "PATCH",
|
|
6113
6385
|
body: JSON.stringify({
|
|
6114
6386
|
status: args.status,
|
|
6115
|
-
|
|
6387
|
+
// Kept as a team note on the report (the console's Triage note).
|
|
6388
|
+
note: args.reason,
|
|
6116
6389
|
closed_reason: args.closedReason,
|
|
6117
6390
|
reporter_message: args.reporterMessage
|
|
6118
6391
|
})
|
package/dist/server.js
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
TDD_TOOL_CATALOG,
|
|
5
5
|
TOOL_CATALOG,
|
|
6
6
|
routeUseMushiIntent
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-6SHKBN6R.js";
|
|
8
8
|
import {
|
|
9
9
|
MUSHI_SERVER_METADATA
|
|
10
10
|
} from "./chunk-FJRPC4VR.js";
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
DEPRECATED_TOOL_ALIASES,
|
|
13
13
|
TOOL_FEATURE_MAP,
|
|
14
14
|
toolMatchesFeatures
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-7RWHDJPZ.js";
|
|
16
16
|
|
|
17
17
|
// src/server.ts
|
|
18
18
|
import { AsyncLocalStorage } from "async_hooks";
|
|
@@ -32,7 +32,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
32
32
|
route: "/",
|
|
33
33
|
markdown: "index.md",
|
|
34
34
|
keywords: ["know", "ai-built", "app", "broke", "fix", "ready"],
|
|
35
|
-
headings: ["
|
|
35
|
+
headings: ["The problem it solves", "A real example from our own sites", "What this is (and is not)", "Where it stands today", "This is what a diagnosis looks like", "See it in action", "Get started", "Install it in your app"],
|
|
36
36
|
excerpt: "Your AI shipped it. Mushi tells you why it broke: a plain-English diagnosis and a ready fix in your editor. Open source, Sentry optional."
|
|
37
37
|
},
|
|
38
38
|
{
|
|
@@ -89,6 +89,24 @@ var MUSHI_DOCS_INDEX = [
|
|
|
89
89
|
headings: ["Reading your usage card", "Usage breakdown", "Predictability controls", "Upgrading your plan", "Changing plan", "Managing payment and invoices", "CLI parity", "Related docs"],
|
|
90
90
|
excerpt: "The Billing page shows your diagnosis quota, usage alerts at 50% and 80%, your projected bill, and spend caps for your Mushi plan."
|
|
91
91
|
},
|
|
92
|
+
{
|
|
93
|
+
title: "Checks",
|
|
94
|
+
url: docUrl("/admin/checks"),
|
|
95
|
+
route: "/admin/checks",
|
|
96
|
+
markdown: "admin/checks.md",
|
|
97
|
+
keywords: ["admin", "checks"],
|
|
98
|
+
headings: ["App checks", "AI quality"],
|
|
99
|
+
excerpt: "The Checks page lists every automatic check on this app. Each card opens that check, with the same live count the sidebar shows."
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
title: "CI runners",
|
|
103
|
+
url: docUrl("/admin/ci"),
|
|
104
|
+
route: "/admin/ci",
|
|
105
|
+
markdown: "admin/ci.md",
|
|
106
|
+
keywords: ["admin", "ci", "runners"],
|
|
107
|
+
headings: ["Test machine or your code", "Queue and wait", "Runner map", "What would make fixes land sooner", "When nothing has reported in", "Related pages"],
|
|
108
|
+
excerpt: "The console CI runners page shows where tests run, how long they wait for a machine, and whether a red check was your code or the test machine."
|
|
109
|
+
},
|
|
92
110
|
{
|
|
93
111
|
title: "CLI device auth",
|
|
94
112
|
url: docUrl("/admin/cli-auth"),
|
|
@@ -143,6 +161,15 @@ var MUSHI_DOCS_INDEX = [
|
|
|
143
161
|
headings: ["What's tracked", "Charts", "Controlling costs", "Export", "Related pages"],
|
|
144
162
|
excerpt: "The Cost page shows LLM token use and estimated spend per model and pipeline for a Mushi project, so you can see what each diagnosis costs."
|
|
145
163
|
},
|
|
164
|
+
{
|
|
165
|
+
title: "Spend credits",
|
|
166
|
+
url: docUrl("/admin/credits"),
|
|
167
|
+
route: "/admin/credits",
|
|
168
|
+
markdown: "admin/credits.md",
|
|
169
|
+
keywords: ["admin", "credits", "spend"],
|
|
170
|
+
headings: ["Cursor: fix bugs", "Cursor: improve your apps with skills", "Firecrawl: find bugs on your live sites", "Site audit", "Search rank", "Where the fixes go"],
|
|
171
|
+
excerpt: "Spend credits lists expiring Cursor and Firecrawl credits and every way Mushi can spend them fixing bugs, improving apps with skills and checking sites."
|
|
172
|
+
},
|
|
146
173
|
{
|
|
147
174
|
title: "Dashboard",
|
|
148
175
|
url: docUrl("/admin/dashboard"),
|
|
@@ -152,6 +179,15 @@ var MUSHI_DOCS_INDEX = [
|
|
|
152
179
|
headings: ["What to look for first", "Flow canvas", "KPI tiles (14-day window)", "Charts row (14 days)", "Triage queue", "Insights row", "Common tasks", "Morning check (2 minutes)"],
|
|
153
180
|
excerpt: "The Mushi dashboard answers whether anything broke since your last release \u2014 new reports, overnight fix runs and pipeline health on one screen."
|
|
154
181
|
},
|
|
182
|
+
{
|
|
183
|
+
title: "Design system",
|
|
184
|
+
url: docUrl("/admin/design"),
|
|
185
|
+
route: "/admin/design",
|
|
186
|
+
markdown: "admin/design.md",
|
|
187
|
+
keywords: ["admin", "design", "system"],
|
|
188
|
+
headings: ["Tokens", "The deviance score", "How an edit becomes a draft PR", "Related"],
|
|
189
|
+
excerpt: "The Design system page shows your tokens, contrast pairs, type scale and a deviance score for off-token code. Token and rule edits open a draft pull request."
|
|
190
|
+
},
|
|
155
191
|
{
|
|
156
192
|
title: "Docs bridge",
|
|
157
193
|
url: docUrl("/admin/docs-bridge"),
|
|
@@ -431,6 +467,15 @@ var MUSHI_DOCS_INDEX = [
|
|
|
431
467
|
headings: ["Presence", "Comments", "Writing a comment", "Editing and deleting", "Timestamps", "Notifications", "Audit log", "See also"],
|
|
432
468
|
excerpt: "How Mushi report pages support real-time collaboration \u2014 see who else is viewing a report and watch new comments arrive without a refresh."
|
|
433
469
|
},
|
|
470
|
+
{
|
|
471
|
+
title: "App blueprint",
|
|
472
|
+
url: docUrl("/admin/recipe"),
|
|
473
|
+
route: "/admin/recipe",
|
|
474
|
+
markdown: "admin/recipe.md",
|
|
475
|
+
keywords: ["admin", "recipe", "app", "blueprint"],
|
|
476
|
+
headings: ["Refresh and status", "Diagram and list", 'What "not connected" means', "Side panel", "Risk checks", "Related"],
|
|
477
|
+
excerpt: "The App blueprint page shows what this app is built from, the state of each part, and the draft pull request a change opens."
|
|
478
|
+
},
|
|
434
479
|
{
|
|
435
480
|
title: "Releases",
|
|
436
481
|
url: docUrl("/admin/releases"),
|
|
@@ -572,9 +617,18 @@ var MUSHI_DOCS_INDEX = [
|
|
|
572
617
|
route: "/admin/ux-runs",
|
|
573
618
|
markdown: "admin/ux-runs.md",
|
|
574
619
|
keywords: ["admin", "ux-runs", "runs", "ux"],
|
|
575
|
-
headings: ["Run in the cloud", "What you see", "File as bug", "Where the changes are"],
|
|
620
|
+
headings: ["Run in the cloud", "What you see", "File as bug", "Audit signed-in screens", "Where the changes are"],
|
|
576
621
|
excerpt: "Each screen your coding agent worked on in a mushi ux run, with its plan, every attempt, before and after screenshots, and what was kept."
|
|
577
622
|
},
|
|
623
|
+
{
|
|
624
|
+
title: "Verified merge",
|
|
625
|
+
url: docUrl("/admin/verified-merge"),
|
|
626
|
+
route: "/admin/verified-merge",
|
|
627
|
+
markdown: "admin/verified-merge.md",
|
|
628
|
+
keywords: ["admin", "verified-merge", "verified", "merge"],
|
|
629
|
+
headings: ["The gates", "Add the workflow", "What the check does", "The test command", "Run it on your own machine", "Turn on automatic merge", "After the merge", "Check one fix"],
|
|
630
|
+
excerpt: "Mushi merges an agent's fix on its own only with proof \u2014 a test that fails without the fix and passes with it, run in your own CI."
|
|
631
|
+
},
|
|
578
632
|
{
|
|
579
633
|
title: "Voice intake",
|
|
580
634
|
url: docUrl("/admin/voice"),
|
|
@@ -716,7 +770,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
716
770
|
route: "/concepts/agent-pr-review",
|
|
717
771
|
markdown: "concepts/agent-pr-review.md",
|
|
718
772
|
keywords: ["concepts", "agent-pr-review", "agent", "review", "pr"],
|
|
719
|
-
headings: ["What you see", "What the review checks", "Re-running a review", "Cost and keys", "For operators"],
|
|
773
|
+
headings: ["What you see", "What the review checks", "Re-running a review", 'When the review says "fix first"', "Spend-down and its safety stop", "Cost and keys", "For operators"],
|
|
720
774
|
excerpt: 'Claude Opus 5.5 reviews every pull request a cloud coding agent opens as a fix, and a "hold" stops Mushi from merging it until you choose to.'
|
|
721
775
|
},
|
|
722
776
|
{
|
|
@@ -836,6 +890,15 @@ var MUSHI_DOCS_INDEX = [
|
|
|
836
890
|
headings: ["Storage", "Why both pgvector and AGE?", "Indexing", "Bug Ontology"],
|
|
837
891
|
excerpt: "How Mushi links reports, components, fixes and developers in a per-project knowledge graph, with pgvector for similarity and Apache AGE for traversal."
|
|
838
892
|
},
|
|
893
|
+
{
|
|
894
|
+
title: "Known holes in dependencies",
|
|
895
|
+
url: docUrl("/concepts/known-holes"),
|
|
896
|
+
route: "/concepts/known-holes",
|
|
897
|
+
markdown: "concepts/known-holes.md",
|
|
898
|
+
keywords: ["concepts", "known-holes", "known", "holes", "dependencies"],
|
|
899
|
+
headings: ["What Mushi checks", "What becomes a report", "How bad is it", "The fix", "What leaves Mushi", "Where to see it", "Data sources"],
|
|
900
|
+
excerpt: "Mushi checks the exact versions in your lockfiles and runtime pins against published advisories, and files each fixable hole as a bug with the upgrade."
|
|
901
|
+
},
|
|
839
902
|
{
|
|
840
903
|
title: "Multi-repo coordinated fixes",
|
|
841
904
|
url: docUrl("/concepts/multi-repo-fixes"),
|
|
@@ -851,8 +914,8 @@ var MUSHI_DOCS_INDEX = [
|
|
|
851
914
|
route: "/concepts/open-source",
|
|
852
915
|
markdown: "concepts/open-source.md",
|
|
853
916
|
keywords: ["concepts", "open-source", "open", "source", "licensing"],
|
|
854
|
-
headings: ["Open-core, one repo", "Why MIT for the SDK?", "Why AGPLv3 for the server?", "No lock-in", "What's paid and what's free"
|
|
855
|
-
excerpt: "What is open
|
|
917
|
+
headings: ["Open-core, one repo", "Why MIT for the SDK?", "Why AGPLv3 for the server?", "Why AGPLv3 for the console?", "What the hosted service keeps", "Contributing", "No lock-in", "What's paid and what's free"],
|
|
918
|
+
excerpt: "What is open in Mushi: MIT SDKs to embed anywhere, an AGPLv3 server and console to self-host, a small commercial edition, and what the hosted service keeps."
|
|
856
919
|
},
|
|
857
920
|
{
|
|
858
921
|
title: "Connecting your orchestrator (MCP / A2A / REST / AG-UI)",
|
|
@@ -1124,6 +1187,15 @@ var MUSHI_DOCS_INDEX = [
|
|
|
1124
1187
|
headings: ["What lives here", "The four independent deploy paths"],
|
|
1125
1188
|
excerpt: "Runbooks for maintainers running Mushi Cloud or publishing the open-source packages \u2014 deployment, releases and status. Not needed to use the SDK."
|
|
1126
1189
|
},
|
|
1190
|
+
{
|
|
1191
|
+
title: "CI runners",
|
|
1192
|
+
url: docUrl("/operating/ci-runners"),
|
|
1193
|
+
route: "/operating/ci-runners",
|
|
1194
|
+
markdown: "operating/ci-runners.md",
|
|
1195
|
+
keywords: ["operating", "ci-runners", "runners", "ci"],
|
|
1196
|
+
headings: ["Your fix failed, or the test machine stopped", "The CI view", "GitHub permissions", "What CI costs, and where it should run", "Why it costs what it costs", "Your figures", "Advice", "Change where CI runs"],
|
|
1197
|
+
excerpt: "See where your tests run and why a fix waits. Tell a broken fix from a stopped test machine, and add your own machine as a runner safely."
|
|
1198
|
+
},
|
|
1127
1199
|
{
|
|
1128
1200
|
title: "Deployment & releases",
|
|
1129
1201
|
url: docUrl("/operating/deployment"),
|
|
@@ -1301,7 +1373,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
1301
1373
|
route: "/quickstart",
|
|
1302
1374
|
markdown: "quickstart/index.md",
|
|
1303
1375
|
keywords: ["quickstart", "fix", "first", "bug", "60", "seconds", "choose", "stack"],
|
|
1304
|
-
headings: ["Start here (
|
|
1376
|
+
headings: ["What you need", "The fastest way: one command", "Start here (editor first)", "Pick your stack", "How do I install the SDK?", "Troubleshooting"],
|
|
1305
1377
|
excerpt: "Install Mushi with npx mushi-mushi, connect Cursor or Claude Code over MCP, and turn user bug reports into plain-English diagnoses with ready fixes."
|
|
1306
1378
|
},
|
|
1307
1379
|
{
|
|
@@ -1436,7 +1508,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
1436
1508
|
route: "/roadmap",
|
|
1437
1509
|
markdown: "roadmap.md",
|
|
1438
1510
|
keywords: ["roadmap"],
|
|
1439
|
-
headings: ["Live boards", "Release waves", "Wave E details (in-flight)", "Wave D highlights (shipped)", "Completed highlights (Wave C, v0.8.0)"],
|
|
1511
|
+
headings: ["Live boards", "Release waves", "Wave E details (in-flight)", "Agent fixes you can trust (October 2026)", "Wave D highlights (shipped)", "Completed highlights (Wave C, v0.8.0)"],
|
|
1440
1512
|
excerpt: "Where Mushi Mushi is headed \u2014 upcoming SDK platforms, diagnosis speed targets, and console features, updated as work lands."
|
|
1441
1513
|
},
|
|
1442
1514
|
{
|
|
@@ -1517,7 +1589,7 @@ var MUSHI_DOCS_INDEX = [
|
|
|
1517
1589
|
route: "/sdks/cli",
|
|
1518
1590
|
markdown: "sdks/cli.md",
|
|
1519
1591
|
keywords: ["sdks", "cli", "@mushi-mushi/cli"],
|
|
1520
|
-
headings: ["Console \u2194 CLI setup loop", "Setup & health", "mushi doctor", "mushi nudge", "Reports & lessons", "Sentry issues already open", "Reporter updates held for review"
|
|
1592
|
+
headings: ["Console \u2194 CLI setup loop", "Setup & health", "mushi doctor", "mushi nudge", "Reports & lessons", "Sentry issues already open", "File a report yourself", "Reporter updates held for review"],
|
|
1521
1593
|
excerpt: "Reference for @mushi-mushi/cli \u2014 log in, connect a project, run doctor, list reports, dispatch agent fixes and merge their pull requests from the terminal."
|
|
1522
1594
|
},
|
|
1523
1595
|
{
|
|
@@ -2444,6 +2516,7 @@ var GATE_IDS = [
|
|
|
2444
2516
|
"radar",
|
|
2445
2517
|
"portfolio_radar",
|
|
2446
2518
|
"portfolio_radar_ci",
|
|
2519
|
+
"portfolio_radar_vulns",
|
|
2447
2520
|
"store_review"
|
|
2448
2521
|
];
|
|
2449
2522
|
var GATE_FINDING_SEVERITIES = ["info", "warn", "error"];
|
|
@@ -2986,6 +3059,22 @@ function createMushiServer(config) {
|
|
|
2986
3059
|
return jsonText(await apiCall(`/v1/admin/fixes/${args.fixId}/timeline`, { headers }));
|
|
2987
3060
|
}
|
|
2988
3061
|
);
|
|
3062
|
+
server.registerTool(
|
|
3063
|
+
"get_fix_verification",
|
|
3064
|
+
{
|
|
3065
|
+
title: titleOf("get_fix_verification"),
|
|
3066
|
+
description: descOf("get_fix_verification"),
|
|
3067
|
+
annotations: annotationsFor("get_fix_verification"),
|
|
3068
|
+
inputSchema: z.object({
|
|
3069
|
+
fixId: z.string().describe("fix_attempt UUID"),
|
|
3070
|
+
projectId: z.string().optional().describe("Project UUID \u2014 required for org-scoped keys with multiple projects.")
|
|
3071
|
+
})
|
|
3072
|
+
},
|
|
3073
|
+
async (args) => {
|
|
3074
|
+
const { headers } = await projectScopeHeaders(args.projectId);
|
|
3075
|
+
return jsonText(await apiCall(`/v1/admin/fixes/${encodeURIComponent(args.fixId)}/verification`, { headers }));
|
|
3076
|
+
}
|
|
3077
|
+
);
|
|
2989
3078
|
server.registerTool(
|
|
2990
3079
|
"get_blast_radius",
|
|
2991
3080
|
{
|
|
@@ -3450,6 +3539,104 @@ function createMushiServer(config) {
|
|
|
3450
3539
|
return jsonText(await apiCall(`/v1/admin/code-health?${qs}`));
|
|
3451
3540
|
}
|
|
3452
3541
|
);
|
|
3542
|
+
const CI_ADVICE_OUTPUT = z.looseObject({
|
|
3543
|
+
id: z.string(),
|
|
3544
|
+
severity: z.string(),
|
|
3545
|
+
title: z.string(),
|
|
3546
|
+
detail: z.string().nullable().optional(),
|
|
3547
|
+
evidence: z.unknown().optional(),
|
|
3548
|
+
fix: z.string().nullable().optional()
|
|
3549
|
+
});
|
|
3550
|
+
server.registerTool(
|
|
3551
|
+
"get_ci_overview",
|
|
3552
|
+
{
|
|
3553
|
+
title: titleOf("get_ci_overview"),
|
|
3554
|
+
description: descOf("get_ci_overview"),
|
|
3555
|
+
annotations: annotationsFor("get_ci_overview"),
|
|
3556
|
+
inputSchema: z.object({
|
|
3557
|
+
projectId: z.string().optional().describe("Project UUID \u2014 defaults to the server-configured project; omitted with an account-level key, every project you can read"),
|
|
3558
|
+
days: z.number().int().min(1).max(30).optional().describe("Window in days (default 7)"),
|
|
3559
|
+
refresh: z.boolean().optional().describe("Read GitHub first instead of the last 10-minute sync (at most once a minute per project)")
|
|
3560
|
+
}),
|
|
3561
|
+
outputSchema: z.looseObject({
|
|
3562
|
+
generatedAt: z.string().optional(),
|
|
3563
|
+
refreshedAt: z.string().nullable().optional(),
|
|
3564
|
+
window: z.unknown().optional(),
|
|
3565
|
+
permissions: z.unknown().optional(),
|
|
3566
|
+
hosts: z.array(z.looseObject({})).optional().describe("Machines that send a runner heartbeat"),
|
|
3567
|
+
runners: z.array(z.looseObject({})).optional().describe("GitHub runners seen, with status"),
|
|
3568
|
+
repos: z.array(z.looseObject({})).optional(),
|
|
3569
|
+
jobs: z.array(z.looseObject({})).optional().describe("Latest jobs with their infra or code verdict"),
|
|
3570
|
+
stats: z.looseObject({}).nullable().optional(),
|
|
3571
|
+
advice: z.array(CI_ADVICE_OUTPUT).optional().describe("Rule-based advice with evidence, most severe first")
|
|
3572
|
+
})
|
|
3573
|
+
},
|
|
3574
|
+
async (args) => {
|
|
3575
|
+
const pid = args.projectId ? await resolveProjectId(args.projectId) : projectId || void 0;
|
|
3576
|
+
const qs = new URLSearchParams({ days: String(args.days ?? 7) });
|
|
3577
|
+
if (pid) qs.set("project_id", pid);
|
|
3578
|
+
if (args.refresh) qs.set("refresh", "1");
|
|
3579
|
+
return jsonResult(
|
|
3580
|
+
await apiCall(`/v1/admin/ci/overview?${qs}`, void 0, args.refresh ? { minTimeoutMs: 6e4 } : void 0)
|
|
3581
|
+
);
|
|
3582
|
+
}
|
|
3583
|
+
);
|
|
3584
|
+
server.registerTool(
|
|
3585
|
+
"get_ci_costs",
|
|
3586
|
+
{
|
|
3587
|
+
title: titleOf("get_ci_costs"),
|
|
3588
|
+
description: descOf("get_ci_costs"),
|
|
3589
|
+
annotations: annotationsFor("get_ci_costs"),
|
|
3590
|
+
inputSchema: z.object({
|
|
3591
|
+
projectId: z.string().optional().describe("Project UUID \u2014 defaults to the server-configured project; omitted with an account-level key, every project you can read"),
|
|
3592
|
+
days: z.number().int().min(1).max(30).optional().describe("Window in days (default 30)")
|
|
3593
|
+
}),
|
|
3594
|
+
outputSchema: z.looseObject({
|
|
3595
|
+
window: z.unknown().optional(),
|
|
3596
|
+
dataDays: z.number().optional(),
|
|
3597
|
+
lowConfidence: z.boolean().optional().describe("Under 7 days of data"),
|
|
3598
|
+
source: z.string().optional(),
|
|
3599
|
+
sourceNote: z.string().nullable().optional(),
|
|
3600
|
+
rates: z.unknown().optional().describe("GitHub list prices and the date they were read"),
|
|
3601
|
+
fields: z.record(z.string(), z.string()).optional().describe("measured | estimated per field"),
|
|
3602
|
+
settings: z.array(z.looseObject({})).optional(),
|
|
3603
|
+
repos: z.array(z.looseObject({})).optional(),
|
|
3604
|
+
rows: z.array(z.looseObject({})).optional().describe("Per repo \xD7 runner class: wait, run time, pass rate, minutes, cost"),
|
|
3605
|
+
accounts: z.array(z.looseObject({})).optional().describe("Included minutes per GitHub owner"),
|
|
3606
|
+
machines: z.array(z.looseObject({})).optional(),
|
|
3607
|
+
speed: z.array(z.looseObject({})).optional(),
|
|
3608
|
+
whatIfs: z.array(z.looseObject({})).optional(),
|
|
3609
|
+
explain: z.looseObject({}).optional(),
|
|
3610
|
+
advice: z.array(CI_ADVICE_OUTPUT).optional()
|
|
3611
|
+
})
|
|
3612
|
+
},
|
|
3613
|
+
async (args) => {
|
|
3614
|
+
const pid = args.projectId ? await resolveProjectId(args.projectId) : projectId || void 0;
|
|
3615
|
+
const qs = new URLSearchParams({ days: String(args.days ?? 30) });
|
|
3616
|
+
if (pid) qs.set("project_id", pid);
|
|
3617
|
+
return jsonResult(await apiCall(`/v1/admin/ci/compare?${qs}`, void 0, { minTimeoutMs: 6e4 }));
|
|
3618
|
+
}
|
|
3619
|
+
);
|
|
3620
|
+
server.registerTool(
|
|
3621
|
+
"request_ci_placement_change",
|
|
3622
|
+
{
|
|
3623
|
+
title: titleOf("request_ci_placement_change"),
|
|
3624
|
+
description: descOf("request_ci_placement_change"),
|
|
3625
|
+
annotations: annotationsFor("request_ci_placement_change"),
|
|
3626
|
+
inputSchema: z.object({
|
|
3627
|
+
projectId: z.string().optional().describe("Project UUID \u2014 defaults to the server-configured project"),
|
|
3628
|
+
repo: z.string().regex(/^[A-Za-z0-9._-]+\/[A-Za-z0-9._-]+$/).describe("owner/repo, connected to the project"),
|
|
3629
|
+
variable: z.string().regex(/^(?:LINUX_RUNNER|RUNNER_[A-Z0-9_]{1,60})$/).describe("LINUX_RUNNER or RUNNER_<WORKFLOW>"),
|
|
3630
|
+
value: z.string().min(1).max(100).nullable().describe("One runner label, or null to remove the variable"),
|
|
3631
|
+
reason: z.string().max(500).optional().describe("Why, shown to the approver")
|
|
3632
|
+
})
|
|
3633
|
+
},
|
|
3634
|
+
async (args) => {
|
|
3635
|
+
const pid = await resolveProjectId(args.projectId);
|
|
3636
|
+
const body = { projectId: pid, repo: args.repo, variable: args.variable, value: args.value, ...args.reason ? { reason: args.reason } : {} };
|
|
3637
|
+
return jsonText(await apiCall("/v1/admin/ci/placement/requests", { method: "POST", body: JSON.stringify(body) }));
|
|
3638
|
+
}
|
|
3639
|
+
);
|
|
3453
3640
|
server.registerTool(
|
|
3454
3641
|
"explain_finding",
|
|
3455
3642
|
{
|
|
@@ -4736,6 +4923,42 @@ function createMushiServer(config) {
|
|
|
4736
4923
|
return jsonResult(data);
|
|
4737
4924
|
}
|
|
4738
4925
|
);
|
|
4926
|
+
server.registerTool(
|
|
4927
|
+
"file_report",
|
|
4928
|
+
{
|
|
4929
|
+
title: titleOf("file_report"),
|
|
4930
|
+
description: descOf("file_report"),
|
|
4931
|
+
annotations: annotationsFor("file_report"),
|
|
4932
|
+
inputSchema: z.object({
|
|
4933
|
+
title: z.string().min(3).max(200).describe("One-line title (3-200 characters)"),
|
|
4934
|
+
description: z.string().min(1).max(1e4).describe("What happens, steps to reproduce, what you expected, and how to check it is fixed"),
|
|
4935
|
+
severity: z.enum(["critical", "high", "medium", "low"]).optional().describe("Your severity hint; triage may refine it"),
|
|
4936
|
+
component: z.string().max(200).optional().describe('Area of the app, e.g. "checkout"'),
|
|
4937
|
+
projectId: z.string().optional().describe("Project UUID. Defaults to configured project.")
|
|
4938
|
+
}),
|
|
4939
|
+
outputSchema: z.object({
|
|
4940
|
+
reportId: z.string().describe("The new report id; pass it to triage_issue or dispatch_fix"),
|
|
4941
|
+
projectId: z.string(),
|
|
4942
|
+
title: z.string(),
|
|
4943
|
+
status: z.string().describe("Always new: triage starts right away"),
|
|
4944
|
+
severity: z.string().nullable(),
|
|
4945
|
+
component: z.string().nullable()
|
|
4946
|
+
})
|
|
4947
|
+
},
|
|
4948
|
+
async (args) => {
|
|
4949
|
+
const pid = await resolveProjectId(args.projectId);
|
|
4950
|
+
const data = await apiCall(`/v1/admin/projects/${pid}/reports`, {
|
|
4951
|
+
method: "POST",
|
|
4952
|
+
body: JSON.stringify({
|
|
4953
|
+
title: args.title,
|
|
4954
|
+
description: args.description,
|
|
4955
|
+
severity: args.severity,
|
|
4956
|
+
component: args.component
|
|
4957
|
+
})
|
|
4958
|
+
});
|
|
4959
|
+
return jsonResult(data);
|
|
4960
|
+
}
|
|
4961
|
+
);
|
|
4739
4962
|
server.registerTool(
|
|
4740
4963
|
"transition_status",
|
|
4741
4964
|
{
|
|
@@ -4770,7 +4993,8 @@ function createMushiServer(config) {
|
|
|
4770
4993
|
method: "PATCH",
|
|
4771
4994
|
body: JSON.stringify({
|
|
4772
4995
|
status: args.status,
|
|
4773
|
-
|
|
4996
|
+
// Kept as a team note on the report (the console's Triage note).
|
|
4997
|
+
note: args.reason,
|
|
4774
4998
|
closed_reason: args.closedReason,
|
|
4775
4999
|
reporter_message: args.reporterMessage
|
|
4776
5000
|
})
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mushi-mushi/mcp",
|
|
3
3
|
"mcpName": "io.github.kensaurus/mushi-mushi",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.29.1",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"description": "MCP server for Cursor, Claude Code and Copilot. The bug mediator for AI-built apps: plain-English diagnosis + a ready fix, in your editor.",
|
|
7
7
|
"type": "module",
|
|
@@ -44,8 +44,8 @@
|
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@modelcontextprotocol/core": "^2.3.1",
|
|
46
46
|
"@modelcontextprotocol/server": "^2.3.1",
|
|
47
|
-
"zod": "^4.
|
|
48
|
-
"@mushi-mushi/core": "^1.33.
|
|
47
|
+
"zod": "^4.6.7",
|
|
48
|
+
"@mushi-mushi/core": "^1.33.2"
|
|
49
49
|
},
|
|
50
50
|
"peerDependencies": {
|
|
51
51
|
"@sentry/node": "^10.57.0"
|