@mushi-mushi/mcp 0.24.1 → 0.24.3

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 · 422 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-IC7PPRRZ.js";
11
+ } from "./chunk-3IVSUYFV.js";
12
12
  export {
13
13
  ALL_SCOPES,
14
14
  CODEBASE_TOOL_CATALOG,
@@ -507,7 +507,7 @@ var TOOL_CATALOG = [
507
507
  {
508
508
  name: "test_gen_from_report",
509
509
  title: "Generate Playwright test from report",
510
- description: "Generate a Playwright regression test from a classified report using your project LLM key, then open a draft GitHub PR with the spec. Requires the inventory_v2 plan plus GitHub and LLM keys configured. Returns { qaStoryId, prUrl }. Write; consumes LLM budget; NOT idempotent \u2014 each call opens a new PR. Use to lock in a regression as an E2E test; use generate_tdd_from_story to build a test from a mapped user story instead.",
510
+ description: "Generate a Playwright regression test from a classified report using your project LLM key, then open a draft GitHub PR with the spec. Requires the inventory_v2 plan plus GitHub and LLM keys configured. Returns { prUrl, prNumber, branch, path }. Write; consumes LLM budget; NOT idempotent \u2014 each call opens a new PR. Use to lock in a regression as an E2E test; use generate_tdd_from_story to build a test from a mapped user story instead.",
511
511
  scope: "mcp:write",
512
512
  hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
513
513
  useCase: "Turn this regression report into an E2E test PR."
@@ -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.1";
49
+ declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.24.3";
50
50
  interface StdioConfig {
51
51
  command: string;
52
52
  args: string[];
@@ -84,6 +84,13 @@ interface McpBuildInput {
84
84
  * of an `mcp:read` key for defence in depth. No-op for stdio configs.
85
85
  */
86
86
  readOnly?: boolean;
87
+ /**
88
+ * The `@mushi-mushi/mcp@x.y.z` spec to write into stdio configs. The console
89
+ * passes the published version from the sdk_versions catalog, so a release
90
+ * reaches its install buttons without a console redeploy. Anything that is
91
+ * not an exact `@mushi-mushi/mcp@<semver>` falls back to MCP_PIN_SPEC.
92
+ */
93
+ pinSpec?: string;
87
94
  }
88
95
  type McpBuildResult = {
89
96
  kind: 'deeplink';
@@ -113,7 +120,7 @@ interface McpClientDef {
113
120
  }
114
121
  /** Build a stable, unique, human-readable MCP server slug for a project. */
115
122
  declare function projectServerName(projectId: string, projectName: string): string;
116
- declare function buildStdioConfigObj(projectId: string | undefined, apiKey: string, apiEndpoint: string, features?: readonly string[]): StdioConfig;
123
+ declare function buildStdioConfigObj(projectId: string | undefined, apiKey: string, apiEndpoint: string, features?: readonly string[], pinSpec?: string): StdioConfig;
117
124
  declare function buildHttpConfigObj(projectId: string | undefined, apiKey: string, mcpHttpUrl: string, features?: readonly string[], readOnly?: boolean): HttpConfig;
118
125
  declare const MCP_CLIENTS: McpClientDef[];
119
126
  /** Look up a client by id — throws if not found. */
package/dist/clients.js CHANGED
@@ -8,13 +8,17 @@ import {
8
8
  } from "./chunk-F65T4IGT.js";
9
9
 
10
10
  // src/clients.ts
11
- var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.24.1";
11
+ var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.24.3";
12
+ var PIN_SPEC_RE = /^@mushi-mushi\/mcp@\d+\.\d+\.\d+$/;
13
+ function pinOf(pinSpec) {
14
+ return pinSpec && PIN_SPEC_RE.test(pinSpec) ? pinSpec : MCP_PIN_SPEC;
15
+ }
12
16
  function projectServerName(projectId, projectName) {
13
17
  const nameSlug = projectName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 22);
14
18
  const idSuffix = projectId.replace(/-/g, "").slice(0, 6);
15
19
  return `mushi-${nameSlug}-${idSuffix}`;
16
20
  }
17
- function buildStdioConfigObj(projectId, apiKey, apiEndpoint, features = DEFAULT_FEATURE_GROUPS) {
21
+ function buildStdioConfigObj(projectId, apiKey, apiEndpoint, features = DEFAULT_FEATURE_GROUPS, pinSpec) {
18
22
  const env = {
19
23
  MUSHI_API_ENDPOINT: apiEndpoint,
20
24
  MUSHI_API_KEY: apiKey,
@@ -23,7 +27,7 @@ function buildStdioConfigObj(projectId, apiKey, apiEndpoint, features = DEFAULT_
23
27
  if (projectId) env.MUSHI_PROJECT_ID = projectId;
24
28
  return {
25
29
  command: "npx",
26
- args: ["-y", MCP_PIN_SPEC],
30
+ args: ["-y", pinOf(pinSpec)],
27
31
  env,
28
32
  icon: MUSHI_ICON_PNG_URL
29
33
  };
@@ -67,9 +71,9 @@ var MCP_CLIENTS = [
67
71
  method: "deeplink",
68
72
  transport: "stdio",
69
73
  cliIde: "cursor",
70
- build({ projectId, projectName, apiKey, endpoint, features }) {
74
+ build({ projectId, projectName, apiKey, endpoint, features, pinSpec }) {
71
75
  const name = projectId ? projectServerName(projectId, projectName) : `mushi-${projectName.toLowerCase().replace(/[^a-z0-9]+/g, "-").slice(0, 24)}`;
72
- const config = buildStdioConfigObj(projectId, apiKey, endpoint, features);
76
+ const config = buildStdioConfigObj(projectId, apiKey, endpoint, features, pinSpec);
73
77
  return { kind: "deeplink", url: encodeCursorDeeplink(name, config) };
74
78
  }
75
79
  },
@@ -80,9 +84,9 @@ var MCP_CLIENTS = [
80
84
  description: "One-click install via VS Code MCP extension",
81
85
  method: "deeplink",
82
86
  transport: "stdio",
83
- build({ projectId, projectName, apiKey, endpoint, features }) {
87
+ build({ projectId, projectName, apiKey, endpoint, features, pinSpec }) {
84
88
  const name = projectId ? projectServerName(projectId, projectName) : `mushi-${projectName.toLowerCase().replace(/[^a-z0-9]+/g, "-").slice(0, 24)}`;
85
- const config = buildStdioConfigObj(projectId, apiKey, endpoint, features);
89
+ const config = buildStdioConfigObj(projectId, apiKey, endpoint, features, pinSpec);
86
90
  return { kind: "deeplink", url: encodeVsCodeDeeplink("vscode", name, config) };
87
91
  }
88
92
  },
@@ -93,9 +97,9 @@ var MCP_CLIENTS = [
93
97
  description: "One-click install via VS Code Insiders MCP extension",
94
98
  method: "deeplink",
95
99
  transport: "stdio",
96
- build({ projectId, projectName, apiKey, endpoint, features }) {
100
+ build({ projectId, projectName, apiKey, endpoint, features, pinSpec }) {
97
101
  const name = projectId ? projectServerName(projectId, projectName) : `mushi-${projectName.toLowerCase().replace(/[^a-z0-9]+/g, "-").slice(0, 24)}`;
98
- const config = buildStdioConfigObj(projectId, apiKey, endpoint, features);
102
+ const config = buildStdioConfigObj(projectId, apiKey, endpoint, features, pinSpec);
99
103
  return { kind: "deeplink", url: encodeVsCodeDeeplink("vscode-insiders", name, config) };
100
104
  }
101
105
  },
@@ -137,7 +141,7 @@ var MCP_CLIENTS = [
137
141
  description: "Copy config into cline_mcp_settings.json",
138
142
  method: "config-json",
139
143
  transport: "stdio",
140
- build({ projectId, projectName, apiKey, endpoint, features }) {
144
+ build({ projectId, projectName, apiKey, endpoint, features, pinSpec }) {
141
145
  const name = projectId ? projectServerName(projectId, projectName) : `mushi-${projectName.toLowerCase().replace(/[^a-z0-9]+/g, "-").slice(0, 24)}`;
142
146
  const env = {
143
147
  MUSHI_API_ENDPOINT: endpoint,
@@ -147,7 +151,7 @@ var MCP_CLIENTS = [
147
151
  if (projectId) env.MUSHI_PROJECT_ID = projectId;
148
152
  const clineConfig = {
149
153
  mcpServers: {
150
- [name]: { command: "npx", args: ["-y", MCP_PIN_SPEC], env }
154
+ [name]: { command: "npx", args: ["-y", pinOf(pinSpec)], env }
151
155
  }
152
156
  };
153
157
  return {
@@ -183,7 +187,7 @@ var MCP_CLIENTS = [
183
187
  description: "Copy config into claude_desktop_config.json",
184
188
  method: "config-json",
185
189
  transport: "stdio",
186
- build({ projectId, projectName, apiKey, endpoint, features }) {
190
+ build({ projectId, projectName, apiKey, endpoint, features, pinSpec }) {
187
191
  const name = projectId ? projectServerName(projectId, projectName) : `mushi-${projectName.toLowerCase().replace(/[^a-z0-9]+/g, "-").slice(0, 24)}`;
188
192
  const env = {
189
193
  MUSHI_API_ENDPOINT: endpoint,
@@ -193,7 +197,7 @@ var MCP_CLIENTS = [
193
197
  if (projectId) env.MUSHI_PROJECT_ID = projectId;
194
198
  const desktopConfig = {
195
199
  mcpServers: {
196
- [name]: { command: "npx", args: ["-y", MCP_PIN_SPEC], env }
200
+ [name]: { command: "npx", args: ["-y", pinOf(pinSpec)], env }
197
201
  }
198
202
  };
199
203
  return {
@@ -211,7 +215,7 @@ var MCP_CLIENTS = [
211
215
  method: "config-json",
212
216
  transport: "stdio",
213
217
  cliIde: "zed",
214
- build({ projectId, projectName, apiKey, endpoint, features }) {
218
+ build({ projectId, projectName, apiKey, endpoint, features, pinSpec }) {
215
219
  const name = projectId ? projectServerName(projectId, projectName) : `mushi-${projectName.toLowerCase().replace(/[^a-z0-9]+/g, "-").slice(0, 24)}`;
216
220
  const env = {
217
221
  MUSHI_API_ENDPOINT: endpoint,
@@ -224,7 +228,7 @@ var MCP_CLIENTS = [
224
228
  [name]: {
225
229
  command: {
226
230
  path: "npx",
227
- args: ["-y", MCP_PIN_SPEC],
231
+ args: ["-y", pinOf(pinSpec)],
228
232
  env
229
233
  },
230
234
  settings: {}
package/dist/index.js CHANGED
@@ -583,7 +583,7 @@ var TOOL_CATALOG = [
583
583
  {
584
584
  name: "test_gen_from_report",
585
585
  title: "Generate Playwright test from report",
586
- description: "Generate a Playwright regression test from a classified report using your project LLM key, then open a draft GitHub PR with the spec. Requires the inventory_v2 plan plus GitHub and LLM keys configured. Returns { qaStoryId, prUrl }. Write; consumes LLM budget; NOT idempotent \u2014 each call opens a new PR. Use to lock in a regression as an E2E test; use generate_tdd_from_story to build a test from a mapped user story instead.",
586
+ description: "Generate a Playwright regression test from a classified report using your project LLM key, then open a draft GitHub PR with the spec. Requires the inventory_v2 plan plus GitHub and LLM keys configured. Returns { prUrl, prNumber, branch, path }. Write; consumes LLM budget; NOT idempotent \u2014 each call opens a new PR. Use to lock in a regression as an E2E test; use generate_tdd_from_story to build a test from a mapped user story instead.",
587
587
  scope: "mcp:write",
588
588
  hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
589
589
  useCase: "Turn this regression report into an E2E test PR."
@@ -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"),
@@ -2709,7 +2718,7 @@ var MUSHI_DOCS_INDEX = [
2709
2718
  route: "/quickstart/incident-loop",
2710
2719
  markdown: "quickstart/incident-loop.md",
2711
2720
  keywords: ["quickstart", "incident-loop", "incident", "loop", "bug", "fix", "prompt"],
2712
- headings: ["Prerequisites", "Step 1 \u2014 Capture or pick a report", "Step 2 \u2014 Pull fix context", "Step 3 \u2014 Generate the fix prompt", "Step 4 \u2014 Paste and ship", "Troubleshooting", "See also"],
2721
+ headings: ["No MCP? Copy the fix prompt", "Prerequisites", "Step 1 \u2014 Capture or pick a report", "Step 2 \u2014 Pull fix context", "Step 3 \u2014 Generate the fix prompt", "Step 4 \u2014 Paste and ship", "Troubleshooting", "See also"],
2713
2722
  excerpt: "Run npx mushi-mushi, ship, and turn your first user-reported bug into a plain-English diagnosis and a paste-ready fix for Cursor or Claude Code."
2714
2723
  },
2715
2724
  {
@@ -6629,7 +6638,7 @@ Be specific. No generic advice.`
6629
6638
  description: descOf("improve_qa_story", TDD_TOOL_CATALOG),
6630
6639
  annotations: annotationsFor("improve_qa_story", TDD_TOOL_CATALOG),
6631
6640
  inputSchema: z.object({
6632
- projectId: z.string().optional().describe("Project id (omit to run across all projects)")
6641
+ projectId: z.string().optional().describe("Project id (defaults to the configured project; one project per call)")
6633
6642
  })
6634
6643
  },
6635
6644
  async ({ projectId: projectId2 }) => {
@@ -6684,7 +6693,7 @@ Be specific. No generic advice.`
6684
6693
  annotations: annotationsFor("add_byok_key", TDD_TOOL_CATALOG),
6685
6694
  inputSchema: z.object({
6686
6695
  projectId: z.string().describe("Project id"),
6687
- provider: z.enum(["anthropic", "openai", "firecrawl", "browserbase", "cursor"]).describe("Provider slug"),
6696
+ provider: z.enum(["anthropic", "openai", "firecrawl", "browserbase", "cursor", "supabase"]).describe("Provider slug"),
6688
6697
  key: z.string().min(8).max(4096).describe("The API key value to add"),
6689
6698
  label: z.string().optional().describe("Human-readable label for this key"),
6690
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-IC7PPRRZ.js";
7
+ } from "./chunk-3IVSUYFV.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"),
@@ -1319,7 +1328,7 @@ var MUSHI_DOCS_INDEX = [
1319
1328
  route: "/quickstart/incident-loop",
1320
1329
  markdown: "quickstart/incident-loop.md",
1321
1330
  keywords: ["quickstart", "incident-loop", "incident", "loop", "bug", "fix", "prompt"],
1322
- headings: ["Prerequisites", "Step 1 \u2014 Capture or pick a report", "Step 2 \u2014 Pull fix context", "Step 3 \u2014 Generate the fix prompt", "Step 4 \u2014 Paste and ship", "Troubleshooting", "See also"],
1331
+ headings: ["No MCP? Copy the fix prompt", "Prerequisites", "Step 1 \u2014 Capture or pick a report", "Step 2 \u2014 Pull fix context", "Step 3 \u2014 Generate the fix prompt", "Step 4 \u2014 Paste and ship", "Troubleshooting", "See also"],
1323
1332
  excerpt: "Run npx mushi-mushi, ship, and turn your first user-reported bug into a plain-English diagnosis and a paste-ready fix for Cursor or Claude Code."
1324
1333
  },
1325
1334
  {
@@ -5305,7 +5314,7 @@ Be specific. No generic advice.`
5305
5314
  description: descOf("improve_qa_story", TDD_TOOL_CATALOG),
5306
5315
  annotations: annotationsFor("improve_qa_story", TDD_TOOL_CATALOG),
5307
5316
  inputSchema: z.object({
5308
- projectId: z.string().optional().describe("Project id (omit to run across all projects)")
5317
+ projectId: z.string().optional().describe("Project id (defaults to the configured project; one project per call)")
5309
5318
  })
5310
5319
  },
5311
5320
  async ({ projectId: projectId2 }) => {
@@ -5360,7 +5369,7 @@ Be specific. No generic advice.`
5360
5369
  annotations: annotationsFor("add_byok_key", TDD_TOOL_CATALOG),
5361
5370
  inputSchema: z.object({
5362
5371
  projectId: z.string().describe("Project id"),
5363
- provider: z.enum(["anthropic", "openai", "firecrawl", "browserbase", "cursor"]).describe("Provider slug"),
5372
+ provider: z.enum(["anthropic", "openai", "firecrawl", "browserbase", "cursor", "supabase"]).describe("Provider slug"),
5364
5373
  key: z.string().min(8).max(4096).describe("The API key value to add"),
5365
5374
  label: z.string().optional().describe("Human-readable label for this key"),
5366
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.1",
4
+ "version": "0.24.3",
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",