@mushi-mushi/mcp 0.24.2 → 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 · 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>
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-Y757GGQH.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."
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.2";
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.2";
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."
@@ -2718,7 +2718,7 @@ var MUSHI_DOCS_INDEX = [
2718
2718
  route: "/quickstart/incident-loop",
2719
2719
  markdown: "quickstart/incident-loop.md",
2720
2720
  keywords: ["quickstart", "incident-loop", "incident", "loop", "bug", "fix", "prompt"],
2721
- 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"],
2722
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."
2723
2723
  },
2724
2724
  {
@@ -6638,7 +6638,7 @@ Be specific. No generic advice.`
6638
6638
  description: descOf("improve_qa_story", TDD_TOOL_CATALOG),
6639
6639
  annotations: annotationsFor("improve_qa_story", TDD_TOOL_CATALOG),
6640
6640
  inputSchema: z.object({
6641
- 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)")
6642
6642
  })
6643
6643
  },
6644
6644
  async ({ projectId: projectId2 }) => {
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-Y757GGQH.js";
7
+ } from "./chunk-3IVSUYFV.js";
8
8
  import {
9
9
  MUSHI_SERVER_METADATA
10
10
  } from "./chunk-FJRPC4VR.js";
@@ -1328,7 +1328,7 @@ var MUSHI_DOCS_INDEX = [
1328
1328
  route: "/quickstart/incident-loop",
1329
1329
  markdown: "quickstart/incident-loop.md",
1330
1330
  keywords: ["quickstart", "incident-loop", "incident", "loop", "bug", "fix", "prompt"],
1331
- 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"],
1332
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."
1333
1333
  },
1334
1334
  {
@@ -5314,7 +5314,7 @@ Be specific. No generic advice.`
5314
5314
  description: descOf("improve_qa_story", TDD_TOOL_CATALOG),
5315
5315
  annotations: annotationsFor("improve_qa_story", TDD_TOOL_CATALOG),
5316
5316
  inputSchema: z.object({
5317
- 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)")
5318
5318
  })
5319
5319
  },
5320
5320
  async ({ projectId: projectId2 }) => {
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.2",
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",