@mushi-mushi/cli 0.17.2 → 0.18.0
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/CONTRIBUTING.md +23 -1
- package/README.md +10 -0
- package/dist/chunk-ZB6ITDCQ.js +6 -0
- package/dist/index.js +201 -10
- package/dist/init.js +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-EEQI5AFX.js +0 -6
package/CONTRIBUTING.md
CHANGED
|
@@ -63,7 +63,7 @@ packages/
|
|
|
63
63
|
verify/ Fix verification (BSL)
|
|
64
64
|
apps/
|
|
65
65
|
admin/ Admin dashboard (React + Tailwind)
|
|
66
|
-
docs/ Documentation site (
|
|
66
|
+
docs/ Documentation site (Nextra — apps/docs)
|
|
67
67
|
tooling/
|
|
68
68
|
eslint-config/ Shared ESLint flat config
|
|
69
69
|
tsconfig/ Shared TypeScript configs
|
|
@@ -81,6 +81,28 @@ tooling/
|
|
|
81
81
|
```
|
|
82
82
|
6. Open a pull request
|
|
83
83
|
|
|
84
|
+
### Documentation (docs-as-code)
|
|
85
|
+
|
|
86
|
+
If your PR changes **user-visible SDK or CLI behavior**, update docs in the **same PR**:
|
|
87
|
+
|
|
88
|
+
| Surface | When to update |
|
|
89
|
+
| --- | --- |
|
|
90
|
+
| `packages/*/README.md` | npm-facing install/API/config changes for that package |
|
|
91
|
+
| `apps/docs/content/**/*.mdx` | Long-form guides, quickstarts, admin console docs |
|
|
92
|
+
| Root `README.md` | Marketing stats only when counts change — run `pnpm check:docs-stats` |
|
|
93
|
+
|
|
94
|
+
Guardrails (run locally before pushing):
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
pnpm check:docs-stats # root README stat badges
|
|
98
|
+
pnpm check:sdk-version-matrix # apps/docs/content/sdks/index.mdx versions
|
|
99
|
+
pnpm check:internal-doc-links # dead /foo links in MDX
|
|
100
|
+
pnpm check:bundle-docs # @mushi-mushi/web size-limit vs README
|
|
101
|
+
pnpm gen:llms-txt # regenerate apps/docs/public/llms.txt after nav changes
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
README changes on npm packages only appear on [npmjs.com](https://www.npmjs.com) after the next **Changesets publish**.
|
|
105
|
+
|
|
84
106
|
## Changesets
|
|
85
107
|
|
|
86
108
|
We use [Changesets](https://github.com/changesets/changesets) for versioning. If your PR modifies a published package (`core`, `web`, `react`, `vue`, `svelte`, `angular`, `react-native`, `cli`, `mcp`), add a changeset:
|
package/README.md
CHANGED
|
@@ -306,6 +306,16 @@ mushi slack test
|
|
|
306
306
|
- The `--api-key` flag leaks into `ps -ef` — prefer the interactive prompt on shared machines.
|
|
307
307
|
- Full stack traces on error: `DEBUG=mushi mushi init`.
|
|
308
308
|
|
|
309
|
+
## Programmatic imports
|
|
310
|
+
|
|
311
|
+
The CLI is also importable for tooling (used by `create-mushi-mushi`):
|
|
312
|
+
|
|
313
|
+
| Subpath | Exports |
|
|
314
|
+
| --- | --- |
|
|
315
|
+
| `@mushi-mushi/cli/init` | `runInit`, `InitOptions` |
|
|
316
|
+
| `@mushi-mushi/cli/detect` | Framework / package-manager detection |
|
|
317
|
+
| `@mushi-mushi/cli/version` | `MUSHI_CLI_VERSION` |
|
|
318
|
+
|
|
309
319
|
## License
|
|
310
320
|
|
|
311
321
|
MIT
|
package/dist/index.js
CHANGED
|
@@ -83,7 +83,7 @@ function getAbortSignal(external) {
|
|
|
83
83
|
}
|
|
84
84
|
|
|
85
85
|
// src/version.ts
|
|
86
|
-
var MUSHI_CLI_VERSION = true ? "0.
|
|
86
|
+
var MUSHI_CLI_VERSION = true ? "0.18.0" : "0.0.0-dev";
|
|
87
87
|
|
|
88
88
|
// src/config.ts
|
|
89
89
|
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync } from "fs";
|
|
@@ -2247,9 +2247,10 @@ Typical first-time flow:
|
|
|
2247
2247
|
|
|
2248
2248
|
// src/commands/setup.ts
|
|
2249
2249
|
function registerSetupCommands(program2) {
|
|
2250
|
-
program2.command("setup").description("Wire Mushi into your IDE with one command").option("--ide <ide>", "Target IDE: cursor | claude | continue | zed", "cursor").option("--project-slug <slug>", "Override the project slug in the server name (default:
|
|
2250
|
+
program2.command("setup").description("Wire Mushi into your IDE with one command").option("--ide <ide>", "Target IDE: cursor | claude | continue | zed", "cursor").option("--project-slug <slug>", "Override the project slug in the server name (default: fetched from API or ID prefix)").option("--all-projects", "Write a separate mushi-<name> server entry for every accessible project").option("--with-rules", "Also write the .cursorrules / .claude/rules/mushi.md lesson-library hook").option("--dry-run", "Print what would be written without making changes").addHelpText("after", `
|
|
2251
2251
|
Examples:
|
|
2252
2252
|
mushi setup # wire Cursor (default)
|
|
2253
|
+
mushi setup --all-projects # one server entry per accessible project
|
|
2253
2254
|
mushi setup --ide claude # wire Claude Code
|
|
2254
2255
|
mushi setup --ide cursor --with-rules # also write .cursorrules
|
|
2255
2256
|
|
|
@@ -2265,6 +2266,42 @@ The command reads credentials from ~/.mushirc (run \`mushi login\` first).`).act
|
|
|
2265
2266
|
const nodePath = await import("path");
|
|
2266
2267
|
const os = await import("os");
|
|
2267
2268
|
const config = requireConfig({ needsProject: true });
|
|
2269
|
+
const redactKeyForDisplay = (text2) => {
|
|
2270
|
+
const key = config.apiKey;
|
|
2271
|
+
if (!key) return text2;
|
|
2272
|
+
const masked = key.length > 12 ? `${key.slice(0, 10)}\u2026${key.slice(-2)}` : "\u2022\u2022\u2022\u2022";
|
|
2273
|
+
return text2.split(key).join(masked);
|
|
2274
|
+
};
|
|
2275
|
+
let slug;
|
|
2276
|
+
if (opts.projectSlug) {
|
|
2277
|
+
slug = opts.projectSlug;
|
|
2278
|
+
} else {
|
|
2279
|
+
try {
|
|
2280
|
+
const res = await fetch(
|
|
2281
|
+
`${config.endpoint?.replace(/\/$/, "")}/v1/admin/mcp/projects`,
|
|
2282
|
+
{
|
|
2283
|
+
headers: {
|
|
2284
|
+
"X-Mushi-Api-Key": config.apiKey ?? "",
|
|
2285
|
+
"X-Mushi-Project": config.projectId ?? ""
|
|
2286
|
+
},
|
|
2287
|
+
signal: AbortSignal.timeout(5e3)
|
|
2288
|
+
}
|
|
2289
|
+
);
|
|
2290
|
+
if (res.ok) {
|
|
2291
|
+
const body = await res.json();
|
|
2292
|
+
const project = body?.data?.projects?.find((p3) => p3.id === config.projectId);
|
|
2293
|
+
if (project?.name) {
|
|
2294
|
+
slug = project.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 24);
|
|
2295
|
+
} else {
|
|
2296
|
+
slug = config.projectId?.slice(0, 8) ?? "mushi";
|
|
2297
|
+
}
|
|
2298
|
+
} else {
|
|
2299
|
+
slug = config.projectId?.slice(0, 8) ?? "mushi";
|
|
2300
|
+
}
|
|
2301
|
+
} catch {
|
|
2302
|
+
slug = config.projectId?.slice(0, 8) ?? "mushi";
|
|
2303
|
+
}
|
|
2304
|
+
}
|
|
2268
2305
|
const IDE_CONFIG = {
|
|
2269
2306
|
cursor: { dir: ".cursor", file: "mcp.json", format: "mcp-json" },
|
|
2270
2307
|
claude: { dir: ".claude", file: "mcp.json", format: "mcp-json" },
|
|
@@ -2278,7 +2315,23 @@ The command reads credentials from ~/.mushirc (run \`mushi login\` first).`).act
|
|
|
2278
2315
|
process.exit(2);
|
|
2279
2316
|
}
|
|
2280
2317
|
const cwd = process.cwd();
|
|
2281
|
-
|
|
2318
|
+
let allProjectsList = null;
|
|
2319
|
+
if (opts.allProjects && config.endpoint && config.apiKey) {
|
|
2320
|
+
try {
|
|
2321
|
+
const res = await fetch(
|
|
2322
|
+
`${config.endpoint.replace(/\/$/, "")}/v1/admin/mcp/projects`,
|
|
2323
|
+
{
|
|
2324
|
+
headers: { "X-Mushi-Api-Key": config.apiKey, "X-Mushi-Project": config.projectId ?? "" },
|
|
2325
|
+
signal: AbortSignal.timeout(8e3)
|
|
2326
|
+
}
|
|
2327
|
+
);
|
|
2328
|
+
if (res.ok) {
|
|
2329
|
+
const body = await res.json();
|
|
2330
|
+
allProjectsList = body?.data?.projects ?? [];
|
|
2331
|
+
}
|
|
2332
|
+
} catch {
|
|
2333
|
+
}
|
|
2334
|
+
}
|
|
2282
2335
|
const serverName = `mushi-${slug}`;
|
|
2283
2336
|
const mcpServerBlock = {
|
|
2284
2337
|
command: "npx",
|
|
@@ -2301,16 +2354,37 @@ The command reads credentials from ~/.mushirc (run \`mushi login\` first).`).act
|
|
|
2301
2354
|
}
|
|
2302
2355
|
}
|
|
2303
2356
|
const servers = merged.mcpServers ?? {};
|
|
2304
|
-
|
|
2357
|
+
if (allProjectsList && allProjectsList.length > 0) {
|
|
2358
|
+
for (const p3 of allProjectsList) {
|
|
2359
|
+
const pSlug = p3.name ? p3.name.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "").slice(0, 24) : p3.id.slice(0, 8);
|
|
2360
|
+
const pServerName = `mushi-${pSlug}`;
|
|
2361
|
+
servers[pServerName] = {
|
|
2362
|
+
command: "npx",
|
|
2363
|
+
args: ["-y", "@mushi-mushi/mcp@latest"],
|
|
2364
|
+
env: {
|
|
2365
|
+
MUSHI_API_ENDPOINT: config.endpoint,
|
|
2366
|
+
MUSHI_PROJECT_ID: p3.id,
|
|
2367
|
+
MUSHI_API_KEY: config.apiKey
|
|
2368
|
+
}
|
|
2369
|
+
};
|
|
2370
|
+
}
|
|
2371
|
+
if (opts.dryRun) {
|
|
2372
|
+
console.log(`[dry-run] Would add ${allProjectsList.length} mushi-* entries to ${configPath}`);
|
|
2373
|
+
} else {
|
|
2374
|
+
console.log(`\u2713 Added ${allProjectsList.length} mushi-* server entries (${allProjectsList.map((p3) => p3.name ?? p3.id.slice(0, 8)).join(", ")})`);
|
|
2375
|
+
}
|
|
2376
|
+
} else {
|
|
2377
|
+
servers[serverName] = mcpServerBlock;
|
|
2378
|
+
}
|
|
2305
2379
|
merged.mcpServers = servers;
|
|
2306
2380
|
const output = JSON.stringify(merged, null, 2) + "\n";
|
|
2307
2381
|
if (opts.dryRun) {
|
|
2308
2382
|
console.log(`[dry-run] Would write ${configPath}:`);
|
|
2309
|
-
console.log(output);
|
|
2383
|
+
console.log(redactKeyForDisplay(output));
|
|
2310
2384
|
} else {
|
|
2311
2385
|
await mkdir2(configDir, { recursive: true });
|
|
2312
2386
|
await writeFile2(configPath, output, "utf8");
|
|
2313
|
-
console.log(`\u2713 Written ${configPath}`);
|
|
2387
|
+
if (!allProjectsList) console.log(`\u2713 Written ${configPath}`);
|
|
2314
2388
|
}
|
|
2315
2389
|
} else if (ideEntry.format === "zed") {
|
|
2316
2390
|
let settings = {};
|
|
@@ -2338,7 +2412,7 @@ The command reads credentials from ~/.mushirc (run \`mushi login\` first).`).act
|
|
|
2338
2412
|
const output = JSON.stringify(settings, null, 2) + "\n";
|
|
2339
2413
|
if (opts.dryRun) {
|
|
2340
2414
|
console.log(`[dry-run] Would write ${configPath}:`);
|
|
2341
|
-
console.log(output);
|
|
2415
|
+
console.log(redactKeyForDisplay(output));
|
|
2342
2416
|
} else {
|
|
2343
2417
|
await mkdir2(configDir, { recursive: true });
|
|
2344
2418
|
await writeFile2(configPath, output, "utf8");
|
|
@@ -2900,18 +2974,128 @@ async function checkHostAppWiring(cwd) {
|
|
|
2900
2974
|
}
|
|
2901
2975
|
return checks;
|
|
2902
2976
|
}
|
|
2977
|
+
async function checkMcpConfig(config, cwd, doFetch = globalThis.fetch) {
|
|
2978
|
+
const checks = [];
|
|
2979
|
+
const { readFile: readFile3 } = await import("fs/promises");
|
|
2980
|
+
const { join: join7, resolve: resolve4 } = await import("path");
|
|
2981
|
+
const { homedir: homedir2 } = await import("os");
|
|
2982
|
+
const root = resolve4(cwd);
|
|
2983
|
+
const candidates = [
|
|
2984
|
+
join7(root, ".cursor", "mcp.json"),
|
|
2985
|
+
join7(homedir2(), ".cursor", "mcp.json")
|
|
2986
|
+
];
|
|
2987
|
+
let mcpPath = null;
|
|
2988
|
+
let mcpRaw = null;
|
|
2989
|
+
for (const candidate of candidates) {
|
|
2990
|
+
try {
|
|
2991
|
+
mcpRaw = await readFile3(candidate, "utf8");
|
|
2992
|
+
mcpPath = candidate;
|
|
2993
|
+
break;
|
|
2994
|
+
} catch {
|
|
2995
|
+
}
|
|
2996
|
+
}
|
|
2997
|
+
if (!mcpPath || !mcpRaw) {
|
|
2998
|
+
checks.push({
|
|
2999
|
+
name: "[mcp] mcp.json present",
|
|
3000
|
+
ok: false,
|
|
3001
|
+
detail: "No .cursor/mcp.json found in cwd or ~/.cursor/. Run `mushi setup` to create it."
|
|
3002
|
+
});
|
|
3003
|
+
return checks;
|
|
3004
|
+
}
|
|
3005
|
+
checks.push({
|
|
3006
|
+
name: "[mcp] mcp.json present",
|
|
3007
|
+
ok: true,
|
|
3008
|
+
detail: `Found at ${mcpPath}`
|
|
3009
|
+
});
|
|
3010
|
+
let mcpConfig = {};
|
|
3011
|
+
try {
|
|
3012
|
+
mcpConfig = JSON.parse(mcpRaw);
|
|
3013
|
+
} catch {
|
|
3014
|
+
checks.push({ name: "[mcp] mcp.json valid JSON", ok: false, detail: "mcp.json is not valid JSON \u2014 regenerate with `mushi setup`." });
|
|
3015
|
+
return checks;
|
|
3016
|
+
}
|
|
3017
|
+
const servers = mcpConfig.mcpServers ?? {};
|
|
3018
|
+
const mushiEntries = Object.entries(servers).filter(([k]) => k === "mushi" || k.startsWith("mushi-"));
|
|
3019
|
+
if (mushiEntries.length === 0) {
|
|
3020
|
+
checks.push({
|
|
3021
|
+
name: "[mcp] mushi server entry",
|
|
3022
|
+
ok: false,
|
|
3023
|
+
detail: "No mushi or mushi-* server found in mcpServers. Run `mushi setup` to add one."
|
|
3024
|
+
});
|
|
3025
|
+
return checks;
|
|
3026
|
+
}
|
|
3027
|
+
checks.push({
|
|
3028
|
+
name: "[mcp] mushi server entry",
|
|
3029
|
+
ok: true,
|
|
3030
|
+
detail: `Found: ${mushiEntries.map(([k]) => k).join(", ")}`
|
|
3031
|
+
});
|
|
3032
|
+
let anyKeyValid = false;
|
|
3033
|
+
let anyEndpointSet = false;
|
|
3034
|
+
for (const [, srv] of mushiEntries) {
|
|
3035
|
+
const s = srv;
|
|
3036
|
+
const env = s.env ?? {};
|
|
3037
|
+
const key = env["MUSHI_API_KEY"] ?? "";
|
|
3038
|
+
const endpoint = env["MUSHI_API_ENDPOINT"] ?? "";
|
|
3039
|
+
if (key.startsWith("mushi_")) anyKeyValid = true;
|
|
3040
|
+
if (endpoint.includes("supabase.co") || endpoint.includes("localhost")) anyEndpointSet = true;
|
|
3041
|
+
}
|
|
3042
|
+
checks.push({
|
|
3043
|
+
name: "[mcp] MUSHI_API_KEY set",
|
|
3044
|
+
ok: anyKeyValid,
|
|
3045
|
+
detail: anyKeyValid ? "At least one mushi server has a valid mushi_* API key" : "No mushi_* API key found in any mushi server env. Re-run `mushi setup` to regenerate."
|
|
3046
|
+
});
|
|
3047
|
+
checks.push({
|
|
3048
|
+
name: "[mcp] MUSHI_API_ENDPOINT set",
|
|
3049
|
+
ok: anyEndpointSet,
|
|
3050
|
+
detail: anyEndpointSet ? "MUSHI_API_ENDPOINT is present and looks valid" : "MUSHI_API_ENDPOINT missing or not a Supabase URL. Re-run `mushi setup`."
|
|
3051
|
+
});
|
|
3052
|
+
if (anyKeyValid && anyEndpointSet && config.apiKey && config.endpoint) {
|
|
3053
|
+
try {
|
|
3054
|
+
const { endpoint, apiKey } = sanitizeCliCredentials(config);
|
|
3055
|
+
const res = await doFetch(`${endpoint}/v1/admin/mcp/account-overview`, {
|
|
3056
|
+
headers: apiKeyHeaders(apiKey, config.projectId),
|
|
3057
|
+
signal: AbortSignal.timeout(6e3)
|
|
3058
|
+
});
|
|
3059
|
+
if (res.ok) {
|
|
3060
|
+
const body = await res.json();
|
|
3061
|
+
const projectCount = body?.data?.total ?? 0;
|
|
3062
|
+
checks.push({
|
|
3063
|
+
name: "[mcp] account-overview reachable",
|
|
3064
|
+
ok: true,
|
|
3065
|
+
detail: `Key is valid; ${projectCount} accessible project${projectCount === 1 ? "" : "s"}`
|
|
3066
|
+
});
|
|
3067
|
+
} else {
|
|
3068
|
+
checks.push({
|
|
3069
|
+
name: "[mcp] account-overview reachable",
|
|
3070
|
+
ok: false,
|
|
3071
|
+
detail: `GET /v1/admin/mcp/account-overview \u2192 HTTP ${res.status}. Verify the API key is active.`
|
|
3072
|
+
});
|
|
3073
|
+
}
|
|
3074
|
+
} catch (err) {
|
|
3075
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
3076
|
+
checks.push({
|
|
3077
|
+
name: "[mcp] account-overview reachable",
|
|
3078
|
+
ok: false,
|
|
3079
|
+
detail: `Probe failed: ${msg}. Check MUSHI_API_ENDPOINT and network connectivity.`
|
|
3080
|
+
});
|
|
3081
|
+
}
|
|
3082
|
+
}
|
|
3083
|
+
return checks;
|
|
3084
|
+
}
|
|
2903
3085
|
var FIX_HINTS = {
|
|
2904
3086
|
"CLI config file": "Run `mushi connect --endpoint <url> --project-id <uuid> --api-key mushi_xxx` or `mushi config endpoint <url>`.",
|
|
2905
3087
|
"API key configured": "Mint a key in the console (Projects \u2192 API Keys) then `mushi login --api-key mushi_xxx`.",
|
|
2906
3088
|
"Project ID configured": "Copy the project UUID from the console Projects page \u2192 `mushi config projectId <uuid>`.",
|
|
2907
3089
|
"Endpoint reachable": "Check your network and that MUSHI_API_ENDPOINT points at `\u2026/functions/v1/api`.",
|
|
2908
3090
|
"[ingest]": "Open the console Onboarding wizard \u2192 Install SDK \u2192 submit a test report, or run `mushi connect --wait`.",
|
|
2909
|
-
"[server]": "Open Settings \u2192 Integrations: connect GitHub, index codebase, add Anthropic BYOK key, enable autofix."
|
|
3091
|
+
"[server]": "Open Settings \u2192 Integrations: connect GitHub, index codebase, add Anthropic BYOK key, enable autofix.",
|
|
3092
|
+
"[mcp]": "Run `mushi setup` to regenerate .cursor/mcp.json with a fresh API key and endpoint."
|
|
2910
3093
|
};
|
|
2911
3094
|
function fixHintForCheck(name) {
|
|
2912
3095
|
if (FIX_HINTS[name]) return FIX_HINTS[name];
|
|
2913
3096
|
if (name.startsWith("[ingest]")) return FIX_HINTS["[ingest]"];
|
|
2914
3097
|
if (name.startsWith("[server]") || name.startsWith("[preflight]")) return FIX_HINTS["[server]"];
|
|
3098
|
+
if (name.startsWith("[mcp]")) return FIX_HINTS["[mcp]"];
|
|
2915
3099
|
return void 0;
|
|
2916
3100
|
}
|
|
2917
3101
|
async function runDoctor(config, options = {}) {
|
|
@@ -2941,6 +3125,10 @@ async function runDoctor(config, options = {}) {
|
|
|
2941
3125
|
const hostChecks = await checkHostAppWiring(options.cwd ?? process.cwd());
|
|
2942
3126
|
checks.push(...hostChecks);
|
|
2943
3127
|
}
|
|
3128
|
+
if (options.mcp) {
|
|
3129
|
+
const mcpChecks = await checkMcpConfig(config, options.cwd ?? process.cwd(), doFetch);
|
|
3130
|
+
checks.push(...mcpChecks);
|
|
3131
|
+
}
|
|
2944
3132
|
return { checks, ready: checks.every((c) => c.ok) };
|
|
2945
3133
|
}
|
|
2946
3134
|
function formatDoctorResult(result) {
|
|
@@ -3379,12 +3567,15 @@ Examples:
|
|
|
3379
3567
|
).option(
|
|
3380
3568
|
"--host-app",
|
|
3381
3569
|
"Verify host-app wiring: Mushi env vars, Cursor MCP config, Capacitor hybrid SDK notes."
|
|
3570
|
+
).option(
|
|
3571
|
+
"--mcp",
|
|
3572
|
+
"Check Cursor MCP config: verify mushi-* server entry, credentials, and probe account-overview connectivity."
|
|
3382
3573
|
).option(
|
|
3383
3574
|
"--fix",
|
|
3384
3575
|
"Apply safe local fixes when checks fail: write missing .env.local lines and wire Cursor MCP config."
|
|
3385
3576
|
).action(async (opts) => {
|
|
3386
3577
|
const config = loadConfig();
|
|
3387
|
-
const doctorOpts = { cwd: opts.cwd, server: opts.server, ingest: opts.ingest, qaStories: opts.qaStories, hostApp: opts.hostApp };
|
|
3578
|
+
const doctorOpts = { cwd: opts.cwd, server: opts.server, ingest: opts.ingest, qaStories: opts.qaStories, hostApp: opts.hostApp, mcp: opts.mcp };
|
|
3388
3579
|
let result = await runDoctor(config, doctorOpts);
|
|
3389
3580
|
if (!result.ready && opts.fix && config.apiKey && config.projectId && config.endpoint) {
|
|
3390
3581
|
const connectResult = await runConnect({
|
|
@@ -3396,7 +3587,7 @@ Examples:
|
|
|
3396
3587
|
wireIde: true
|
|
3397
3588
|
}, config);
|
|
3398
3589
|
for (const msg of connectResult.messages) console.log(msg);
|
|
3399
|
-
result = await runDoctor(config, doctorOpts);
|
|
3590
|
+
result = await runDoctor(config, { ...doctorOpts, mcp: opts.mcp });
|
|
3400
3591
|
}
|
|
3401
3592
|
const { checks } = result;
|
|
3402
3593
|
if (opts.json) {
|
package/dist/init.js
CHANGED
package/dist/version.js
CHANGED
package/package.json
CHANGED