@mushi-mushi/cli 0.29.0 → 0.29.1
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/dist/chunk-HHOPCVNI.js +10 -0
- package/dist/chunk-JE3STWB2.js +8 -0
- package/dist/{chunk-FDDSGZSC.js → chunk-KQ6POXZH.js} +1 -1
- package/dist/{chunk-O7PLRNM2.js → chunk-MDYYLRWB.js} +1 -1
- package/dist/{connect-SEFUBQCA.js → connect-35YLLMGD.js} +2 -2
- package/dist/{connect-TGIJLXAN.js → connect-RIPZ4B5Y.js} +2 -2
- package/dist/index.js +180 -20
- package/dist/init.js +3 -3
- package/dist/{version-WHAZE7TY.js → version-FYBMIU3T.js} +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-F4EGZNKA.js +0 -10
- package/dist/chunk-UZZUGLI2.js +0 -8
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
saveConfig,
|
|
7
7
|
savedSdkKeyFor,
|
|
8
8
|
waitForIngestReady
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-KQ6POXZH.js";
|
|
10
10
|
import {
|
|
11
11
|
MUSHI_MCP_PIN_SPEC
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-JE3STWB2.js";
|
|
13
13
|
import {
|
|
14
14
|
detectFramework,
|
|
15
15
|
envVarsToWrite,
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
import {
|
|
3
3
|
resolveSdkEnvKey,
|
|
4
4
|
runConnect
|
|
5
|
-
} from "./chunk-
|
|
6
|
-
import "./chunk-
|
|
5
|
+
} from "./chunk-MDYYLRWB.js";
|
|
6
|
+
import "./chunk-HHOPCVNI.js";
|
|
7
7
|
import "./chunk-KOBEOGNF.js";
|
|
8
8
|
import "./chunk-LDPFTQLE.js";
|
|
9
9
|
import "./chunk-PDX44BCA.js";
|
package/dist/index.js
CHANGED
|
@@ -53,11 +53,11 @@ import {
|
|
|
53
53
|
setGlobalOutputFormat,
|
|
54
54
|
trySaveKeyToKeychain,
|
|
55
55
|
writeMcpServerEntry
|
|
56
|
-
} from "./chunk-
|
|
56
|
+
} from "./chunk-MDYYLRWB.js";
|
|
57
57
|
import {
|
|
58
58
|
MUSHI_CLI_VERSION,
|
|
59
59
|
MUSHI_MCP_PIN_SPEC
|
|
60
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-HHOPCVNI.js";
|
|
61
61
|
import {
|
|
62
62
|
FRAMEWORKS,
|
|
63
63
|
detectFramework,
|
|
@@ -1512,7 +1512,7 @@ async function checkOnboardingStatus(config, _consoleBase, cwd, doFetch = global
|
|
|
1512
1512
|
}
|
|
1513
1513
|
async function checkVersionDrift(cwd, doFetch) {
|
|
1514
1514
|
const checks = [];
|
|
1515
|
-
const { MUSHI_CLI_VERSION: MUSHI_CLI_VERSION2 } = await import("./version-
|
|
1515
|
+
const { MUSHI_CLI_VERSION: MUSHI_CLI_VERSION2 } = await import("./version-FYBMIU3T.js");
|
|
1516
1516
|
if (MUSHI_CLI_VERSION2 === "0.0.0-dev") return checks;
|
|
1517
1517
|
const parse2 = (v) => {
|
|
1518
1518
|
const m = v.replace(/^[~^]/, "").match(/^(\d+)\.(\d+)\.(\d+)/);
|
|
@@ -2436,7 +2436,7 @@ async function maybeOfferConnect(credentials, options, _consoleBase) {
|
|
|
2436
2436
|
if (p.isCancel(answer) || !answer) return;
|
|
2437
2437
|
const endpoint = resolveCloudEndpoint(options.endpoint);
|
|
2438
2438
|
try {
|
|
2439
|
-
const { runConnect: runConnect2 } = await import("./connect-
|
|
2439
|
+
const { runConnect: runConnect2 } = await import("./connect-RIPZ4B5Y.js");
|
|
2440
2440
|
const saved = loadConfig();
|
|
2441
2441
|
const result = await runConnect2(
|
|
2442
2442
|
{
|
|
@@ -4258,6 +4258,41 @@ Note: ${configRelPath} contains your Mushi API key.`);
|
|
|
4258
4258
|
}
|
|
4259
4259
|
|
|
4260
4260
|
// src/commands/fix.ts
|
|
4261
|
+
function githubOwnerName(url) {
|
|
4262
|
+
const cleaned = url.trim().replace(/^git@github\.com:/i, "https://github.com/").replace(/\/+$/, "").replace(/\.git$/i, "");
|
|
4263
|
+
const match = cleaned.match(/github\.com\/([^/]+)\/([^/]+)/i);
|
|
4264
|
+
return match ? `${match[1]}/${match[2]}`.toLowerCase() : null;
|
|
4265
|
+
}
|
|
4266
|
+
async function resolveTargetRepoId(repo, cfg) {
|
|
4267
|
+
if (!repo.includes("/")) return requireUuid(repo, "--repo");
|
|
4268
|
+
if (!/^[\w.-]+\/[\w.-]+$/.test(repo)) {
|
|
4269
|
+
throw new MushiCliError("E_INVALID_INPUT", "--repo must be a repo id or owner/name", "e.g. --repo acme/app-backend");
|
|
4270
|
+
}
|
|
4271
|
+
if (!cfg.projectId) {
|
|
4272
|
+
throw new MushiCliError(
|
|
4273
|
+
"E_INVALID_INPUT",
|
|
4274
|
+
"--repo owner/name needs a project to look the repo up in",
|
|
4275
|
+
"pass --project-id or set MUSHI_PROJECT_ID, or pass the repo id instead"
|
|
4276
|
+
);
|
|
4277
|
+
}
|
|
4278
|
+
const res = await apiCall(
|
|
4279
|
+
`/v1/admin/repo/repos?project_id=${encodeURIComponent(cfg.projectId)}`,
|
|
4280
|
+
cfg
|
|
4281
|
+
);
|
|
4282
|
+
if (!res.ok) {
|
|
4283
|
+
console.error("Error listing linked repos:", res.error.message);
|
|
4284
|
+
process.exit(1);
|
|
4285
|
+
}
|
|
4286
|
+
const linked = res.data ?? [];
|
|
4287
|
+
const matches = linked.filter((r) => githubOwnerName(r.repo_url) === repo.toLowerCase());
|
|
4288
|
+
if (matches.length === 1) return matches[0].id;
|
|
4289
|
+
const names = linked.map((r) => githubOwnerName(r.repo_url) ?? r.repo_url).join(", ") || "none";
|
|
4290
|
+
throw new MushiCliError(
|
|
4291
|
+
"E_INVALID_INPUT",
|
|
4292
|
+
matches.length === 0 ? `${repo} is not linked to this project` : `${repo} matches ${matches.length} linked repos; pass the repo id`,
|
|
4293
|
+
`linked repos: ${names}`
|
|
4294
|
+
);
|
|
4295
|
+
}
|
|
4261
4296
|
function registerFixCommands(program2) {
|
|
4262
4297
|
const fixCmd = program2.command("fix").description("Dispatch an agentic fix for a report");
|
|
4263
4298
|
fixCmd.argument("<reportId>", "Report UUID to fix").option(
|
|
@@ -4273,12 +4308,18 @@ function registerFixCommands(program2) {
|
|
|
4273
4308
|
).option(
|
|
4274
4309
|
"--wait",
|
|
4275
4310
|
"Poll until terminal state and exit non-zero on error/cancelled (CI-friendly)"
|
|
4311
|
+
).option(
|
|
4312
|
+
"--repo <repoId|owner/name>",
|
|
4313
|
+
"Linked repo to open the fix PR against (a project with several repos). Default: the project's primary repo"
|
|
4276
4314
|
).option("-e, --endpoint <url>", "API endpoint (overrides MUSHI_API_ENDPOINT)").option("--api-key <key>", "API key (overrides MUSHI_API_KEY)").option("--project-id <id>", "Project ID (overrides MUSHI_PROJECT_ID)").addHelpText("after", `
|
|
4277
4315
|
Examples:
|
|
4278
4316
|
mushi fix abc123 --agent cursor_cloud --wait
|
|
4279
4317
|
mushi fix abc123 --agent cursor_cloud --model composer-latest --no-auto-pr
|
|
4280
4318
|
mushi fix abc123 --agent claude_code
|
|
4281
4319
|
|
|
4320
|
+
# A project with a frontend and a backend repo: send the fix to the backend
|
|
4321
|
+
mushi fix abc123 --repo acme/app-backend
|
|
4322
|
+
|
|
4282
4323
|
# CI: fail the pipeline if the fix errors
|
|
4283
4324
|
mushi fix $REPORT_ID --agent cursor_cloud --wait && echo "Fix PR opened"`).action(async (reportId, opts) => {
|
|
4284
4325
|
requireUuid(reportId, "reportId");
|
|
@@ -4286,6 +4327,7 @@ Examples:
|
|
|
4286
4327
|
if (opts.endpoint) cfg.endpoint = opts.endpoint;
|
|
4287
4328
|
if (opts.apiKey) cfg.apiKey = opts.apiKey;
|
|
4288
4329
|
if (opts.projectId) cfg.projectId = opts.projectId;
|
|
4330
|
+
const targetRepoId = opts.repo ? await resolveTargetRepoId(opts.repo, cfg) : void 0;
|
|
4289
4331
|
const isTTY = process.stdout.isTTY;
|
|
4290
4332
|
const emitEvent = (type, data) => {
|
|
4291
4333
|
if (isTTY) {
|
|
@@ -4295,11 +4337,17 @@ Examples:
|
|
|
4295
4337
|
process.stdout.write(JSON.stringify({ type, ...data }) + "\n");
|
|
4296
4338
|
}
|
|
4297
4339
|
};
|
|
4298
|
-
emitEvent("dispatch.start", {
|
|
4340
|
+
emitEvent("dispatch.start", {
|
|
4341
|
+
reportId,
|
|
4342
|
+
agent: opts.agent,
|
|
4343
|
+
model: opts.model ?? null,
|
|
4344
|
+
targetRepoId: targetRepoId ?? null
|
|
4345
|
+
});
|
|
4299
4346
|
const body = {
|
|
4300
4347
|
reportId,
|
|
4301
4348
|
projectId: cfg.projectId,
|
|
4302
|
-
agent: opts.agent
|
|
4349
|
+
agent: opts.agent,
|
|
4350
|
+
...targetRepoId ? { targetRepoId } : {}
|
|
4303
4351
|
};
|
|
4304
4352
|
if (opts.agent === "cursor_cloud") {
|
|
4305
4353
|
if (opts.model) body.cursorModel = opts.model;
|
|
@@ -4314,13 +4362,13 @@ Examples:
|
|
|
4314
4362
|
console.error("Error dispatching fix:", result.error.message);
|
|
4315
4363
|
process.exit(1);
|
|
4316
4364
|
}
|
|
4317
|
-
const { fixId, status, agentId, runId, prUrl } = result.data;
|
|
4318
|
-
emitEvent("dispatch.ok", { fixId, status, agentId, runId, prUrl });
|
|
4365
|
+
const { dispatchId, fixId, status, agentId, runId, prUrl } = result.data;
|
|
4366
|
+
emitEvent("dispatch.ok", { dispatchId, fixId, status, agentId, runId, prUrl });
|
|
4319
4367
|
if (!opts.wait) {
|
|
4320
4368
|
process.exit(0);
|
|
4321
4369
|
}
|
|
4322
|
-
if (!
|
|
4323
|
-
console.error("No
|
|
4370
|
+
if (!dispatchId) {
|
|
4371
|
+
console.error("No dispatchId returned \u2014 cannot poll.");
|
|
4324
4372
|
process.exit(1);
|
|
4325
4373
|
}
|
|
4326
4374
|
const POLL_MS = 5e3;
|
|
@@ -4329,7 +4377,7 @@ Examples:
|
|
|
4329
4377
|
for (let i = 0; i < MAX_POLLS; i++) {
|
|
4330
4378
|
await new Promise((r) => setTimeout(r, POLL_MS));
|
|
4331
4379
|
const pollResult = await apiCall(
|
|
4332
|
-
`/v1/admin/fixes/${
|
|
4380
|
+
`/v1/admin/fixes/dispatch/${dispatchId}`,
|
|
4333
4381
|
cfg
|
|
4334
4382
|
);
|
|
4335
4383
|
if (!pollResult.ok) {
|
|
@@ -8636,23 +8684,131 @@ function gitDefaultBranch(root) {
|
|
|
8636
8684
|
}
|
|
8637
8685
|
return "main";
|
|
8638
8686
|
}
|
|
8687
|
+
var ENV_EXAMPLES = [".env.example", ".env.local.example", ".env.sample", ".env.template"];
|
|
8688
|
+
var ROOT_APP_DIRS = ["app", "src", "components", "features", "lib", "hooks", "pages"];
|
|
8689
|
+
var MAX_LITERAL_GLOBS = 30;
|
|
8690
|
+
var MAX_READ_BYTES = 512 * 1024;
|
|
8691
|
+
var MAX_SCRIPT_FILES = 400;
|
|
8692
|
+
var DEPLOY_STEPS = [
|
|
8693
|
+
/upload-google-play/i,
|
|
8694
|
+
/upload-testflight/i,
|
|
8695
|
+
/\baltool\b/i,
|
|
8696
|
+
/app-store-connect/i,
|
|
8697
|
+
/\baws\s+s3\s+sync\b/i,
|
|
8698
|
+
/\bwrangler\s+(pages\s+)?deploy\b/i,
|
|
8699
|
+
/cloudflare\/wrangler-action/i,
|
|
8700
|
+
/\bvercel\s+(deploy|--prod)\b/i,
|
|
8701
|
+
/\bsupabase\s+functions\s+deploy\b/i,
|
|
8702
|
+
/\bcapgo\b/i,
|
|
8703
|
+
/\beas\s+update\b/i,
|
|
8704
|
+
/\b(npm|pnpm|yarn)\s+publish\b/i,
|
|
8705
|
+
/\bchangeset\s+publish\b/i
|
|
8706
|
+
];
|
|
8707
|
+
var WRITES_FILE = /\b(writeFileSync|writeFile|createWriteStream|outputFileSync|outputFile|outputJsonSync|outputJson|writeJsonSync|writeJson|writeTextFile|write_text)\b/;
|
|
8708
|
+
function readCapped(root, path) {
|
|
8709
|
+
const f = readTextFileCapped(join6(root, path), MAX_READ_BYTES);
|
|
8710
|
+
return f.kind === "file" ? f.text : null;
|
|
8711
|
+
}
|
|
8712
|
+
function workspacePatterns(root, pkg) {
|
|
8713
|
+
const out = [];
|
|
8714
|
+
const ws = pkg?.workspaces;
|
|
8715
|
+
const list = Array.isArray(ws) ? ws : isObject2(ws) && Array.isArray(ws.packages) ? ws.packages : [];
|
|
8716
|
+
for (const p3 of list) if (typeof p3 === "string") out.push(p3);
|
|
8717
|
+
const yaml = readCapped(root, "pnpm-workspace.yaml");
|
|
8718
|
+
if (yaml) {
|
|
8719
|
+
let inPackages = false;
|
|
8720
|
+
for (const line of yaml.split(/\r?\n/)) {
|
|
8721
|
+
if (/^packages\s*:/.test(line)) {
|
|
8722
|
+
inPackages = true;
|
|
8723
|
+
continue;
|
|
8724
|
+
}
|
|
8725
|
+
if (/^\S/.test(line)) inPackages = false;
|
|
8726
|
+
const item = inPackages ? /^\s+-\s*["']?([^"'#]+?)["']?\s*(#.*)?$/.exec(line) : null;
|
|
8727
|
+
if (item) out.push(item[1]);
|
|
8728
|
+
}
|
|
8729
|
+
}
|
|
8730
|
+
return out.map((p3) => p3.trim().replace(/^\.\//, "").replace(/\/+$/, "")).filter(Boolean);
|
|
8731
|
+
}
|
|
8732
|
+
function scriptRunner(files) {
|
|
8733
|
+
if (files.has("pnpm-lock.yaml")) return "pnpm";
|
|
8734
|
+
if (files.has("yarn.lock")) return "yarn";
|
|
8735
|
+
if (files.has("bun.lockb") || files.has("bun.lock")) return "bun run";
|
|
8736
|
+
return "npm run";
|
|
8737
|
+
}
|
|
8738
|
+
function tokenOrigin(tokenPath, scripts, scriptFiles, runner) {
|
|
8739
|
+
const isCheck = (name, cmd) => /(^|\s)--check(\s|=|$)/.test(cmd) || /(^|:)check$/.test(name);
|
|
8740
|
+
const namesToken = (file) => {
|
|
8741
|
+
if (file.text.includes(tokenPath)) return true;
|
|
8742
|
+
const pkgDir = file.path.includes("/scripts/") ? file.path.slice(0, file.path.indexOf("/scripts/")) : "";
|
|
8743
|
+
return pkgDir !== "" && tokenPath.startsWith(`${pkgDir}/`) && file.text.includes(tokenPath.slice(pkgDir.length + 1));
|
|
8744
|
+
};
|
|
8745
|
+
const mentioning = scriptFiles.filter(namesToken);
|
|
8746
|
+
const writers = mentioning.filter((f) => WRITES_FILE.test(f.text));
|
|
8747
|
+
const runs = (cmd, file) => cmd.includes(file);
|
|
8748
|
+
let generator;
|
|
8749
|
+
let generated = false;
|
|
8750
|
+
for (const [name, cmd] of scripts) {
|
|
8751
|
+
if (isCheck(name, cmd)) continue;
|
|
8752
|
+
if (cmd.includes(tokenPath) || writers.some((w) => runs(cmd, w.path))) {
|
|
8753
|
+
generated = true;
|
|
8754
|
+
generator ??= `${runner} ${name}`;
|
|
8755
|
+
}
|
|
8756
|
+
}
|
|
8757
|
+
if (writers.length) {
|
|
8758
|
+
generated = true;
|
|
8759
|
+
if (!generator) {
|
|
8760
|
+
const w = writers[0].path;
|
|
8761
|
+
generator = /\.(m?js|cjs)$/.test(w) ? `node ${w}` : w;
|
|
8762
|
+
}
|
|
8763
|
+
}
|
|
8764
|
+
const checked = scripts.some(([name, cmd]) => isCheck(name, cmd) && (cmd.includes(tokenPath) || mentioning.some((f) => runs(cmd, f.path))));
|
|
8765
|
+
if (!generated && !checked) return { role: "source" };
|
|
8766
|
+
return generator && generator.length <= 200 ? { role: "export", generator } : { role: "export" };
|
|
8767
|
+
}
|
|
8639
8768
|
function starterManifest(root) {
|
|
8640
|
-
const
|
|
8769
|
+
const tracked = listRepoFiles2(root).map((e) => e.path);
|
|
8770
|
+
const files = tracked.length ? tracked : walk(root);
|
|
8771
|
+
const fileSet = new Set(files);
|
|
8641
8772
|
const pkg = readJson(join6(root, "package.json"));
|
|
8642
8773
|
const deps = { ...pkg?.dependencies ?? {}, ...pkg?.devDependencies ?? {} };
|
|
8774
|
+
const rootScripts = Object.entries(pkg?.scripts ?? {}).filter((e) => typeof e[1] === "string");
|
|
8643
8775
|
const native = files.some((f) => /^capacitor\.config\.(ts|js|json)$/.test(f)) || "expo" in deps || "react-native" in deps || files.some((f) => f.startsWith("android/") || f.startsWith("ios/"));
|
|
8644
8776
|
const platforms = ["web", ...files.some((f) => f.startsWith("android/")) || "expo" in deps ? ["android"] : [], ...files.some((f) => f.startsWith("ios/")) || "expo" in deps ? ["ios"] : []];
|
|
8645
|
-
const
|
|
8777
|
+
const archived = files.filter((f) => f.endsWith("/ARCHIVED.md")).map((f) => f.slice(0, -"/ARCHIVED.md".length));
|
|
8778
|
+
const isArchived = (f) => archived.some((d) => f.startsWith(`${d}/`));
|
|
8779
|
+
const live = (f) => !FIXTURE_DIR.test(f) && !isArchived(f);
|
|
8780
|
+
const tokenPaths = files.filter((f) => live(f) && (/\.tokens\.json$/.test(f) || /(^|\/)dtcg\/[^/]+\.json$/.test(f))).slice(0, 20);
|
|
8646
8781
|
const workflows = files.filter((f) => /^\.github\/workflows\/[^/]+\.ya?ml$/.test(f));
|
|
8647
|
-
const
|
|
8648
|
-
const
|
|
8649
|
-
const
|
|
8782
|
+
const hasSource = (dir, ext) => files.some((f) => f.startsWith(`${dir}/`) && live(f) && ext.test(f));
|
|
8783
|
+
const rootIsApp = files.some((f) => /^(next|vite)\.config\.(js|mjs|cjs|ts|mts)$/.test(f)) || "expo" in deps || rootScripts.some(([name]) => name === "dev" || name === "build");
|
|
8784
|
+
const rootDirs = rootIsApp ? ROOT_APP_DIRS.filter((d) => hasSource(d, /\.(ts|tsx|css)$/)) : [];
|
|
8785
|
+
const patterns = workspacePatterns(root, pkg);
|
|
8786
|
+
let packageRoots;
|
|
8787
|
+
if (patterns.length) {
|
|
8788
|
+
const include = patterns.filter((p3) => !p3.startsWith("!"));
|
|
8789
|
+
const exclude = patterns.filter((p3) => p3.startsWith("!")).map((p3) => p3.slice(1));
|
|
8790
|
+
const pkgDirs = [...new Set(files.filter((f) => f.endsWith("/package.json") && !f.includes("node_modules/")).map((f) => f.slice(0, -"/package.json".length)))];
|
|
8791
|
+
packageRoots = pkgDirs.filter((d) => !isArchived(`${d}/`) && include.some((p3) => matchGlob(d, p3)) && !exclude.some((p3) => matchGlob(d, p3))).sort().flatMap((d) => hasSource(`${d}/src`, /\.(tsx|css)$/) ? [`${d}/src`] : hasSource(d, /\.(tsx|css)$/) ? [d] : []);
|
|
8792
|
+
} else {
|
|
8793
|
+
packageRoots = [...new Set(files.filter((f) => live(f) && /^(apps|packages)\/[^/]+\/src\/.+\.(tsx|css)$/.test(f)).map((f) => f.split("/").slice(0, 3).join("/")))];
|
|
8794
|
+
}
|
|
8795
|
+
const scanRoots = [.../* @__PURE__ */ new Set([...rootDirs, ...packageRoots])].slice(0, MAX_LITERAL_GLOBS);
|
|
8796
|
+
const literalGlobs = scanRoots.length ? scanRoots.map((r) => `${r}/**/*.{ts,tsx,css}`) : ["src/**/*.{ts,tsx,css}", "app/**/*.{ts,tsx,css}"];
|
|
8797
|
+
const migrationsDir = files.find((f) => live(f) && /(^|\/)supabase\/migrations\/[^/]+\.sql$/.test(f))?.replace(/\/[^/]+$/, "");
|
|
8798
|
+
const tokens = tokenPaths.length ? (() => {
|
|
8799
|
+
const scriptFiles = files.filter((f) => live(f) && !f.includes("node_modules/") && /(^|\/)scripts\/.+\.(m?[jt]s|c[jt]s|py|sh)$/.test(f)).slice(0, MAX_SCRIPT_FILES).flatMap((path) => {
|
|
8800
|
+
const text2 = readCapped(root, path);
|
|
8801
|
+
return text2 === null ? [] : [{ path, text: text2 }];
|
|
8802
|
+
});
|
|
8803
|
+
const runner = scriptRunner(fileSet);
|
|
8804
|
+
return tokenPaths.map((path) => ({ path, ...tokenOrigin(path, rootScripts, scriptFiles, runner), format: "dtcg-2025.10" }));
|
|
8805
|
+
})() : [];
|
|
8650
8806
|
const manifest = {
|
|
8651
8807
|
version: 1,
|
|
8652
8808
|
app: { name: pkg?.name ?? root.split(/[\\/]/).pop(), kind: native ? "app" : "site", platforms }
|
|
8653
8809
|
};
|
|
8654
8810
|
if (tokens.length) {
|
|
8655
|
-
manifest.design = { tokens
|
|
8811
|
+
manifest.design = { tokens, literalScan: { globs: literalGlobs, ignore: ["**/*.test.*"] } };
|
|
8656
8812
|
}
|
|
8657
8813
|
if (migrationsDir) manifest.data = { provider: "supabase", migrationsDir };
|
|
8658
8814
|
if (workflows.length) {
|
|
@@ -8661,12 +8817,16 @@ function starterManifest(root) {
|
|
|
8661
8817
|
defaultBranch: gitDefaultBranch(root),
|
|
8662
8818
|
workflows: Object.fromEntries(workflows.map((w) => {
|
|
8663
8819
|
const name = w.slice(".github/workflows/".length);
|
|
8664
|
-
|
|
8820
|
+
const steps = (readCapped(root, w) ?? "").split(/\r?\n/).filter((l) => !/^\s*#/.test(l)).join("\n");
|
|
8821
|
+
const deploys = /^(deploy|publish|release)/.test(name) || DEPLOY_STEPS.some((re) => re.test(steps));
|
|
8822
|
+
return [name, { role: deploys ? "deploy" : "ci" }];
|
|
8665
8823
|
}))
|
|
8666
8824
|
};
|
|
8667
8825
|
}
|
|
8668
|
-
|
|
8669
|
-
manifest.
|
|
8826
|
+
const envExample = ENV_EXAMPLES.find((p3) => existsSync3(join6(root, p3)));
|
|
8827
|
+
if (envExample) manifest.env = { environments: ["production"], required: [], example: envExample };
|
|
8828
|
+
const sourceDirs = tokens.filter((t) => t.role === "source").map((t) => `${t.path.split("/").slice(0, -1).join("/") || "."}/**`);
|
|
8829
|
+
manifest.change = { allowPaths: [MANIFEST, ...new Set(sourceDirs)] };
|
|
8670
8830
|
return manifest;
|
|
8671
8831
|
}
|
|
8672
8832
|
function asStringList(v) {
|
package/dist/init.js
CHANGED
|
@@ -25,10 +25,10 @@ import {
|
|
|
25
25
|
saveConfig,
|
|
26
26
|
savedSdkKeyFor,
|
|
27
27
|
trySaveKeyToKeychain
|
|
28
|
-
} from "./chunk-
|
|
28
|
+
} from "./chunk-KQ6POXZH.js";
|
|
29
29
|
import {
|
|
30
30
|
MUSHI_CLI_VERSION
|
|
31
|
-
} from "./chunk-
|
|
31
|
+
} from "./chunk-JE3STWB2.js";
|
|
32
32
|
import {
|
|
33
33
|
FRAMEWORKS,
|
|
34
34
|
detectFramework,
|
|
@@ -2037,7 +2037,7 @@ async function maybeOfferConnect(credentials, options, _consoleBase) {
|
|
|
2037
2037
|
if (p.isCancel(answer) || !answer) return;
|
|
2038
2038
|
const endpoint = resolveCloudEndpoint(options.endpoint);
|
|
2039
2039
|
try {
|
|
2040
|
-
const { runConnect } = await import("./connect-
|
|
2040
|
+
const { runConnect } = await import("./connect-35YLLMGD.js");
|
|
2041
2041
|
const saved = loadConfig();
|
|
2042
2042
|
const result = await runConnect(
|
|
2043
2043
|
{
|
package/dist/version.d.ts
CHANGED
|
@@ -14,6 +14,6 @@ declare const MUSHI_CLI_VERSION: string;
|
|
|
14
14
|
* setup refreshes the pin. Synced to packages/mcp/package.json by
|
|
15
15
|
* `scripts/sync-mcp-pin.mjs` — never hand-edit the version.
|
|
16
16
|
*/
|
|
17
|
-
declare const MUSHI_MCP_PIN_SPEC = "@mushi-mushi/mcp@0.24.
|
|
17
|
+
declare const MUSHI_MCP_PIN_SPEC = "@mushi-mushi/mcp@0.24.1";
|
|
18
18
|
|
|
19
19
|
export { MUSHI_CLI_VERSION, MUSHI_MCP_PIN_SPEC };
|
package/dist/version.js
CHANGED
package/package.json
CHANGED
package/dist/chunk-F4EGZNKA.js
DELETED