@mushi-mushi/mcp 0.20.0 → 0.20.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
@@ -146,7 +146,7 @@ The Mushi backend now exposes the same tool catalog over the **Streamable HTTP**
146
146
 
147
147
  ### Feature groups (`?features=` / `MUSHI_FEATURES`)
148
148
 
149
- Full catalog is **69 tools** (stdio / `MUSHI_FEATURES=all`). The hosted HTTP
149
+ Full catalog is **72 tools** (stdio / `MUSHI_FEATURES=all`). The hosted HTTP
150
150
  endpoint exposes a leaner subset filtered by feature groups (see
151
151
  `mcp-hosted-tool-manifest.json`). New installs now default to the lean
152
152
  `triage,fixes,inventory,setup,docs` set automatically (stdio: when
@@ -390,7 +390,7 @@ Spawns `dist/index.js` with a dummy unreachable endpoint and confirms it adverti
390
390
  pnpm --filter @mushi-mushi/mcp build
391
391
  pnpm --filter @mushi-mushi/mcp test:smoke
392
392
  # OK; prints live tool/resource/prompt counts from the catalog
393
- # (see packages/mcp/src/catalog.ts — currently 69 tools / 8 resources / 4 prompts)
393
+ # (see packages/mcp/src/catalog.ts — currently 72 tools / 8 resources / 4 prompts)
394
394
  ```
395
395
 
396
396
  ### Layer 3; Full localhost E2E (real binary + real backend behaviour)
@@ -484,4 +484,4 @@ MIT
484
484
  <!-- mushi-readme-stats-footer -->
485
485
  ---
486
486
 
487
- <sub>Monorepo scale (July 2026): 55 edge functions · 328 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>
487
+ <sub>Monorepo scale (July 2026): 55 edge functions · 336 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
@@ -6,7 +6,7 @@ import {
6
6
  TDD_TOOL_CATALOG,
7
7
  TOOL_CATALOG,
8
8
  USE_MUSHI_INTENTS
9
- } from "./chunk-OZJEY3QR.js";
9
+ } from "./chunk-RVZIKP4X.js";
10
10
  export {
11
11
  ALL_SCOPES,
12
12
  CODEBASE_TOOL_CATALOG,
@@ -160,7 +160,7 @@ var TOOL_CATALOG = [
160
160
  {
161
161
  name: "dispatch_fix",
162
162
  title: "Dispatch Mushi fix agent",
163
- 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 { fixAttemptId }; poll get_fix_timeline for progress and merge_fix when CI is green. Write; NOT idempotent \u2014 each call starts a new attempt. Report must be classified \u2014 run triage_issue if not.',
163
+ 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.',
164
164
  scope: "mcp:write",
165
165
  hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
166
166
  useCase: "Let the in-repo agent attempt this fix for me (or: dispatch a Cursor Cloud Agent)."
@@ -295,6 +295,14 @@ var TOOL_CATALOG = [
295
295
  hints: { readOnly: true, idempotent: true, openWorld: true },
296
296
  useCase: "Analyze this bug report end-to-end and tell me what to do."
297
297
  },
298
+ {
299
+ name: "triage_next_steps",
300
+ title: "What should I work on now?",
301
+ description: 'Prioritised "do this next" list for the project: blocked auto-fixes first (with the unblock action), then in-flight fixes to shepherd to merge, then user-felt classified reports by severity, with robot/cron chores (dependency bumps) last. Returns { steps: [{ priority, action, reason, tool, args }], summary }. Read-only. Call this first when the user asks "what needs my attention / what should I triage or fix".',
302
+ scope: "mcp:read",
303
+ hints: { readOnly: true, idempotent: true, openWorld: true },
304
+ useCase: "What should I triage or fix right now?"
305
+ },
298
306
  // ── Lessons / evolution loop ─────────────────────────────────────────────
299
307
  {
300
308
  name: "query_lessons",
@@ -449,7 +457,7 @@ var TDD_TOOL_CATALOG = [
449
457
  {
450
458
  name: "list_byok_keys",
451
459
  title: "List your API key pool",
452
- description: "List the project's BYOK API keys grouped by provider (anthropic | openai | firecrawl | browserbase | cursor). Returns { keys: [{ id, provider, label, priority, status, cooldownUntil }] } \u2014 metadata only, never the raw secret. Read-only. Use to see which keys are active vs rate-limited/exhausted; use add_byok_key to add one.",
460
+ 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.",
453
461
  scope: "mcp:read",
454
462
  hints: { readOnly: true, idempotent: true, openWorld: true },
455
463
  useCase: "Which API keys are active and which are rate-limited?"
@@ -457,11 +465,27 @@ var TDD_TOOL_CATALOG = [
457
465
  {
458
466
  name: "add_byok_key",
459
467
  title: "Add an API key",
460
- description: "Add a BYOK API key to the project pool for a provider (anthropic | openai | firecrawl | browserbase | cursor), with a label and priority for failover ordering. The raw key is stored encrypted in Supabase Vault and never returned. Returns { id, provider, label }. Write; NOT idempotent \u2014 adds a new row each call. Use to register a backup/rotated key; use list_byok_keys to review the pool.",
468
+ 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.",
461
469
  scope: "mcp:write",
462
470
  hints: { readOnly: false, destructive: false, idempotent: false, openWorld: true },
463
471
  useCase: "Add a backup Anthropic key to the pool."
464
472
  },
473
+ {
474
+ name: "test_byok_key",
475
+ title: "Test an API key",
476
+ description: "Re-test one pooled BYOK credential by key id. A successful provider probe activates the key; auth, quota, and network failures keep it out of the runtime pool. Returns the sanitized validation result and updated key metadata. Write; idempotent.",
477
+ scope: "mcp:write",
478
+ hints: { readOnly: false, destructive: false, idempotent: true, openWorld: true },
479
+ useCase: "Re-test a quarantined OpenAI key after fixing its account quota."
480
+ },
481
+ {
482
+ name: "remove_byok_key",
483
+ title: "Remove an API key",
484
+ description: "Permanently remove one pooled BYOK credential by key id from the authenticated project, including its Vault secret. Write; destructive; idempotent.",
485
+ scope: "mcp:write",
486
+ hints: { readOnly: false, destructive: true, idempotent: true, openWorld: true },
487
+ useCase: "Remove a rotated or compromised provider key from the runtime pool."
488
+ },
465
489
  {
466
490
  name: "list_pending_review_stories",
467
491
  title: "List QA stories pending review",
@@ -604,24 +628,29 @@ var TDD_TOOL_CATALOG = [
604
628
  }
605
629
  ];
606
630
  var USE_MUSHI_INTENTS = {
631
+ // NOTE: every name below MUST be a registered TOOL (scopes.test.ts guards
632
+ // this). 2026-08-16 audit P0-3 found phantom names (get_report,
633
+ // get_dashboard, list_qa_stories) and prompts listed as tools
634
+ // (summarize_report_for_fix, mushi_setup) — agents routed here then
635
+ // failed the call and gave up.
607
636
  fix: {
608
637
  label: "Fix a bug",
609
638
  tools: [
610
639
  "get_recent_reports",
611
- "get_report",
612
- "summarize_report_for_fix",
640
+ "get_report_detail",
641
+ "triage_issue",
613
642
  "dispatch_fix",
614
643
  "start_skill_pipeline",
615
644
  "checkin_pipeline_step",
616
645
  "get_pipeline_run"
617
646
  ],
618
- hint: "Call get_recent_reports to find the top unresolved bug, then summarize_report_for_fix before dispatching."
647
+ hint: "Call get_recent_reports to find the top unresolved bug, then triage_issue before dispatching."
619
648
  },
620
649
  status: {
621
650
  label: "Check project status",
622
651
  tools: [
623
- "get_dashboard",
624
652
  "triage_next_steps",
653
+ "get_account_overview",
625
654
  "get_usage",
626
655
  "get_backend_health",
627
656
  "activation_status"
@@ -631,18 +660,19 @@ var USE_MUSHI_INTENTS = {
631
660
  setup: {
632
661
  label: "Set up Mushi",
633
662
  tools: [
634
- "mushi_setup",
663
+ "diagnose_setup",
635
664
  "activation_status",
636
665
  "get_backend_health",
637
666
  "list_byok_keys",
638
- "add_byok_key"
667
+ "add_byok_key",
668
+ "test_byok_key",
669
+ "remove_byok_key"
639
670
  ],
640
- hint: "Call mushi_setup first \u2014 it diagnoses setup gaps and returns the next command to run."
671
+ hint: "Call diagnose_setup first \u2014 it diagnoses setup gaps and returns the next action to take."
641
672
  },
642
673
  qa: {
643
674
  label: "Run / review QA tests",
644
675
  tools: [
645
- "list_qa_stories",
646
676
  "run_qa_story",
647
677
  "list_qa_story_runs",
648
678
  "get_qa_story_run",
@@ -650,7 +680,7 @@ var USE_MUSHI_INTENTS = {
650
680
  "approve_qa_story",
651
681
  "improve_qa_story"
652
682
  ],
653
- hint: "Call list_qa_stories to see what test coverage exists; run_qa_story to trigger a run."
683
+ hint: "Call list_qa_story_runs to see recent coverage and outcomes; run_qa_story to trigger a run."
654
684
  },
655
685
  pipeline: {
656
686
  label: "Run an agent pipeline / skill",
@@ -665,12 +695,7 @@ var USE_MUSHI_INTENTS = {
665
695
  },
666
696
  audit: {
667
697
  label: "Audit / health check",
668
- tools: [
669
- "run_fullstack_audit",
670
- "get_backend_health",
671
- "get_dashboard",
672
- "get_usage"
673
- ],
698
+ tools: ["run_fullstack_audit", "get_backend_health", "get_account_overview", "get_usage"],
674
699
  hint: "Call run_fullstack_audit for a full-stack health scorecard."
675
700
  }
676
701
  };
@@ -98,8 +98,10 @@ var TOOL_FEATURE_MAP = {
98
98
  start_skill_pipeline: "skills",
99
99
  get_pipeline_run: "skills",
100
100
  checkin_pipeline_step: "skills",
101
- list_byok_keys: "skills",
102
- add_byok_key: "skills",
101
+ list_byok_keys: "setup",
102
+ add_byok_key: "setup",
103
+ test_byok_key: "setup",
104
+ remove_byok_key: "setup",
103
105
  // audit
104
106
  run_fullstack_audit: "audit",
105
107
  get_backend_health: "audit",
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.20.0";
49
+ declare const MCP_PIN_SPEC = "@mushi-mushi/mcp@0.20.2";
50
50
  interface StdioConfig {
51
51
  command: string;
52
52
  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-VBXXUK5G.js";
8
+ } from "./chunk-ZSVRLSW5.js";
9
9
 
10
10
  // src/clients.ts
11
- var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.20.0";
11
+ var MCP_PIN_SPEC = "@mushi-mushi/mcp@0.20.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);
@@ -9,7 +9,7 @@ import {
9
9
  parseFeaturesCsv,
10
10
  parseFeaturesParam,
11
11
  toolMatchesFeatures
12
- } from "./chunk-VBXXUK5G.js";
12
+ } from "./chunk-ZSVRLSW5.js";
13
13
  export {
14
14
  ALL_FEATURE_GROUPS,
15
15
  DEFAULT_FEATURE_GROUPS,