@mushi-mushi/mcp 0.24.0 → 0.24.2

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
@@ -494,4 +494,4 @@ MIT
494
494
  <!-- mushi-readme-stats-footer -->
495
495
  ---
496
496
 
497
- <sub>Monorepo scale (July 2026): 64 edge functions · 410 SQL migrations · 13 outbound plugins · 11 inbound adapters · 19 pipeline agents. Canonical counts: <a href="https://github.com/kensaurus/mushi-mushi/blob/master/docs/stats.md">docs/stats.md</a> · <code>pnpm docs-stats</code></sub>
497
+ <sub>Monorepo scale (July 2026): 64 edge functions · 413 SQL migrations · 13 outbound plugins · 11 inbound adapters · 19 pipeline agents. Canonical counts: <a href="https://github.com/kensaurus/mushi-mushi/blob/master/docs/stats.md">docs/stats.md</a> · <code>pnpm docs-stats</code></sub>
package/dist/catalog.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  TOOL_CATALOG,
9
9
  USE_MUSHI_INTENTS,
10
10
  routeUseMushiIntent
11
- } from "./chunk-2NW2VVWV.js";
11
+ } from "./chunk-Y757GGQH.js";
12
12
  export {
13
13
  ALL_SCOPES,
14
14
  CODEBASE_TOOL_CATALOG,
@@ -491,7 +491,7 @@ var TOOL_CATALOG = [
491
491
  {
492
492
  name: "dispatch_fix",
493
493
  title: "Dispatch Mushi fix agent",
494
- description: 'Start a Mushi fix agent for a classified report; it writes a branch and opens a signed draft PR. Set agent="cursor_cloud" to dispatch a Cursor Cloud Agent (default uses the in-repo worker). Requires GitHub connected + an LLM key (run diagnose_setup mode=dispatch first). Returns { fixId, status } (fixId is the dispatch id; get_fix_timeline accepts it immediately); poll get_fix_timeline for progress and merge_fix when CI is green. Write; pass the same idempotencyKey to retry safely \u2014 without it each call starts a new attempt. Report must be classified \u2014 run triage_issue if not.',
494
+ description: 'Start a Mushi fix agent for a classified report; it writes a branch and opens a signed draft PR. Set agent="cursor_cloud" to dispatch a Cursor Cloud Agent (default uses the in-repo worker). For a project with several linked repos, set targetRepoId (a project_repos.id) to choose the repo the PR opens against; omit it for the primary repo. Requires GitHub connected + an LLM key (run diagnose_setup mode=dispatch first). Returns { fixId, status } (fixId is the dispatch id; get_fix_timeline accepts it immediately); poll get_fix_timeline for progress and merge_fix when CI is green. Write; pass the same idempotencyKey to retry safely \u2014 without it each call starts a new attempt. Report must be classified \u2014 run triage_issue if not.',
495
495
  scope: "mcp:write",
496
496
  hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
497
497
  useCase: "Let the in-repo agent attempt this fix for me (or: dispatch a Cursor Cloud Agent)."
@@ -820,7 +820,7 @@ var TDD_TOOL_CATALOG = [
820
820
  {
821
821
  name: "list_byok_keys",
822
822
  title: "List your API key pool",
823
- description: "List the project's BYOK API keys grouped by provider (anthropic | openai | firecrawl | browserbase | cursor). Returns pooled { keys: [{ id, provider_slug, label, priority, status, cooldown_until, test_status, key_hint, base_url, last_tested_at, last_used_at }] } plus 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, or rate-limited; use add_byok_key to add one.",
823
+ description: "List the project's BYOK API keys grouped by provider (anthropic | openai | 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 }] } plus 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, or rate-limited; use add_byok_key to add one.",
824
824
  scope: "mcp:read",
825
825
  hints: { readOnly: true, idempotent: true, openWorld: true },
826
826
  useCase: "Which API keys are active and which are rate-limited?"
@@ -828,7 +828,7 @@ var TDD_TOOL_CATALOG = [
828
828
  {
829
829
  name: "add_byok_key",
830
830
  title: "Add an API key",
831
- description: "Add and immediately validate a BYOK API key for anthropic | openai | firecrawl | browserbase | cursor. 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.",
831
+ description: "Add and immediately validate a BYOK API key for anthropic | openai | 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.",
832
832
  scope: "mcp:write",
833
833
  hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
834
834
  useCase: "Add a backup Anthropic key to the pool."
@@ -984,7 +984,7 @@ var TDD_TOOL_CATALOG = [
984
984
  {
985
985
  name: "run_fullstack_audit",
986
986
  title: "Run a full-stack health audit",
987
- description: "Fan out a full-stack health audit for the current project: DB schema + advisors, API contract gate results (Gates 3\u20138), recent backend error logs, and RLS gap detection. Returns a PM-readable scorecard with severity-ranked findings and fix hints. Requires the project to have a Supabase PAT configured (Settings \u2192 API Keys, slug: supabase) and supabase_project_ref set in project settings for backend analysis. The audit completes synchronously in ~10 s. Triggers a background gate run for orphan_endpoint and unknown_call gates if they have not run today.",
987
+ description: "Fan out a full-stack health audit for the current project: DB schema + advisors, API contract gate results (Gates 3\u20138), recent backend error logs, and RLS gap detection. Returns a PM-readable scorecard with severity-ranked findings and fix hints. Backend analysis needs supabase_project_ref set (Settings \u2192 General) and a scoped, read-only Supabase access token added (Settings \u2192 AI keys, slug: supabase). The audit completes synchronously in ~10 s. Triggers a background gate run for orphan_endpoint and unknown_call gates if they have not run today.",
988
988
  scope: "mcp:write",
989
989
  hints: { readOnly: false, destructive: false, idempotent: true, openWorld: true },
990
990
  useCase: "Is this project healthy? Run a one-click full-stack audit to find API contract mismatches, unlinked backend features, schema drift, and security gaps."
package/dist/clients.d.ts CHANGED
@@ -46,7 +46,7 @@ import { FeatureGroup } from './feature-groups.js';
46
46
  * editor launch. Synced to package.json by `scripts/sync-mcp-pin.mjs` — never
47
47
  * hand-edit the version.
48
48
  */
49
- declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.24.0";
49
+ declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.24.2";
50
50
  interface StdioConfig {
51
51
  command: string;
52
52
  args: string[];
package/dist/clients.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-F65T4IGT.js";
9
9
 
10
10
  // src/clients.ts
11
- var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.24.0";
11
+ var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.24.2";
12
12
  function projectServerName(projectId, projectName) {
13
13
  const nameSlug = projectName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 22);
14
14
  const idSuffix = projectId.replace(/-/g, "").slice(0, 6);
package/dist/index.js CHANGED
@@ -567,7 +567,7 @@ var TOOL_CATALOG = [
567
567
  {
568
568
  name: "dispatch_fix",
569
569
  title: "Dispatch Mushi fix agent",
570
- description: 'Start a Mushi fix agent for a classified report; it writes a branch and opens a signed draft PR. Set agent="cursor_cloud" to dispatch a Cursor Cloud Agent (default uses the in-repo worker). Requires GitHub connected + an LLM key (run diagnose_setup mode=dispatch first). Returns { fixId, status } (fixId is the dispatch id; get_fix_timeline accepts it immediately); poll get_fix_timeline for progress and merge_fix when CI is green. Write; pass the same idempotencyKey to retry safely \u2014 without it each call starts a new attempt. Report must be classified \u2014 run triage_issue if not.',
570
+ description: 'Start a Mushi fix agent for a classified report; it writes a branch and opens a signed draft PR. Set agent="cursor_cloud" to dispatch a Cursor Cloud Agent (default uses the in-repo worker). For a project with several linked repos, set targetRepoId (a project_repos.id) to choose the repo the PR opens against; omit it for the primary repo. Requires GitHub connected + an LLM key (run diagnose_setup mode=dispatch first). Returns { fixId, status } (fixId is the dispatch id; get_fix_timeline accepts it immediately); poll get_fix_timeline for progress and merge_fix when CI is green. Write; pass the same idempotencyKey to retry safely \u2014 without it each call starts a new attempt. Report must be classified \u2014 run triage_issue if not.',
571
571
  scope: "mcp:write",
572
572
  hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
573
573
  useCase: "Let the in-repo agent attempt this fix for me (or: dispatch a Cursor Cloud Agent)."
@@ -812,7 +812,7 @@ var TDD_TOOL_CATALOG = [
812
812
  {
813
813
  name: "list_byok_keys",
814
814
  title: "List your API key pool",
815
- description: "List the project's BYOK API keys grouped by provider (anthropic | openai | firecrawl | browserbase | cursor). Returns pooled { keys: [{ id, provider_slug, label, priority, status, cooldown_until, test_status, key_hint, base_url, last_tested_at, last_used_at }] } plus 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, or rate-limited; use add_byok_key to add one.",
815
+ description: "List the project's BYOK API keys grouped by provider (anthropic | openai | 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 }] } plus 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, or rate-limited; use add_byok_key to add one.",
816
816
  scope: "mcp:read",
817
817
  hints: { readOnly: true, idempotent: true, openWorld: true },
818
818
  useCase: "Which API keys are active and which are rate-limited?"
@@ -820,7 +820,7 @@ var TDD_TOOL_CATALOG = [
820
820
  {
821
821
  name: "add_byok_key",
822
822
  title: "Add an API key",
823
- description: "Add and immediately validate a BYOK API key for anthropic | openai | firecrawl | browserbase | cursor. 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.",
823
+ description: "Add and immediately validate a BYOK API key for anthropic | openai | 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.",
824
824
  scope: "mcp:write",
825
825
  hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
826
826
  useCase: "Add a backup Anthropic key to the pool."
@@ -976,7 +976,7 @@ var TDD_TOOL_CATALOG = [
976
976
  {
977
977
  name: "run_fullstack_audit",
978
978
  title: "Run a full-stack health audit",
979
- description: "Fan out a full-stack health audit for the current project: DB schema + advisors, API contract gate results (Gates 3\u20138), recent backend error logs, and RLS gap detection. Returns a PM-readable scorecard with severity-ranked findings and fix hints. Requires the project to have a Supabase PAT configured (Settings \u2192 API Keys, slug: supabase) and supabase_project_ref set in project settings for backend analysis. The audit completes synchronously in ~10 s. Triggers a background gate run for orphan_endpoint and unknown_call gates if they have not run today.",
979
+ description: "Fan out a full-stack health audit for the current project: DB schema + advisors, API contract gate results (Gates 3\u20138), recent backend error logs, and RLS gap detection. Returns a PM-readable scorecard with severity-ranked findings and fix hints. Backend analysis needs supabase_project_ref set (Settings \u2192 General) and a scoped, read-only Supabase access token added (Settings \u2192 AI keys, slug: supabase). The audit completes synchronously in ~10 s. Triggers a background gate run for orphan_endpoint and unknown_call gates if they have not run today.",
980
980
  scope: "mcp:write",
981
981
  hints: { readOnly: false, destructive: false, idempotent: true, openWorld: true },
982
982
  useCase: "Is this project healthy? Run a one-click full-stack audit to find API contract mismatches, unlinked backend features, schema drift, and security gaps."
@@ -1875,6 +1875,15 @@ var MUSHI_DOCS_INDEX = [
1875
1875
  headings: ["What it shows", "Out-of-date detection", "Setup checklist integration", "Where it lives", "Related"],
1876
1876
  excerpt: "The SDK health card shows the live heartbeat of every Mushi SDK that reported in the last 24 hours, so an SDK that never shipped is obvious."
1877
1877
  },
1878
+ {
1879
+ title: "SDK upgrade lockfile helper",
1880
+ url: docUrl("/admin/sdk-upgrade-lockfile"),
1881
+ route: "/admin/sdk-upgrade-lockfile",
1882
+ markdown: "admin/sdk-upgrade-lockfile.md",
1883
+ keywords: ["admin", "sdk-upgrade-lockfile", "sdk", "upgrade", "lockfile", "helper"],
1884
+ headings: ["How it works", "Add the workflow", "What the action does", "Private registries", "Pinning", "Why Mushi does not write the lockfile or the workflow", "Limits"],
1885
+ excerpt: "Add one workflow to your repo so Mushi's SDK upgrade PRs arrive with a refreshed lockfile and pass npm ci or pnpm install --frozen-lockfile."
1886
+ },
1878
1887
  {
1879
1888
  title: "Settings",
1880
1889
  url: docUrl("/admin/settings"),
@@ -5797,6 +5806,9 @@ function createMushiServer(config) {
5797
5806
  ),
5798
5807
  inventoryActionNodeId: z.string().uuid().optional().describe(
5799
5808
  "Optional inventory Action node UUID for spec-traceability (\xA72.10). When provided, the fix-worker embeds the expected_outcome contract in the LLM prompt and runs validateAgainstSpec before opening the PR."
5809
+ ),
5810
+ targetRepoId: z.string().uuid().optional().describe(
5811
+ "Optional linked repo id (project_repos.id) to open the fix PR against, for a project with several repos. Omit for the project's primary repo. Another project's repo id is rejected with 400 TARGET_REPO_NOT_IN_PROJECT."
5800
5812
  )
5801
5813
  }),
5802
5814
  outputSchema: z.object({
@@ -5827,6 +5839,7 @@ function createMushiServer(config) {
5827
5839
  reportId: args.reportId,
5828
5840
  agent: args.agent,
5829
5841
  inventoryActionNodeId: args.inventoryActionNodeId,
5842
+ ...args.targetRepoId ? { targetRepoId: args.targetRepoId } : {},
5830
5843
  ...pid ? { projectId: pid } : {}
5831
5844
  })
5832
5845
  });
@@ -6680,7 +6693,7 @@ Be specific. No generic advice.`
6680
6693
  annotations: annotationsFor("add_byok_key", TDD_TOOL_CATALOG),
6681
6694
  inputSchema: z.object({
6682
6695
  projectId: z.string().describe("Project id"),
6683
- provider: z.enum(["anthropic", "openai", "firecrawl", "browserbase", "cursor"]).describe("Provider slug"),
6696
+ provider: z.enum(["anthropic", "openai", "firecrawl", "browserbase", "cursor", "supabase"]).describe("Provider slug"),
6684
6697
  key: z.string().min(8).max(4096).describe("The API key value to add"),
6685
6698
  label: z.string().optional().describe("Human-readable label for this key"),
6686
6699
  priority: z.number().int().min(0).max(1e4).optional().describe("Priority for ordering (lower = higher priority)"),
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-2NW2VVWV.js";
7
+ } from "./chunk-Y757GGQH.js";
8
8
  import {
9
9
  MUSHI_SERVER_METADATA
10
10
  } from "./chunk-FJRPC4VR.js";
@@ -485,6 +485,15 @@ var MUSHI_DOCS_INDEX = [
485
485
  headings: ["What it shows", "Out-of-date detection", "Setup checklist integration", "Where it lives", "Related"],
486
486
  excerpt: "The SDK health card shows the live heartbeat of every Mushi SDK that reported in the last 24 hours, so an SDK that never shipped is obvious."
487
487
  },
488
+ {
489
+ title: "SDK upgrade lockfile helper",
490
+ url: docUrl("/admin/sdk-upgrade-lockfile"),
491
+ route: "/admin/sdk-upgrade-lockfile",
492
+ markdown: "admin/sdk-upgrade-lockfile.md",
493
+ keywords: ["admin", "sdk-upgrade-lockfile", "sdk", "upgrade", "lockfile", "helper"],
494
+ headings: ["How it works", "Add the workflow", "What the action does", "Private registries", "Pinning", "Why Mushi does not write the lockfile or the workflow", "Limits"],
495
+ excerpt: "Add one workflow to your repo so Mushi's SDK upgrade PRs arrive with a refreshed lockfile and pass npm ci or pnpm install --frozen-lockfile."
496
+ },
488
497
  {
489
498
  title: "Settings",
490
499
  url: docUrl("/admin/settings"),
@@ -4473,6 +4482,9 @@ function createMushiServer(config) {
4473
4482
  ),
4474
4483
  inventoryActionNodeId: z.string().uuid().optional().describe(
4475
4484
  "Optional inventory Action node UUID for spec-traceability (\xA72.10). When provided, the fix-worker embeds the expected_outcome contract in the LLM prompt and runs validateAgainstSpec before opening the PR."
4485
+ ),
4486
+ targetRepoId: z.string().uuid().optional().describe(
4487
+ "Optional linked repo id (project_repos.id) to open the fix PR against, for a project with several repos. Omit for the project's primary repo. Another project's repo id is rejected with 400 TARGET_REPO_NOT_IN_PROJECT."
4476
4488
  )
4477
4489
  }),
4478
4490
  outputSchema: z.object({
@@ -4503,6 +4515,7 @@ function createMushiServer(config) {
4503
4515
  reportId: args.reportId,
4504
4516
  agent: args.agent,
4505
4517
  inventoryActionNodeId: args.inventoryActionNodeId,
4518
+ ...args.targetRepoId ? { targetRepoId: args.targetRepoId } : {},
4506
4519
  ...pid ? { projectId: pid } : {}
4507
4520
  })
4508
4521
  });
@@ -5356,7 +5369,7 @@ Be specific. No generic advice.`
5356
5369
  annotations: annotationsFor("add_byok_key", TDD_TOOL_CATALOG),
5357
5370
  inputSchema: z.object({
5358
5371
  projectId: z.string().describe("Project id"),
5359
- provider: z.enum(["anthropic", "openai", "firecrawl", "browserbase", "cursor"]).describe("Provider slug"),
5372
+ provider: z.enum(["anthropic", "openai", "firecrawl", "browserbase", "cursor", "supabase"]).describe("Provider slug"),
5360
5373
  key: z.string().min(8).max(4096).describe("The API key value to add"),
5361
5374
  label: z.string().optional().describe("Human-readable label for this key"),
5362
5375
  priority: z.number().int().min(0).max(1e4).optional().describe("Priority for ordering (lower = higher priority)"),
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.24.0",
4
+ "version": "0.24.2",
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",