@comergehq/cli 0.1.1 → 0.1.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/dist/cli.js +197 -110
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// src/cli.ts
|
|
4
4
|
import { Command } from "commander";
|
|
5
5
|
import pc10 from "picocolors";
|
|
6
|
+
import { createRequire } from "module";
|
|
6
7
|
|
|
7
8
|
// src/commands/shellInit.ts
|
|
8
9
|
import path5 from "path";
|
|
@@ -53,6 +54,7 @@ var STUDIO_PEERS = [
|
|
|
53
54
|
function buildShellPackageJson(params) {
|
|
54
55
|
const orig = params.original;
|
|
55
56
|
const warnings = [];
|
|
57
|
+
const info = [];
|
|
56
58
|
const dependencies = { ...orig.dependencies ?? {} };
|
|
57
59
|
const devDependencies = { ...orig.devDependencies ?? {} };
|
|
58
60
|
const main2 = "expo-router/entry";
|
|
@@ -65,7 +67,7 @@ function buildShellPackageJson(params) {
|
|
|
65
67
|
for (const dep of STUDIO_PEERS) {
|
|
66
68
|
if (dependencies[dep] || devDependencies[dep]) continue;
|
|
67
69
|
dependencies[dep] = "latest";
|
|
68
|
-
|
|
70
|
+
info.push(`Added missing peer dependency ${dep}@latest`);
|
|
69
71
|
}
|
|
70
72
|
const pkg = {
|
|
71
73
|
...orig,
|
|
@@ -82,13 +84,27 @@ function buildShellPackageJson(params) {
|
|
|
82
84
|
dependencies,
|
|
83
85
|
devDependencies
|
|
84
86
|
};
|
|
85
|
-
return { pkg, warnings };
|
|
87
|
+
return { pkg, warnings, info };
|
|
86
88
|
}
|
|
87
89
|
|
|
88
90
|
// src/lib/fs.ts
|
|
89
91
|
import fs2 from "fs/promises";
|
|
90
92
|
import path from "path";
|
|
91
93
|
import fse from "fs-extra";
|
|
94
|
+
async function findAvailableDirPath(preferredDir) {
|
|
95
|
+
const preferredExists = await fse.pathExists(preferredDir);
|
|
96
|
+
if (!preferredExists) return preferredDir;
|
|
97
|
+
const parent = path.dirname(preferredDir);
|
|
98
|
+
const base = path.basename(preferredDir);
|
|
99
|
+
for (let i = 2; i <= 1e3; i++) {
|
|
100
|
+
const candidate = path.join(parent, `${base}-${i}`);
|
|
101
|
+
if (!await fse.pathExists(candidate)) return candidate;
|
|
102
|
+
}
|
|
103
|
+
throw new CliError("Could not find an available output directory name", {
|
|
104
|
+
exitCode: 2,
|
|
105
|
+
hint: `Tried ${base}-2 through ${base}-1000 under ${parent}.`
|
|
106
|
+
});
|
|
107
|
+
}
|
|
92
108
|
async function ensureEmptyDir(dir) {
|
|
93
109
|
const exists2 = await fse.pathExists(dir);
|
|
94
110
|
if (exists2) {
|
|
@@ -258,6 +274,7 @@ function shouldExclude(relPath) {
|
|
|
258
274
|
const top = parts[0] ?? "";
|
|
259
275
|
if (!top) return false;
|
|
260
276
|
if (ALWAYS_EXCLUDE_DIRS.has(top)) return true;
|
|
277
|
+
if (top.startsWith("comerge-shell")) return true;
|
|
261
278
|
if (rel.startsWith("ios/build/") || rel === "ios/build") return true;
|
|
262
279
|
if (rel.startsWith("android/build/") || rel === "android/build") return true;
|
|
263
280
|
return false;
|
|
@@ -504,14 +521,14 @@ async function shellInit(params) {
|
|
|
504
521
|
exitCode: 2
|
|
505
522
|
});
|
|
506
523
|
}
|
|
507
|
-
const
|
|
524
|
+
const requestedOutputPath = path5.resolve(projectRoot, outDir);
|
|
525
|
+
const outputPath = await findAvailableDirPath(requestedOutputPath);
|
|
508
526
|
console.log(pc.dim(`Project: ${projectRoot}`));
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
});
|
|
527
|
+
if (outputPath !== requestedOutputPath) {
|
|
528
|
+
console.log(pc.dim(`Output: ${requestedOutputPath} (exists)`));
|
|
529
|
+
console.log(pc.dim(`Using: ${outputPath}`));
|
|
530
|
+
} else {
|
|
531
|
+
console.log(pc.dim(`Output: ${outputPath}`));
|
|
515
532
|
}
|
|
516
533
|
const outputIsInsideProject = outputPath === projectRoot || outputPath.startsWith(projectRoot + path5.sep);
|
|
517
534
|
const stagingPath = outputIsInsideProject ? await fs7.mkdtemp(path5.join(os.tmpdir(), "comerge-shell-")) : outputPath;
|
|
@@ -555,12 +572,13 @@ async function shellInit(params) {
|
|
|
555
572
|
) + "\n"
|
|
556
573
|
);
|
|
557
574
|
const originalPkg = await readPackageJson(stagingPath);
|
|
558
|
-
const { pkg: shellPkg, warnings } = buildShellPackageJson({
|
|
575
|
+
const { pkg: shellPkg, warnings, info } = buildShellPackageJson({
|
|
559
576
|
original: originalPkg,
|
|
560
577
|
studioVersion: params.studioVersion
|
|
561
578
|
});
|
|
562
579
|
await writeJsonAtomic(path5.join(stagingPath, "package.json"), shellPkg);
|
|
563
580
|
for (const w of warnings) console.log(pc.yellow(`Warning: ${w}`));
|
|
581
|
+
for (const i of info) console.log(pc.dim(`Info: ${i}`));
|
|
564
582
|
if (outputIsInsideProject) {
|
|
565
583
|
await fse4.move(stagingPath, outputPath, { overwrite: false });
|
|
566
584
|
movedToFinal = true;
|
|
@@ -574,9 +592,19 @@ async function shellInit(params) {
|
|
|
574
592
|
if (res.exitCode !== 0) {
|
|
575
593
|
throw new CliError("Dependency install failed", { exitCode: res.exitCode ?? 1 });
|
|
576
594
|
}
|
|
595
|
+
console.log(pc.dim("Running expo prebuild..."));
|
|
596
|
+
const prebuild = await execa("npx", ["expo", "prebuild"], { cwd: finalPath, stdio: "inherit" });
|
|
597
|
+
if (prebuild.exitCode !== 0) {
|
|
598
|
+
throw new CliError("expo prebuild failed", { exitCode: prebuild.exitCode ?? 1 });
|
|
599
|
+
}
|
|
577
600
|
}
|
|
578
601
|
console.log(pc.green("Shell app generated."));
|
|
579
|
-
|
|
602
|
+
const rel = path5.relative(process.cwd(), finalPath) || ".";
|
|
603
|
+
console.log(pc.dim(`Shell: ${rel}`));
|
|
604
|
+
console.log(pc.dim("Next steps:"));
|
|
605
|
+
console.log(pc.dim(` cd ${rel}`));
|
|
606
|
+
console.log(pc.dim(` npx expo run:ios`));
|
|
607
|
+
console.log(pc.dim(` npx expo run:android`));
|
|
580
608
|
} finally {
|
|
581
609
|
if (outputIsInsideProject && !movedToFinal) {
|
|
582
610
|
try {
|
|
@@ -598,7 +626,7 @@ async function ensureTextFile(filePath, contents) {
|
|
|
598
626
|
// src/commands/shell.ts
|
|
599
627
|
function registerShellCommands(program) {
|
|
600
628
|
const shell = program.command("shell").description("Shell app utilities");
|
|
601
|
-
shell.command("init").description("Generate an Expo Router shell app that renders Comerge Studio").option("--out <dir>", "Output directory", "comerge-shell").requiredOption("--app-id <uuid>", "Comerge appId (required)").requiredOption("--api-key <key>", "Comerge apiKey (required)").option("--app-key <key>", "Bundle app key (default MicroMain)", "MicroMain").option("--yes", "Non-interactive; use defaults", false).option("--install", "
|
|
629
|
+
shell.command("init").description("Generate an Expo Router shell app that renders Comerge Studio").option("--out <dir>", "Output directory", "comerge-shell").requiredOption("--app-id <uuid>", "Comerge appId (required)").requiredOption("--api-key <key>", "Comerge apiKey (required)").option("--app-key <key>", "Bundle app key (default MicroMain)", "MicroMain").option("--yes", "Non-interactive; use defaults", false).option("--no-install", "Skip dependency install + expo prebuild").option(
|
|
602
630
|
"--package-manager <pm>",
|
|
603
631
|
"Override package manager detection (pnpm|npm|yarn|bun)"
|
|
604
632
|
).option("--studio-version <ver>", "Version to use for @comergehq/studio", "latest").action(async (opts) => {
|
|
@@ -620,6 +648,57 @@ import pc2 from "picocolors";
|
|
|
620
648
|
|
|
621
649
|
// src/lib/config.ts
|
|
622
650
|
import { z } from "zod";
|
|
651
|
+
|
|
652
|
+
// src/lib/apiKey.ts
|
|
653
|
+
import prompts2 from "prompts";
|
|
654
|
+
function isInteractive() {
|
|
655
|
+
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
656
|
+
}
|
|
657
|
+
var cachedApiKey = null;
|
|
658
|
+
async function resolveStudioApiKey(params) {
|
|
659
|
+
if (cachedApiKey) return cachedApiKey;
|
|
660
|
+
const fromFlag = (params.flagApiKey ?? "").trim();
|
|
661
|
+
if (fromFlag) {
|
|
662
|
+
cachedApiKey = fromFlag;
|
|
663
|
+
return fromFlag;
|
|
664
|
+
}
|
|
665
|
+
const fromEnv = (process.env.COMERGE_API_KEY ?? "").trim();
|
|
666
|
+
if (fromEnv) {
|
|
667
|
+
cachedApiKey = fromEnv;
|
|
668
|
+
return fromEnv;
|
|
669
|
+
}
|
|
670
|
+
if (params.yes || !isInteractive()) {
|
|
671
|
+
throw new CliError("Missing required API Key", {
|
|
672
|
+
exitCode: 2,
|
|
673
|
+
hint: "Pass --api-key <pk_...> or set COMERGE_API_KEY."
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
const res = await prompts2(
|
|
677
|
+
[
|
|
678
|
+
{
|
|
679
|
+
type: "password",
|
|
680
|
+
name: "apiKey",
|
|
681
|
+
message: "API Key",
|
|
682
|
+
validate: (v) => String(v || "").trim().length > 0 ? true : "apiKey is required"
|
|
683
|
+
}
|
|
684
|
+
],
|
|
685
|
+
{
|
|
686
|
+
onCancel: () => {
|
|
687
|
+
throw new CliError("Cancelled", { exitCode: 130 });
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
);
|
|
691
|
+
const apiKey = String(res.apiKey ?? "").trim();
|
|
692
|
+
if (!apiKey) {
|
|
693
|
+
throw new CliError("Missing required API Key", { exitCode: 2 });
|
|
694
|
+
}
|
|
695
|
+
cachedApiKey = apiKey;
|
|
696
|
+
return apiKey;
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// src/lib/config.ts
|
|
700
|
+
var API_URL = "https://comerge.ai";
|
|
701
|
+
var CLIENT_KEY_HEADER = "x-comerge-api-key";
|
|
623
702
|
var urlSchema = z.string().min(1).transform((s) => s.trim()).refine((s) => {
|
|
624
703
|
try {
|
|
625
704
|
new URL(s);
|
|
@@ -633,43 +712,74 @@ var configSchema = z.object({
|
|
|
633
712
|
supabaseUrl: urlSchema,
|
|
634
713
|
supabaseAnonKey: z.string().min(1)
|
|
635
714
|
});
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
const
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
const missing = [];
|
|
655
|
-
if (!apiUrl) missing.push("COMERGE_API_URL");
|
|
656
|
-
if (!supabaseUrl) missing.push("COMERGE_SUPABASE_URL");
|
|
657
|
-
if (!supabaseAnonKey) missing.push("COMERGE_SUPABASE_ANON_KEY");
|
|
658
|
-
const hintLines = [];
|
|
659
|
-
hintLines.push("Set required environment variables:");
|
|
660
|
-
hintLines.push(` - COMERGE_API_URL`);
|
|
661
|
-
hintLines.push(` - COMERGE_SUPABASE_URL`);
|
|
662
|
-
hintLines.push(` - COMERGE_SUPABASE_ANON_KEY`);
|
|
663
|
-
throw new CliError("Missing or invalid CLI configuration", {
|
|
664
|
-
exitCode: 2,
|
|
665
|
-
hint: missing.length ? `${hintLines.join("\n")}
|
|
666
|
-
|
|
667
|
-
Missing: ${missing.join(", ")}` : `${hintLines.join("\n")}
|
|
668
|
-
|
|
669
|
-
Details: ${parsed.error.issues.map((i) => `${i.path.join(".") || "config"}: ${i.message}`).join("; ")}`
|
|
670
|
-
});
|
|
715
|
+
var studioConfigResponseSchema = z.object({
|
|
716
|
+
success: z.boolean(),
|
|
717
|
+
message: z.string(),
|
|
718
|
+
responseObject: z.object({
|
|
719
|
+
url: urlSchema,
|
|
720
|
+
anonKey: z.string().min(1)
|
|
721
|
+
}).optional(),
|
|
722
|
+
statusCode: z.number()
|
|
723
|
+
});
|
|
724
|
+
var cachedByApiKey = null;
|
|
725
|
+
var inFlight = null;
|
|
726
|
+
async function readJsonSafe(res) {
|
|
727
|
+
const ct = res.headers.get("content-type") ?? "";
|
|
728
|
+
if (!ct.toLowerCase().includes("application/json")) return null;
|
|
729
|
+
try {
|
|
730
|
+
return await res.json();
|
|
731
|
+
} catch {
|
|
732
|
+
return null;
|
|
671
733
|
}
|
|
672
|
-
|
|
734
|
+
}
|
|
735
|
+
async function resolveConfig(opts) {
|
|
736
|
+
const yes = Boolean(opts?.yes);
|
|
737
|
+
const apiKey = await resolveStudioApiKey({ flagApiKey: opts?.apiKey ?? null, yes });
|
|
738
|
+
if (cachedByApiKey?.apiKey === apiKey) return cachedByApiKey.cfg;
|
|
739
|
+
if (inFlight) return inFlight;
|
|
740
|
+
inFlight = (async () => {
|
|
741
|
+
const apiUrl = API_URL;
|
|
742
|
+
const url = new URL("/v1/public/studio-config", apiUrl).toString();
|
|
743
|
+
const res = await fetch(url, {
|
|
744
|
+
method: "GET",
|
|
745
|
+
headers: {
|
|
746
|
+
Accept: "application/json",
|
|
747
|
+
[CLIENT_KEY_HEADER]: apiKey
|
|
748
|
+
}
|
|
749
|
+
});
|
|
750
|
+
const body = await readJsonSafe(res);
|
|
751
|
+
if (!res.ok) {
|
|
752
|
+
const msg = (body && typeof body === "object" && body && "message" in body && typeof body.message === "string" ? body.message : null) ?? `Failed to fetch studio config (${res.status})`;
|
|
753
|
+
throw new CliError(msg, {
|
|
754
|
+
exitCode: 1,
|
|
755
|
+
hint: body ? JSON.stringify(body, null, 2) : "Check your API Key and backend connectivity."
|
|
756
|
+
});
|
|
757
|
+
}
|
|
758
|
+
const parsedResp = studioConfigResponseSchema.safeParse(body);
|
|
759
|
+
if (!parsedResp.success || !parsedResp.data.success || !parsedResp.data.responseObject) {
|
|
760
|
+
throw new CliError("Invalid studio-config response", {
|
|
761
|
+
exitCode: 1,
|
|
762
|
+
hint: body ? JSON.stringify(body, null, 2) : null
|
|
763
|
+
});
|
|
764
|
+
}
|
|
765
|
+
const cfgRaw = {
|
|
766
|
+
apiUrl,
|
|
767
|
+
supabaseUrl: parsedResp.data.responseObject.url,
|
|
768
|
+
supabaseAnonKey: parsedResp.data.responseObject.anonKey
|
|
769
|
+
};
|
|
770
|
+
const parsedCfg = configSchema.safeParse(cfgRaw);
|
|
771
|
+
if (!parsedCfg.success) {
|
|
772
|
+
throw new CliError("Invalid CLI configuration", {
|
|
773
|
+
exitCode: 1,
|
|
774
|
+
hint: parsedCfg.error.issues.map((i) => `${i.path.join(".") || "config"}: ${i.message}`).join("; ")
|
|
775
|
+
});
|
|
776
|
+
}
|
|
777
|
+
cachedByApiKey = { apiKey, cfg: parsedCfg.data };
|
|
778
|
+
return parsedCfg.data;
|
|
779
|
+
})().finally(() => {
|
|
780
|
+
inFlight = null;
|
|
781
|
+
});
|
|
782
|
+
return inFlight;
|
|
673
783
|
}
|
|
674
784
|
|
|
675
785
|
// src/lib/oauthCallbackServer.ts
|
|
@@ -969,7 +1079,7 @@ function shouldRefreshSoon(session, skewSeconds = 60) {
|
|
|
969
1079
|
const nowSec = Math.floor(Date.now() / 1e3);
|
|
970
1080
|
return session.expires_at <= nowSec + skewSeconds;
|
|
971
1081
|
}
|
|
972
|
-
async function
|
|
1082
|
+
async function readJsonSafe2(res) {
|
|
973
1083
|
const ct = res.headers.get("content-type") ?? "";
|
|
974
1084
|
if (!ct.toLowerCase().includes("application/json")) return null;
|
|
975
1085
|
try {
|
|
@@ -1002,7 +1112,7 @@ async function getAuthToken(config) {
|
|
|
1002
1112
|
return { token: session.access_token, session, fromEnv: false };
|
|
1003
1113
|
}
|
|
1004
1114
|
function createApiClient(config) {
|
|
1005
|
-
const cfg = config
|
|
1115
|
+
const cfg = config;
|
|
1006
1116
|
async function request(path10, init) {
|
|
1007
1117
|
const { token, session, fromEnv } = await getAuthToken(cfg);
|
|
1008
1118
|
const url = new URL(path10, cfg.apiUrl).toString();
|
|
@@ -1026,11 +1136,11 @@ function createApiClient(config) {
|
|
|
1026
1136
|
res = await doFetch(refreshed.access_token);
|
|
1027
1137
|
}
|
|
1028
1138
|
if (!res.ok) {
|
|
1029
|
-
const body = await
|
|
1139
|
+
const body = await readJsonSafe2(res);
|
|
1030
1140
|
const msg = (body && typeof body === "object" && body && "message" in body && typeof body.message === "string" ? body.message : null) ?? `Request failed (${res.status})`;
|
|
1031
1141
|
throw new CliError(msg, { exitCode: 1, hint: body ? JSON.stringify(body, null, 2) : null });
|
|
1032
1142
|
}
|
|
1033
|
-
const json = await
|
|
1143
|
+
const json = await readJsonSafe2(res);
|
|
1034
1144
|
return json ?? null;
|
|
1035
1145
|
}
|
|
1036
1146
|
return {
|
|
@@ -1043,8 +1153,11 @@ function createApiClient(config) {
|
|
|
1043
1153
|
|
|
1044
1154
|
// src/commands/login.ts
|
|
1045
1155
|
function registerLoginCommand(program) {
|
|
1046
|
-
program.command("login").description("Authenticate with Comerge").option("--no-browser", "Do not open browser automatically; print the URL").option("--port <port>", "Local callback port (default: random available port)").option("--json", "Output machine-readable JSON", false).action(async (opts) => {
|
|
1047
|
-
const config = resolveConfig(
|
|
1156
|
+
program.command("login").description("Authenticate with Comerge").option("--api-key <pk>", "API Key (or set COMERGE_API_KEY)").option("--no-browser", "Do not open browser automatically; print the URL").option("--port <port>", "Local callback port (default: random available port)").option("--yes", "Non-interactive; do not prompt", false).option("--json", "Output machine-readable JSON", false).action(async (opts) => {
|
|
1157
|
+
const config = await resolveConfig({
|
|
1158
|
+
apiKey: opts.apiKey ? String(opts.apiKey) : null,
|
|
1159
|
+
yes: Boolean(opts.yes)
|
|
1160
|
+
});
|
|
1048
1161
|
const portRaw = typeof opts.port === "string" ? opts.port.trim() : "";
|
|
1049
1162
|
let port = null;
|
|
1050
1163
|
if (portRaw) {
|
|
@@ -1118,8 +1231,11 @@ function registerLogoutCommand(program) {
|
|
|
1118
1231
|
// src/commands/whoami.ts
|
|
1119
1232
|
import pc4 from "picocolors";
|
|
1120
1233
|
function registerWhoamiCommand(program) {
|
|
1121
|
-
program.command("whoami").description("Show the currently authenticated Comerge user").option("--json", "Output machine-readable JSON", false).action(async (opts) => {
|
|
1122
|
-
const config = resolveConfig(
|
|
1234
|
+
program.command("whoami").description("Show the currently authenticated Comerge user").option("--api-key <pk>", "API Key (or set COMERGE_API_KEY)").option("--yes", "Non-interactive; do not prompt", false).option("--json", "Output machine-readable JSON", false).action(async (opts) => {
|
|
1235
|
+
const config = await resolveConfig({
|
|
1236
|
+
apiKey: opts.apiKey ? String(opts.apiKey) : null,
|
|
1237
|
+
yes: Boolean(opts.yes)
|
|
1238
|
+
});
|
|
1123
1239
|
const api = createApiClient(config);
|
|
1124
1240
|
const me = await api.getMe();
|
|
1125
1241
|
if (opts.json) {
|
|
@@ -1177,7 +1293,8 @@ var BUILTIN_IGNORES = [
|
|
|
1177
1293
|
"**/.next/**",
|
|
1178
1294
|
"**/ios/build/**",
|
|
1179
1295
|
"**/android/build/**",
|
|
1180
|
-
"**/.pnpm-store/**"
|
|
1296
|
+
"**/.pnpm-store/**",
|
|
1297
|
+
"**/comerge-shell*/**"
|
|
1181
1298
|
];
|
|
1182
1299
|
function normalizeRel2(p) {
|
|
1183
1300
|
return p.replace(/\\/g, "/").replace(/^\/+/, "");
|
|
@@ -1332,6 +1449,7 @@ ${text}`.trim() || null
|
|
|
1332
1449
|
|
|
1333
1450
|
// src/lib/importLocal.ts
|
|
1334
1451
|
var SAFE_PATH_RE = /^[A-Za-z0-9._/-]+$/;
|
|
1452
|
+
var COMERGE_SHELL_SEGMENT_RE = /(^|\/)comerge-shell[^/]*(\/|$)/;
|
|
1335
1453
|
function sleep(ms) {
|
|
1336
1454
|
return new Promise((r) => setTimeout(r, ms));
|
|
1337
1455
|
}
|
|
@@ -1368,7 +1486,7 @@ function getAppStatus(appResp) {
|
|
|
1368
1486
|
return { status, statusError };
|
|
1369
1487
|
}
|
|
1370
1488
|
async function importLocal(params) {
|
|
1371
|
-
const cfg = resolveConfig();
|
|
1489
|
+
const cfg = await resolveConfig({ apiKey: params.apiKey ?? null, yes: Boolean(params.yes) });
|
|
1372
1490
|
const api = createApiClient(cfg);
|
|
1373
1491
|
const projectRoot = await findExpoProjectRoot(process.cwd());
|
|
1374
1492
|
const subdir = validateOptionalSubdir(params.subdir);
|
|
@@ -1384,7 +1502,7 @@ async function importLocal(params) {
|
|
|
1384
1502
|
const useGit = await canUseGit(projectRoot);
|
|
1385
1503
|
if (useGit) {
|
|
1386
1504
|
const gitPaths = await listFilesGit({ cwd: projectRoot, pathspec: subdir ?? null });
|
|
1387
|
-
files = gitPaths;
|
|
1505
|
+
files = gitPaths.filter((p) => !COMERGE_SHELL_SEGMENT_RE.test(p.replace(/\\/g, "/")));
|
|
1388
1506
|
if (!params.includeDotenv) {
|
|
1389
1507
|
files = files.filter((p) => !path9.posix.basename(p).startsWith(".env"));
|
|
1390
1508
|
}
|
|
@@ -1490,12 +1608,14 @@ async function importLocal(params) {
|
|
|
1490
1608
|
// src/commands/import.ts
|
|
1491
1609
|
function registerImportCommands(program) {
|
|
1492
1610
|
const imp = program.command("import").description("Import source code into Comerge");
|
|
1493
|
-
imp.command("local").description("Import the current local Expo project").option("--name <appName>", "Override app name (default: derived from Expo config / folder name)").option("--path <subdir>", "Optional subdirectory to import").option("--max-wait <sec>", "Max time to wait for import to finish (default: 1200)", "1200").option("--json", "Output machine-readable JSON", false).option("--no-wait", "Do not poll for completion; return immediately after enqueue", false).option("--no-include-dotenv", "Exclude .env* files from the uploaded archive", false).option("--dry-run", "Show what would be uploaded (no upload)", false).action(async (opts) => {
|
|
1611
|
+
imp.command("local").description("Import the current local Expo project").option("--api-key <pk>", "API Key (or set COMERGE_API_KEY)").option("--yes", "Non-interactive; do not prompt", false).option("--name <appName>", "Override app name (default: derived from Expo config / folder name)").option("--path <subdir>", "Optional subdirectory to import").option("--max-wait <sec>", "Max time to wait for import to finish (default: 1200)", "1200").option("--json", "Output machine-readable JSON", false).option("--no-wait", "Do not poll for completion; return immediately after enqueue", false).option("--no-include-dotenv", "Exclude .env* files from the uploaded archive", false).option("--dry-run", "Show what would be uploaded (no upload)", false).action(async (opts) => {
|
|
1494
1612
|
const maxWaitSec = Number(String(opts.maxWait ?? "1200").trim());
|
|
1495
1613
|
if (!Number.isFinite(maxWaitSec) || maxWaitSec <= 0) {
|
|
1496
1614
|
throw new CliError("Invalid --max-wait", { exitCode: 2, hint: "Example: --max-wait 1200" });
|
|
1497
1615
|
}
|
|
1498
1616
|
const res = await importLocal({
|
|
1617
|
+
apiKey: opts.apiKey ? String(opts.apiKey) : null,
|
|
1618
|
+
yes: Boolean(opts.yes),
|
|
1499
1619
|
appName: opts.name ? String(opts.name) : null,
|
|
1500
1620
|
subdir: opts.path ? String(opts.path) : null,
|
|
1501
1621
|
maxWaitMs: Math.floor(maxWaitSec * 1e3),
|
|
@@ -1523,11 +1643,11 @@ import pc8 from "picocolors";
|
|
|
1523
1643
|
|
|
1524
1644
|
// src/lib/ensureAuth.ts
|
|
1525
1645
|
import pc7 from "picocolors";
|
|
1526
|
-
function
|
|
1646
|
+
function isInteractive2() {
|
|
1527
1647
|
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
1528
1648
|
}
|
|
1529
|
-
async function validateBackendSession() {
|
|
1530
|
-
const cfg = resolveConfig();
|
|
1649
|
+
async function validateBackendSession(params) {
|
|
1650
|
+
const cfg = await resolveConfig({ apiKey: params?.apiKey ?? null, yes: Boolean(params?.yes) });
|
|
1531
1651
|
const api = createApiClient(cfg);
|
|
1532
1652
|
await api.getMe();
|
|
1533
1653
|
}
|
|
@@ -1537,12 +1657,12 @@ async function ensureAuth(params) {
|
|
|
1537
1657
|
const existing = await getSession();
|
|
1538
1658
|
if (existing) {
|
|
1539
1659
|
try {
|
|
1540
|
-
await validateBackendSession();
|
|
1660
|
+
await validateBackendSession({ apiKey: params?.apiKey ?? null, yes: params?.yes });
|
|
1541
1661
|
return;
|
|
1542
1662
|
} catch {
|
|
1543
1663
|
}
|
|
1544
1664
|
}
|
|
1545
|
-
const interactive =
|
|
1665
|
+
const interactive = isInteractive2();
|
|
1546
1666
|
const yes = Boolean(params?.yes);
|
|
1547
1667
|
if (!interactive || yes) {
|
|
1548
1668
|
throw new CliError("Not logged in", {
|
|
@@ -1550,7 +1670,7 @@ async function ensureAuth(params) {
|
|
|
1550
1670
|
hint: "Run `comerge login` first, or set COMERGE_ACCESS_TOKEN for CI."
|
|
1551
1671
|
});
|
|
1552
1672
|
}
|
|
1553
|
-
const cfg = resolveConfig();
|
|
1673
|
+
const cfg = await resolveConfig({ apiKey: params?.apiKey ?? null, yes: Boolean(params?.yes) });
|
|
1554
1674
|
const server = await startOAuthCallbackServer({ port: null });
|
|
1555
1675
|
try {
|
|
1556
1676
|
const supabase = createSupabaseAuthHelpers(cfg);
|
|
@@ -1569,7 +1689,7 @@ ${url}`);
|
|
|
1569
1689
|
const session = await supabase.exchangeCode({ code });
|
|
1570
1690
|
await setSession(session);
|
|
1571
1691
|
try {
|
|
1572
|
-
await validateBackendSession();
|
|
1692
|
+
await validateBackendSession({ apiKey: params?.apiKey ?? null, yes: params?.yes });
|
|
1573
1693
|
} catch (err) {
|
|
1574
1694
|
await clearSession().catch(() => {
|
|
1575
1695
|
});
|
|
@@ -1580,48 +1700,12 @@ ${url}`);
|
|
|
1580
1700
|
}
|
|
1581
1701
|
}
|
|
1582
1702
|
|
|
1583
|
-
// src/lib/apiKey.ts
|
|
1584
|
-
import prompts2 from "prompts";
|
|
1585
|
-
function isInteractive2() {
|
|
1586
|
-
return Boolean(process.stdin.isTTY && process.stdout.isTTY);
|
|
1587
|
-
}
|
|
1588
|
-
async function resolveStudioApiKey(params) {
|
|
1589
|
-
const fromFlag = (params.flagApiKey ?? "").trim();
|
|
1590
|
-
if (fromFlag) return fromFlag;
|
|
1591
|
-
const fromEnv = (process.env.COMERGE_STUDIO_API_KEY ?? "").trim();
|
|
1592
|
-
if (fromEnv) return fromEnv;
|
|
1593
|
-
if (params.yes || !isInteractive2()) {
|
|
1594
|
-
throw new CliError("Missing required Studio API key", {
|
|
1595
|
-
exitCode: 2,
|
|
1596
|
-
hint: "Pass --api-key <pk_...> or set COMERGE_STUDIO_API_KEY."
|
|
1597
|
-
});
|
|
1598
|
-
}
|
|
1599
|
-
const res = await prompts2(
|
|
1600
|
-
[
|
|
1601
|
-
{
|
|
1602
|
-
type: "password",
|
|
1603
|
-
name: "apiKey",
|
|
1604
|
-
message: "Studio API key",
|
|
1605
|
-
validate: (v) => String(v || "").trim().length > 0 ? true : "apiKey is required"
|
|
1606
|
-
}
|
|
1607
|
-
],
|
|
1608
|
-
{
|
|
1609
|
-
onCancel: () => {
|
|
1610
|
-
throw new CliError("Cancelled", { exitCode: 130 });
|
|
1611
|
-
}
|
|
1612
|
-
}
|
|
1613
|
-
);
|
|
1614
|
-
const apiKey = String(res.apiKey ?? "").trim();
|
|
1615
|
-
if (!apiKey) {
|
|
1616
|
-
throw new CliError("Missing required Studio API key", { exitCode: 2 });
|
|
1617
|
-
}
|
|
1618
|
-
return apiKey;
|
|
1619
|
-
}
|
|
1620
|
-
|
|
1621
1703
|
// src/lib/initLocal.ts
|
|
1622
1704
|
async function initLocal(params) {
|
|
1623
1705
|
if (params.dryRun) {
|
|
1624
1706
|
const res = await importLocal({
|
|
1707
|
+
apiKey: params.apiKey,
|
|
1708
|
+
yes: params.yes,
|
|
1625
1709
|
appName: params.appName,
|
|
1626
1710
|
subdir: params.subdir,
|
|
1627
1711
|
maxWaitMs: params.maxWaitMs,
|
|
@@ -1640,11 +1724,13 @@ async function initLocal(params) {
|
|
|
1640
1724
|
noWait: params.noWait
|
|
1641
1725
|
};
|
|
1642
1726
|
}
|
|
1643
|
-
await ensureAuth({ yes: params.yes, json: params.json });
|
|
1644
1727
|
const apiKey = await resolveStudioApiKey({ flagApiKey: params.apiKey, yes: params.yes });
|
|
1728
|
+
await ensureAuth({ apiKey, yes: params.yes, json: params.json });
|
|
1645
1729
|
const appKey = String(params.appKey || "MicroMain").trim() || "MicroMain";
|
|
1646
1730
|
if (!params.json) console.log(pc8.dim("Importing project..."));
|
|
1647
1731
|
const imported = await importLocal({
|
|
1732
|
+
apiKey,
|
|
1733
|
+
yes: params.yes,
|
|
1648
1734
|
appName: params.appName,
|
|
1649
1735
|
subdir: params.subdir,
|
|
1650
1736
|
maxWaitMs: params.maxWaitMs,
|
|
@@ -1677,8 +1763,8 @@ async function initLocal(params) {
|
|
|
1677
1763
|
|
|
1678
1764
|
// src/commands/init.ts
|
|
1679
1765
|
function registerInitCommands(program) {
|
|
1680
|
-
const init = program.command("init").description("
|
|
1681
|
-
init.command("local").description("Login if needed, import the local Expo project, then generate the shell wrapper").option("--api-key <pk>", "
|
|
1766
|
+
const init = program.command("init").description("Import to Comerge + generate shell wrapper");
|
|
1767
|
+
init.command("local").description("Login if needed, import the local Expo project, then generate the shell wrapper").option("--api-key <pk>", "API Key (or set COMERGE_API_KEY)").option("--app-key <key>", "Bundle app key", "MicroMain").option("--out <dir>", "Output directory for shell wrapper", "comerge-shell").option("--no-install", "Skip dependency install + expo prebuild in generated shell").option("--package-manager <pm>", "Override package manager detection (pnpm|npm|yarn|bun)").option("--studio-version <ver>", "Version to use for @comergehq/studio", "latest").option("--name <appName>", "Override imported app name").option("--path <subdir>", "Optional subdirectory to import").option("--max-wait <sec>", "Max time to wait for import to finish (default: 1200)", "1200").option("--no-wait", "Do not poll for completion; generate shell immediately", false).option("--no-include-dotenv", "Exclude .env* files from the uploaded archive").option("--dry-run", "Show what would be uploaded (no login/import/shell)", false).option("--yes", "Non-interactive; do not prompt", false).option("--json", "Output machine-readable JSON", false).action(async (opts) => {
|
|
1682
1768
|
const maxWaitSec = Number(String(opts.maxWait ?? "1200").trim());
|
|
1683
1769
|
if (!Number.isFinite(maxWaitSec) || maxWaitSec <= 0) {
|
|
1684
1770
|
throw new CliError("Invalid --max-wait", { exitCode: 2, hint: "Example: --max-wait 1200" });
|
|
@@ -1704,16 +1790,17 @@ function registerInitCommands(program) {
|
|
|
1704
1790
|
return;
|
|
1705
1791
|
}
|
|
1706
1792
|
console.log(pc9.green(`Done. appId=${res.appId}`));
|
|
1707
|
-
console.log(pc9.dim(`Shell: ${res.shellOutDir}`));
|
|
1708
1793
|
if (res.status) console.log(pc9.dim(`Status: ${res.status}`));
|
|
1709
1794
|
if (res.noWait) console.log(pc9.yellow("Note: --no-wait was used; bundles may still be building."));
|
|
1710
1795
|
});
|
|
1711
1796
|
}
|
|
1712
1797
|
|
|
1713
1798
|
// src/cli.ts
|
|
1799
|
+
var require2 = createRequire(import.meta.url);
|
|
1800
|
+
var { version } = require2("../package.json");
|
|
1714
1801
|
async function main(argv) {
|
|
1715
1802
|
const program = new Command();
|
|
1716
|
-
program.name("comerge").description("Comerge CLI").version(
|
|
1803
|
+
program.name("comerge").description("Comerge CLI").version(version);
|
|
1717
1804
|
registerShellCommands(program);
|
|
1718
1805
|
registerLoginCommand(program);
|
|
1719
1806
|
registerWhoamiCommand(program);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/commands/shellInit.ts","../src/lib/errors.ts","../src/lib/packageJson.ts","../src/lib/fs.ts","../src/lib/projectDetect.ts","../src/lib/templates.ts","../src/lib/packageManager.ts","../src/lib/copyProject.ts","../src/lib/stripProject.ts","../src/lib/appJsonPatch.ts","../src/lib/reanimated.ts","../src/commands/shell.ts","../src/commands/login.ts","../src/lib/config.ts","../src/lib/oauthCallbackServer.ts","../src/lib/browser.ts","../src/lib/supabase.ts","../src/lib/sessionStore.ts","../src/lib/api.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/import.ts","../src/lib/importLocal.ts","../src/lib/gitFiles.ts","../src/lib/fileSelection.ts","../src/lib/zip.ts","../src/lib/upload.ts","../src/commands/init.ts","../src/lib/initLocal.ts","../src/lib/ensureAuth.ts","../src/lib/apiKey.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\n\nimport { registerShellCommands } from \"./commands/shell.js\";\nimport { registerLoginCommand } from \"./commands/login.js\";\nimport { registerLogoutCommand } from \"./commands/logout.js\";\nimport { registerWhoamiCommand } from \"./commands/whoami.js\";\nimport { registerImportCommands } from \"./commands/import.js\";\nimport { registerInitCommands } from \"./commands/init.js\";\nimport { CliError } from \"./lib/errors.js\";\n\nexport async function main(argv: string[]) {\n const program = new Command();\n program\n .name(\"comerge\")\n .description(\"Comerge CLI\")\n .version(\"0.1.0\");\n\n registerShellCommands(program);\n registerLoginCommand(program);\n registerWhoamiCommand(program);\n registerLogoutCommand(program);\n registerImportCommands(program);\n registerInitCommands(program);\n\n program.configureOutput({\n outputError: (str, write) => write(pc.red(str)),\n });\n\n try {\n await program.parseAsync(argv);\n } catch (err) {\n const e = err as unknown;\n if (e instanceof CliError) {\n console.error(pc.red(`Error: ${e.message}`));\n if (e.hint) console.error(pc.dim(e.hint));\n process.exitCode = e.exitCode;\n return;\n }\n console.error(pc.red(`Unexpected error: ${(e as Error)?.message ?? String(e)}`));\n process.exitCode = 1;\n }\n}\n\nvoid main(process.argv);\n\n\n","import path from \"node:path\";\nimport os from \"node:os\";\n\nimport pc from \"picocolors\";\nimport prompts from \"prompts\";\nimport fse from \"fs-extra\";\n\nimport { CliError } from \"../lib/errors.js\";\nimport { readPackageJson, buildShellPackageJson } from \"../lib/packageJson.js\";\nimport { ensureEmptyDir, writeJsonAtomic, writeTextAtomic } from \"../lib/fs.js\";\nimport { findExpoProjectRoot } from \"../lib/projectDetect.js\";\nimport { shellBabelConfigJs, shellIndexTsx, shellLayoutTsx, shellMetroConfigJs } from \"../lib/templates.js\";\nimport { detectPackageManager, installCommand, type PackageManager } from \"../lib/packageManager.js\";\nimport { execa } from \"execa\";\nimport { copyProject } from \"../lib/copyProject.js\";\nimport { stripProject } from \"../lib/stripProject.js\";\nimport fs from \"node:fs/promises\";\nimport { ensureComergeShellPlugins } from \"../lib/appJsonPatch.js\";\nimport { ensureReanimatedBabelPlugin } from \"../lib/reanimated.js\";\n\nexport type ShellInitParams = {\n outDir: string;\n appId: string;\n apiKey: string;\n appKey: string;\n yes: boolean;\n install: boolean;\n packageManager: string | null;\n studioVersion: string;\n};\n\nexport async function shellInit(params: ShellInitParams): Promise<void> {\n const projectRoot = await findExpoProjectRoot(process.cwd());\n const outDirDefault = params.outDir || \"comerge-shell\";\n\n let outDir = outDirDefault;\n let appId = params.appId ?? \"\";\n let apiKey = params.apiKey ?? \"\";\n let appKey = params.appKey ?? \"MicroMain\";\n\n if (!params.yes) {\n const res = await prompts(\n [\n {\n type: \"text\",\n name: \"outDir\",\n message: \"Output directory\",\n initial: outDir,\n },\n {\n type: \"text\",\n name: \"appKey\",\n message: \"App key\",\n initial: appKey,\n },\n {\n type: \"text\",\n name: \"appId\",\n message: \"Comerge appId\",\n initial: appId,\n validate: (value: string) => (String(value || \"\").trim().length > 0 ? true : \"appId is required\"),\n },\n {\n type: \"password\",\n name: \"apiKey\",\n message: \"Comerge apiKey\",\n initial: apiKey,\n validate: (value: string) => (String(value || \"\").trim().length > 0 ? true : \"apiKey is required\"),\n },\n ],\n {\n onCancel: () => {\n throw new CliError(\"Cancelled\", { exitCode: 130 });\n },\n },\n );\n outDir = String(res.outDir || outDir);\n appKey = String(res.appKey || appKey);\n appId = String(res.appId || appId);\n apiKey = String(res.apiKey || apiKey);\n }\n\n appId = String(appId || \"\").trim();\n apiKey = String(apiKey || \"\").trim();\n if (!appId) {\n throw new CliError(\"Missing required appId\", {\n hint: \"Pass --app-id <uuid> (or omit --yes to be prompted).\",\n exitCode: 2,\n });\n }\n if (!apiKey) {\n throw new CliError(\"Missing required apiKey\", {\n hint: \"Pass --api-key <key> (or omit --yes to be prompted).\",\n exitCode: 2,\n });\n }\n\n const outputPath = path.resolve(projectRoot, outDir);\n console.log(pc.dim(`Project: ${projectRoot}`));\n console.log(pc.dim(`Output: ${outputPath}`));\n\n if (await fse.pathExists(outputPath)) {\n throw new CliError(\"Output directory already exists\", {\n hint: `Delete ${outputPath} or choose a different --out path.`,\n exitCode: 2,\n });\n }\n\n // If output is under project root, stage in a temp dir then move into place.\n const outputIsInsideProject =\n outputPath === projectRoot || outputPath.startsWith(projectRoot + path.sep);\n const stagingPath = outputIsInsideProject\n ? await fs.mkdtemp(path.join(os.tmpdir(), \"comerge-shell-\"))\n : outputPath;\n\n let movedToFinal = false;\n try {\n if (!outputIsInsideProject) {\n await ensureEmptyDir(stagingPath);\n }\n\n await copyProject({ projectRoot, outRoot: stagingPath });\n\n await stripProject({ outRoot: stagingPath });\n\n try {\n const didPatch = await ensureComergeShellPlugins(path.join(stagingPath, \"app.json\"));\n if (didPatch) {\n console.log(pc.dim(\"Patched app.json to include required Comerge shell plugins.\"));\n }\n } catch {}\n\n await writeJsonAtomic(path.join(stagingPath, \"comerge.config.json\"), {\n appId,\n appKey: appKey || \"MicroMain\",\n apiKey,\n });\n\n await writeTextAtomic(path.join(stagingPath, \"app/_layout.tsx\"), shellLayoutTsx());\n await writeTextAtomic(path.join(stagingPath, \"app/index.tsx\"), shellIndexTsx());\n await ensureTextFile(path.join(stagingPath, \"babel.config.js\"), shellBabelConfigJs());\n await ensureTextFile(path.join(stagingPath, \"metro.config.js\"), shellMetroConfigJs());\n try {\n const didPatch = await ensureReanimatedBabelPlugin(path.join(stagingPath, \"babel.config.js\"));\n if (didPatch) console.log(pc.dim(\"Patched babel.config.js to include react-native-reanimated/plugin.\"));\n } catch {}\n await ensureTextFile(\n path.join(stagingPath, \"tsconfig.json\"),\n JSON.stringify(\n {\n extends: \"expo/tsconfig.base\",\n compilerOptions: { strict: true, resolveJsonModule: true },\n },\n null,\n 2,\n ) + \"\\n\",\n );\n\n const originalPkg = await readPackageJson(stagingPath);\n const { pkg: shellPkg, warnings } = buildShellPackageJson({\n original: originalPkg,\n studioVersion: params.studioVersion,\n });\n await writeJsonAtomic(path.join(stagingPath, \"package.json\"), shellPkg);\n\n for (const w of warnings) console.log(pc.yellow(`Warning: ${w}`));\n\n if (outputIsInsideProject) {\n await fse.move(stagingPath, outputPath, { overwrite: false });\n movedToFinal = true;\n }\n\n const finalPath = outputIsInsideProject ? outputPath : stagingPath;\n\n if (params.install) {\n const pm =\n (params.packageManager as PackageManager | null) ?? (await detectPackageManager(projectRoot));\n const { cmd, args } = installCommand(pm);\n console.log(pc.dim(`Installing deps with ${cmd}...`));\n const res = await execa(cmd, args, { cwd: finalPath, stdio: \"inherit\" });\n if (res.exitCode !== 0) {\n throw new CliError(\"Dependency install failed\", { exitCode: res.exitCode ?? 1 });\n }\n }\n\n console.log(pc.green(\"Shell app generated.\"));\n console.log(pc.dim(`Next: cd ${path.relative(process.cwd(), finalPath)} && (install deps) && expo prebuild`));\n } finally {\n if (outputIsInsideProject && !movedToFinal) {\n try {\n await fse.remove(stagingPath);\n } catch {}\n }\n }\n}\n\nasync function ensureTextFile(filePath: string, contents: string): Promise<void> {\n try {\n await fs.access(filePath);\n return;\n } catch {\n }\n await writeTextAtomic(filePath, contents);\n}\n\n\n","export class CliError extends Error {\n public readonly exitCode: number;\n public readonly hint: string | null;\n\n constructor(message: string, opts?: { exitCode?: number; hint?: string | null }) {\n super(message);\n this.name = \"CliError\";\n this.exitCode = opts?.exitCode ?? 1;\n this.hint = opts?.hint ?? null;\n }\n}\n\n\n","import fs from \"node:fs/promises\";\n\nimport { CliError } from \"./errors.js\";\n\nexport type PackageJson = {\n name?: string;\n version?: string;\n private?: boolean;\n main?: string;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\nexport async function readPackageJson(projectRoot: string): Promise<PackageJson> {\n const raw = await fs.readFile(`${projectRoot}/package.json`, \"utf8\").catch(() => null);\n if (!raw) {\n throw new CliError(\"package.json not found\", { exitCode: 2 });\n }\n try {\n return JSON.parse(raw) as PackageJson;\n } catch {\n throw new CliError(\"Failed to parse package.json\", { exitCode: 2 });\n }\n}\n\nconst STUDIO_PEERS = [\n \"@callstack/liquid-glass\",\n \"@supabase/supabase-js\",\n \"@gorhom/bottom-sheet\",\n \"expo-file-system\",\n \"expo-haptics\",\n \"expo-linear-gradient\",\n \"lucide-react-native\",\n \"react-native-gesture-handler\",\n \"react-native-reanimated\",\n \"react-native-safe-area-context\",\n \"react-native-svg\",\n \"react-native-view-shot\",\n] as const;\n\nexport function buildShellPackageJson(params: {\n original: PackageJson;\n studioVersion: string;\n}): { pkg: PackageJson; warnings: string[] } {\n const orig = params.original;\n const warnings: string[] = [];\n\n const dependencies: Record<string, string> = { ...(orig.dependencies ?? {}) };\n const devDependencies: Record<string, string> = { ...(orig.devDependencies ?? {}) };\n\n const main = \"expo-router/entry\";\n\n dependencies[\"@comergehq/studio\"] = params.studioVersion || \"latest\";\n dependencies[\"@comergehq/runtime\"] = params.studioVersion || \"latest\";\n\n if (!dependencies[\"expo-router\"] && !devDependencies[\"expo-router\"]) {\n dependencies[\"expo-router\"] = \"latest\";\n warnings.push(\"Added missing dependency expo-router@latest\");\n }\n\n for (const dep of STUDIO_PEERS) {\n if (dependencies[dep] || devDependencies[dep]) continue;\n dependencies[dep] = \"latest\";\n warnings.push(`Added missing peer dependency ${dep}@latest`);\n }\n\n const pkg: PackageJson = {\n ...orig,\n name: orig.name ? `${orig.name}-comerge-shell` : \"comerge-shell\",\n private: true,\n main,\n scripts: {\n dev: \"expo start -c\",\n ios: \"expo start -c --ios\",\n android: \"expo start -c --android\",\n web: \"expo start -c --web\",\n ...(orig.scripts ?? {}),\n },\n dependencies,\n devDependencies,\n };\n\n return { pkg, warnings };\n}\n\n\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport fse from \"fs-extra\";\n\nimport { CliError } from \"./errors.js\";\n\nexport async function ensureEmptyDir(dir: string): Promise<void> {\n const exists = await fse.pathExists(dir);\n if (exists) {\n throw new CliError(\"Output directory already exists\", {\n hint: `Choose a new --out directory or delete: ${dir}`,\n exitCode: 2,\n });\n }\n await fse.mkdirp(dir);\n}\n\nexport async function writeJsonAtomic(filePath: string, value: unknown): Promise<void> {\n const dir = path.dirname(filePath);\n await fse.mkdirp(dir);\n const tmp = `${filePath}.tmp-${Date.now()}`;\n await fs.writeFile(tmp, JSON.stringify(value, null, 2) + \"\\n\", \"utf8\");\n await fs.rename(tmp, filePath);\n}\n\nexport async function writeTextAtomic(filePath: string, contents: string): Promise<void> {\n const dir = path.dirname(filePath);\n await fse.mkdirp(dir);\n const tmp = `${filePath}.tmp-${Date.now()}`;\n await fs.writeFile(tmp, contents, \"utf8\");\n await fs.rename(tmp, filePath);\n}\n\n\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { CliError } from \"./errors.js\";\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n const st = await fs.stat(p);\n return st.isFile();\n } catch {\n return false;\n }\n}\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const st = await fs.stat(p);\n return st.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function findExpoProjectRoot(startDir: string): Promise<string> {\n let cur = path.resolve(startDir);\n while (true) {\n const pkg = path.join(cur, \"package.json\");\n if (await fileExists(pkg)) {\n const hasAppJson = await fileExists(path.join(cur, \"app.json\"));\n const hasAppConfig = await fileExists(path.join(cur, \"app.config.js\")) || await fileExists(path.join(cur, \"app.config.ts\"));\n if (!hasAppJson && !hasAppConfig) {\n } else {\n return cur;\n }\n }\n\n const parent = path.dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n\n throw new CliError(\"Not inside an Expo project\", {\n hint: \"Run this command from the root of your Expo project repository.\",\n exitCode: 2,\n });\n}\n\nexport async function requireAssetsDir(projectRoot: string): Promise<void> {\n const assets = path.join(projectRoot, \"assets\");\n if (!(await dirExists(assets))) {\n throw new CliError(\"Expected an assets/ directory in the project root\", {\n hint: `Create ${assets} or adjust the CLI to support alternate assets paths.`,\n exitCode: 2,\n });\n }\n}\n\n\n","export function shellLayoutTsx(): string {\n return `import { Stack } from 'expo-router';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\n\nexport default function Layout() {\n return (\n <GestureHandlerRootView style={{ flex: 1 }}>\n <Stack screenOptions={{ headerShown: false }} />\n </GestureHandlerRootView>\n );\n}\n`;\n}\n\nexport function shellIndexTsx(): string {\n return `import * as React from 'react';\nimport { View } from 'react-native';\nimport { Stack } from 'expo-router';\nimport { ComergeStudio } from '@comergehq/studio';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport config from '../comerge.config.json';\n\nexport default function Index() {\n const appId = String((config as any)?.appId || '');\n const appKey = String((config as any)?.appKey || 'MicroMain');\n const apiKey = String((config as any)?.apiKey || '');\n return (\n <>\n <Stack.Screen options={{ headerShown: false }} />\n <View style={{ flex: 1 }}>\n {appId ? <ComergeStudio appId={appId} apiKey={apiKey} appKey={appKey} /> : null}\n </View>\n </>\n );\n}\n`;\n}\n\nexport function shellBabelConfigJs(): string {\n return `module.exports = function (api) {\n api.cache(true);\n return {\n presets: ['babel-preset-expo'],\n plugins: ['react-native-reanimated/plugin'],\n };\n};\n`;\n}\n\nexport function shellMetroConfigJs(): string {\n return `const { getDefaultConfig } = require('expo/metro-config');\n\nconst config = getDefaultConfig(__dirname);\n\nmodule.exports = config;\n`;\n}\n\n\n","import fs from \"node:fs/promises\";\n\nexport type PackageManager = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\n\nasync function exists(p: string): Promise<boolean> {\n try {\n await fs.stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectPackageManager(projectRoot: string): Promise<PackageManager> {\n if (await exists(`${projectRoot}/pnpm-lock.yaml`)) return \"pnpm\";\n if (await exists(`${projectRoot}/yarn.lock`)) return \"yarn\";\n if (await exists(`${projectRoot}/package-lock.json`)) return \"npm\";\n if (await exists(`${projectRoot}/bun.lockb`)) return \"bun\";\n return \"npm\";\n}\n\nexport function installCommand(pm: PackageManager): { cmd: string; args: string[] } {\n switch (pm) {\n case \"pnpm\":\n return { cmd: \"pnpm\", args: [\"install\"] };\n case \"yarn\":\n return { cmd: \"yarn\", args: [\"install\"] };\n case \"bun\":\n return { cmd: \"bun\", args: [\"install\"] };\n case \"npm\":\n default:\n return { cmd: \"npm\", args: [\"install\"] };\n }\n}\n\n\n","import path from \"node:path\";\n\nimport fse from \"fs-extra\";\n\nimport { CliError } from \"./errors.js\";\n\nconst ALWAYS_EXCLUDE_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \".expo\",\n \"dist\",\n \"build\",\n]);\n\nfunction normalizeRel(relPath: string): string {\n return relPath.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nfunction shouldExclude(relPath: string): boolean {\n const rel = normalizeRel(relPath);\n const parts = rel.split(\"/\").filter(Boolean);\n const top = parts[0] ?? \"\";\n\n if (!top) return false;\n if (ALWAYS_EXCLUDE_DIRS.has(top)) return true;\n\n if (rel.startsWith(\"ios/build/\") || rel === \"ios/build\") return true;\n if (rel.startsWith(\"android/build/\") || rel === \"android/build\") return true;\n\n return false;\n}\n\nexport async function copyProject(params: { projectRoot: string; outRoot: string }): Promise<void> {\n const src = path.resolve(params.projectRoot);\n const dest = path.resolve(params.outRoot);\n\n const srcExists = await fse.pathExists(src);\n if (!srcExists) {\n throw new CliError(\"Project root does not exist\", { exitCode: 2 });\n }\n\n await fse.copy(src, dest, {\n dereference: true,\n preserveTimestamps: true,\n filter: (srcPath) => {\n const rel = path.relative(src, srcPath);\n if (!rel) return true;\n return !shouldExclude(rel);\n },\n });\n}\n\n\n","import path from \"node:path\";\n\nimport fse from \"fs-extra\";\n\nexport const DEFAULT_STRIP_DIRS = [\"app\", \"src\", \"components\", \"lib\", \"hooks\", \"providers\"] as const;\n\nexport async function stripProject(params: { outRoot: string; dirs?: readonly string[] }): Promise<void> {\n const dirs = params.dirs ?? DEFAULT_STRIP_DIRS;\n await Promise.all(\n dirs.map(async (d) => {\n const p = path.join(params.outRoot, d);\n const exists = await fse.pathExists(p);\n if (!exists) return;\n await fse.remove(p);\n }),\n );\n}\n\n\n","import fs from \"node:fs/promises\";\n\nimport { CliError } from \"./errors.js\";\n\ntype AppJson = { expo?: any };\n\nfunction pluginName(entry: any): string | null {\n if (Array.isArray(entry)) return typeof entry[0] === \"string\" ? entry[0] : null;\n return typeof entry === \"string\" ? entry : null;\n}\n\nexport async function ensureComergeShellPlugins(appJsonPath: string): Promise<boolean> {\n let raw: string;\n try {\n raw = await fs.readFile(appJsonPath, \"utf8\");\n } catch {\n return false;\n }\n let parsed: AppJson;\n try {\n parsed = JSON.parse(raw) as AppJson;\n } catch {\n throw new CliError(\"Failed to parse app.json in generated shell\", { exitCode: 2 });\n }\n\n const expo = parsed.expo;\n if (!expo || typeof expo !== \"object\") return false;\n\n const plugins = Array.isArray(expo.plugins) ? [...expo.plugins] : [];\n const routerEntry = plugins.find((p) => pluginName(p) === \"expo-router\");\n const runtimeEntry = plugins.find((p) => pluginName(p) === \"@comergehq/runtime\");\n const needsRouter = !routerEntry;\n const needsRuntime = !runtimeEntry;\n if (!needsRouter && !needsRuntime) return false;\n\n const rest = plugins.filter((p) => {\n const name = pluginName(p);\n return name !== \"expo-router\" && name !== \"@comergehq/runtime\";\n });\n\n expo.plugins = [routerEntry ?? \"expo-router\", runtimeEntry ?? \"@comergehq/runtime\", ...rest];\n await fs.writeFile(appJsonPath, JSON.stringify({ expo }, null, 2) + \"\\n\", \"utf8\");\n return true;\n}\n\n\n","import fs from \"node:fs/promises\";\n\nexport async function ensureReanimatedBabelPlugin(babelConfigPath: string): Promise<boolean> {\n const raw = await fs.readFile(babelConfigPath, \"utf8\").catch(() => null);\n if (!raw) return false;\n if (raw.includes(\"react-native-reanimated/plugin\")) return false;\n\n const patched = patchBabelConfigAddReanimatedPlugin(raw);\n if (patched === raw) return false;\n\n await fs.writeFile(babelConfigPath, patched, \"utf8\");\n return true;\n}\n\nfunction patchBabelConfigAddReanimatedPlugin(raw: string): string {\n const pluginsMatch = /(^|\\n)([ \\t]*)plugins\\s*:\\s*\\[/m.exec(raw);\n if (pluginsMatch) {\n const matchIdx = pluginsMatch.index + pluginsMatch[1].length;\n const indent = pluginsMatch[2] ?? \"\";\n const bracketIdx = raw.indexOf(\"[\", matchIdx);\n if (bracketIdx >= 0) {\n const closeIdx = findMatchingBracket(raw, bracketIdx, \"[\", \"]\");\n if (closeIdx >= 0) {\n const inner = raw.slice(bracketIdx + 1, closeIdx);\n const innerTrim = inner.trim();\n const innerTrimEnd = inner.replace(/[ \\t\\r\\n]+$/g, \"\");\n const elementIndent = indent + \" \";\n let insert = \"\";\n if (!innerTrim) {\n insert = `\\n${elementIndent}'react-native-reanimated/plugin'\\n${indent}`;\n } else if (innerTrimEnd.endsWith(\",\")) {\n insert = `\\n${elementIndent}'react-native-reanimated/plugin'`;\n } else {\n insert = `,\\n${elementIndent}'react-native-reanimated/plugin'`;\n }\n return raw.slice(0, closeIdx) + insert + raw.slice(closeIdx);\n }\n }\n }\n\n const presetsMatch = /(^|\\n)([ \\t]*)presets\\s*:\\s*\\[[^\\]]*\\]\\s*,?/m.exec(raw);\n if (presetsMatch) {\n const indent = presetsMatch[2] ?? \"\";\n const insertAt = presetsMatch.index + presetsMatch[0].length;\n const insertion = `\\n${indent}// Required by react-native-reanimated. Must be listed last.\\n${indent}plugins: ['react-native-reanimated/plugin'],`;\n return raw.slice(0, insertAt) + insertion + raw.slice(insertAt);\n }\n\n return raw;\n}\n\nfunction findMatchingBracket(text: string, openIdx: number, open: string, close: string): number {\n let depth = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let inLineComment = false;\n let inBlockComment = false;\n\n for (let i = openIdx; i < text.length; i++) {\n const ch = text[i]!;\n const next = text[i + 1];\n\n if (inLineComment) {\n if (ch === \"\\n\") inLineComment = false;\n continue;\n }\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (!inSingle && !inDouble && !inTemplate) {\n if (ch === \"/\" && next === \"/\") {\n inLineComment = true;\n i++;\n continue;\n }\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n }\n\n if (!inDouble && !inTemplate && ch === \"'\" && text[i - 1] !== \"\\\\\") {\n inSingle = !inSingle;\n continue;\n }\n if (!inSingle && !inTemplate && ch === `\"` && text[i - 1] !== \"\\\\\") {\n inDouble = !inDouble;\n continue;\n }\n if (!inSingle && !inDouble && ch === \"`\" && text[i - 1] !== \"\\\\\") {\n inTemplate = !inTemplate;\n continue;\n }\n if (inSingle || inDouble || inTemplate) continue;\n\n if (ch === open) depth++;\n if (ch === close) {\n depth--;\n if (depth === 0) return i;\n }\n }\n return -1;\n}\n\n\n","import type { Command } from \"commander\";\n\nimport { shellInit } from \"./shellInit.js\";\n\nexport function registerShellCommands(program: Command) {\n const shell = program.command(\"shell\").description(\"Shell app utilities\");\n\n shell\n .command(\"init\")\n .description(\"Generate an Expo Router shell app that renders Comerge Studio\")\n .option(\"--out <dir>\", \"Output directory\", \"comerge-shell\")\n .requiredOption(\"--app-id <uuid>\", \"Comerge appId (required)\")\n .requiredOption(\"--api-key <key>\", \"Comerge apiKey (required)\")\n .option(\"--app-key <key>\", \"Bundle app key (default MicroMain)\", \"MicroMain\")\n .option(\"--yes\", \"Non-interactive; use defaults\", false)\n .option(\"--install\", \"Install dependencies in the generated shell folder\", false)\n .option(\n \"--package-manager <pm>\",\n \"Override package manager detection (pnpm|npm|yarn|bun)\",\n )\n .option(\"--studio-version <ver>\", \"Version to use for @comergehq/studio\", \"latest\")\n .action(async (opts) => {\n await shellInit({\n outDir: String(opts.out),\n appId: String(opts.appId ?? \"\"),\n apiKey: String(opts.apiKey ?? \"\"),\n appKey: String(opts.appKey ?? \"MicroMain\"),\n yes: Boolean(opts.yes),\n install: Boolean(opts.install),\n packageManager: opts.packageManager ? String(opts.packageManager) : null,\n studioVersion: String(opts.studioVersion ?? \"latest\"),\n });\n });\n}\n\n\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\n\nimport { CliError } from \"../lib/errors.js\";\nimport { resolveConfig } from \"../lib/config.js\";\nimport { startOAuthCallbackServer } from \"../lib/oauthCallbackServer.js\";\nimport { openBrowser } from \"../lib/browser.js\";\nimport { createSupabaseAuthHelpers } from \"../lib/supabase.js\";\nimport { clearSession, setSession } from \"../lib/sessionStore.js\";\nimport { createApiClient } from \"../lib/api.js\";\n\nexport function registerLoginCommand(program: Command) {\n program\n .command(\"login\")\n .description(\"Authenticate with Comerge\")\n .option(\"--no-browser\", \"Do not open browser automatically; print the URL\")\n .option(\"--port <port>\", \"Local callback port (default: random available port)\")\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .action(async (opts) => {\n const config = resolveConfig();\n const portRaw = typeof opts.port === \"string\" ? opts.port.trim() : \"\";\n let port: number | null = null;\n if (portRaw) {\n const parsed = Number(portRaw);\n if (!Number.isFinite(parsed) || parsed <= 0 || !Number.isInteger(parsed)) {\n throw new CliError(\"Invalid --port\", { exitCode: 2, hint: \"Example: --port 8085\" });\n }\n port = parsed;\n }\n\n const server = await startOAuthCallbackServer({ port });\n try {\n const supabase = createSupabaseAuthHelpers(config);\n const { url } = await supabase.startGoogleLogin({ redirectTo: server.redirectTo });\n\n const shouldOpenBrowser = Boolean((opts as any).browser ?? true);\n if (shouldOpenBrowser) {\n try {\n await openBrowser(url);\n console.log(pc.dim(\"Opened browser for login...\"));\n } catch (err) {\n console.error(pc.yellow(\"Could not open the browser automatically.\"));\n console.error(pc.dim((err as Error)?.message ?? String(err)));\n console.log(`Open this URL manually:\\n${url}`);\n }\n } else {\n console.log(`Open this URL to login:\\n${url}`);\n }\n\n const code = await server.waitForCode();\n const session = await supabase.exchangeCode({ code });\n await setSession(session);\n\n let me: unknown = null;\n try {\n const api = createApiClient(config);\n me = await api.getMe();\n } catch (err) {\n await clearSession().catch(() => {});\n throw err;\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, me }, null, 2));\n } else {\n const profile = (me as any)?.responseObject as { id?: string; email?: string | null } | undefined;\n const label = profile?.email ? `${profile.email}` : profile?.id ? `user ${profile.id}` : \"user\";\n console.log(pc.green(`Logged in as ${label}.`));\n }\n } finally {\n await server.close();\n }\n });\n}\n\n\n","import { z } from \"zod\";\n\nimport { CliError } from \"./errors.js\";\n\nconst urlSchema = z\n .string()\n .min(1)\n .transform((s) => s.trim())\n .refine((s) => {\n try {\n new URL(s);\n return true;\n } catch {\n return false;\n }\n }, \"Invalid URL\")\n .transform((s) => s.replace(/\\/+$/, \"\"));\n\nconst configSchema = z.object({\n apiUrl: urlSchema,\n supabaseUrl: urlSchema,\n supabaseAnonKey: z.string().min(1),\n});\n\nexport type CliConfig = z.infer<typeof configSchema>;\n\nexport type ResolveConfigOptions = {\n \n};\n\nfunction pickEnv(names: string[]): string | undefined {\n for (const n of names) {\n const v = process.env[n];\n if (typeof v === \"string\" && v.trim().length > 0) return v;\n }\n return undefined;\n}\n\nexport function resolveConfig(opts?: ResolveConfigOptions): CliConfig {\n void opts;\n\n const apiUrl = pickEnv([\"COMERGE_API_URL\"]);\n const supabaseUrl = pickEnv([\"COMERGE_SUPABASE_URL\"]);\n const supabaseAnonKey = pickEnv([\"COMERGE_SUPABASE_ANON_KEY\"]);\n\n const parsed = configSchema.safeParse({\n apiUrl,\n supabaseUrl,\n supabaseAnonKey,\n });\n\n if (!parsed.success) {\n const missing: string[] = [];\n if (!apiUrl) missing.push(\"COMERGE_API_URL\");\n if (!supabaseUrl) missing.push(\"COMERGE_SUPABASE_URL\");\n if (!supabaseAnonKey) missing.push(\"COMERGE_SUPABASE_ANON_KEY\");\n\n const hintLines: string[] = [];\n hintLines.push(\"Set required environment variables:\");\n hintLines.push(` - COMERGE_API_URL`);\n hintLines.push(` - COMERGE_SUPABASE_URL`);\n hintLines.push(` - COMERGE_SUPABASE_ANON_KEY`);\n\n throw new CliError(\"Missing or invalid CLI configuration\", {\n exitCode: 2,\n hint: missing.length\n ? `${hintLines.join(\"\\n\")}\\n\\nMissing: ${missing.join(\", \")}`\n : `${hintLines.join(\"\\n\")}\\n\\nDetails: ${parsed.error.issues\n .map((i) => `${i.path.join(\".\") || \"config\"}: ${i.message}`)\n .join(\"; \")}`,\n });\n }\n\n return parsed.data;\n}\n\n\n","import http from \"node:http\";\n\nimport { CliError } from \"./errors.js\";\n\nexport type OAuthCallbackServer = {\n redirectTo: string;\n waitForCode(): Promise<string>;\n close(): Promise<void>;\n};\n\nexport async function startOAuthCallbackServer(params?: {\n port?: number | null;\n timeoutMs?: number;\n}): Promise<OAuthCallbackServer> {\n const timeoutMs = params?.timeoutMs ?? 3 * 60_000;\n const requestedPort = params?.port ?? null;\n\n let resolveCode: ((code: string) => void) | null = null;\n let rejectCode: ((err: unknown) => void) | null = null;\n const codePromise = new Promise<string>((resolve, reject) => {\n resolveCode = resolve;\n rejectCode = reject;\n });\n\n const server = http.createServer((req, res) => {\n try {\n const base = `http://127.0.0.1`;\n const u = new URL(req.url ?? \"/\", base);\n const errorDescription = u.searchParams.get(\"error_description\");\n const error = u.searchParams.get(\"error\");\n const code = u.searchParams.get(\"code\");\n\n if (errorDescription || error) {\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(`<html><body><h3>Login failed</h3><p>${escapeHtml(errorDescription ?? error ?? \"Unknown error\")}</p></body></html>`);\n rejectCode?.(new CliError(\"Login failed\", { exitCode: 1, hint: errorDescription ?? error ?? undefined }));\n return;\n }\n\n if (!code) {\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(`<html><body><h3>Missing code</h3><p>No authorization code was provided.</p></body></html>`);\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\n `<html><body><h3>Login complete</h3><p>You can close this tab and return to the terminal.</p></body></html>`,\n );\n resolveCode?.(code);\n } catch (err) {\n rejectCode?.(err);\n res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Internal error\");\n } finally {\n try {\n server.close();\n } catch {}\n }\n });\n\n const listenPort = typeof requestedPort === \"number\" ? requestedPort : 0;\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(listenPort, \"127.0.0.1\", () => resolve());\n });\n\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n server.close();\n throw new CliError(\"Failed to start callback server\", { exitCode: 1 });\n }\n\n const redirectTo = `http://127.0.0.1:${addr.port}/callback`;\n\n const timeout = setTimeout(() => {\n rejectCode?.(\n new CliError(\"Login timed out\", {\n exitCode: 1,\n hint: \"Try running `comerge login` again.\",\n }),\n );\n try {\n server.close();\n } catch {}\n }, timeoutMs).unref();\n\n const waitForCode = async () => {\n try {\n return await codePromise;\n } finally {\n clearTimeout(timeout);\n }\n };\n\n const close = async () => {\n clearTimeout(timeout);\n await new Promise<void>((resolve) => server.close(() => resolve())).catch(() => {});\n };\n\n return { redirectTo, waitForCode, close };\n}\n\nfunction escapeHtml(input: string): string {\n return input\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n\n","import { execa } from \"execa\";\n\nimport { CliError } from \"./errors.js\";\n\nexport async function openBrowser(url: string): Promise<void> {\n const platform = process.platform;\n\n try {\n if (platform === \"darwin\") {\n await execa(\"open\", [url], { stdio: \"ignore\" });\n return;\n }\n if (platform === \"win32\") {\n await execa(\"cmd\", [\"/c\", \"start\", \"\", url], { stdio: \"ignore\", windowsHide: true });\n return;\n }\n await execa(\"xdg-open\", [url], { stdio: \"ignore\" });\n } catch (err) {\n throw new CliError(\"Failed to open browser automatically\", {\n exitCode: 1,\n hint: `Open this URL manually:\\n${url}\\n\\n${(err as Error)?.message ?? String(err)}`,\n });\n }\n}\n\n\n","import { createClient, type Session, type SupabaseClient } from \"@supabase/supabase-js\";\n\nimport type { CliConfig } from \"./config.js\";\nimport { CliError } from \"./errors.js\";\nimport type { StoredSession } from \"./sessionStore.js\";\n\ntype StorageLike = {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n};\n\nexport type SupabaseAuthHelpers = {\n startGoogleLogin(params: { redirectTo: string }): Promise<{ url: string }>;\n exchangeCode(params: { code: string }): Promise<StoredSession>;\n refreshWithStoredSession(params: { session: StoredSession }): Promise<StoredSession>;\n};\n\nfunction createInMemoryStorage(): StorageLike {\n const map = new Map<string, string>();\n return {\n getItem: (k) => map.get(k) ?? null,\n setItem: (k, v) => {\n map.set(k, v);\n },\n removeItem: (k) => {\n map.delete(k);\n },\n };\n}\n\nfunction createSupabaseClient(config: CliConfig, storage: StorageLike): SupabaseClient {\n return createClient(config.supabaseUrl, config.supabaseAnonKey, {\n auth: {\n flowType: \"pkce\",\n persistSession: false,\n autoRefreshToken: false,\n detectSessionInUrl: false,\n storage,\n },\n global: {\n headers: {\n \"X-Requested-By\": \"comerge-cli\",\n },\n },\n });\n}\n\nfunction toStoredSession(session: Session): StoredSession {\n if (!session.access_token || !session.refresh_token || !session.expires_at) {\n throw new CliError(\"Supabase session missing required fields\", { exitCode: 1 });\n }\n return {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_at: session.expires_at,\n token_type: session.token_type ?? undefined,\n user: session.user ? { id: session.user.id, email: (session.user.email ?? null) as any } : undefined,\n };\n}\n\nexport function createSupabaseAuthHelpers(config: CliConfig): SupabaseAuthHelpers {\n const storage = createInMemoryStorage();\n const supabase = createSupabaseClient(config, storage);\n\n return {\n async startGoogleLogin(params: { redirectTo: string }) {\n const { data, error } = await supabase.auth.signInWithOAuth({\n provider: \"google\",\n options: {\n redirectTo: params.redirectTo,\n skipBrowserRedirect: true,\n queryParams: {\n access_type: \"offline\",\n prompt: \"consent\",\n },\n },\n });\n if (error) throw error;\n if (!data?.url) throw new CliError(\"Supabase did not return an OAuth URL\", { exitCode: 1 });\n return { url: data.url };\n },\n\n async exchangeCode(params: { code: string }) {\n const { data, error } = await supabase.auth.exchangeCodeForSession(params.code);\n if (error) throw error;\n if (!data?.session) throw new CliError(\"No session returned from Supabase\", { exitCode: 1 });\n return toStoredSession(data.session);\n },\n\n async refreshWithStoredSession(params: { session: StoredSession }) {\n const { data, error } = await supabase.auth.setSession({\n access_token: params.session.access_token,\n refresh_token: params.session.refresh_token,\n });\n if (error) throw error;\n if (!data?.session) throw new CliError(\"No session returned after refresh\", { exitCode: 1 });\n return toStoredSession(data.session);\n },\n };\n}\n\n\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { CliError } from \"./errors.js\";\nimport { writeJsonAtomic } from \"./fs.js\";\n\nconst storedSessionSchema = z.object({\n access_token: z.string().min(1),\n refresh_token: z.string().min(1),\n expires_at: z.number().int().positive(),\n token_type: z.string().min(1).optional(),\n user: z\n .object({\n id: z.string().min(1),\n email: z.string().email().optional().nullable(),\n })\n .optional(),\n});\n\nexport type StoredSession = z.infer<typeof storedSessionSchema>;\n\nconst KEYTAR_SERVICE = \"comerge-cli\";\nconst KEYTAR_ACCOUNT = \"default\";\n\nfunction xdgConfigHome(): string {\n const v = process.env.XDG_CONFIG_HOME;\n if (typeof v === \"string\" && v.trim().length > 0) return v;\n return path.join(os.homedir(), \".config\");\n}\n\nfunction sessionFilePath(): string {\n return path.join(xdgConfigHome(), \"comerge\", \"session.json\");\n}\n\nasync function maybeLoadKeytar(): Promise<{\n getPassword(service: string, account: string): Promise<string | null>;\n setPassword(service: string, account: string, password: string): Promise<void>;\n deletePassword(service: string, account: string): Promise<boolean>;\n} | null> {\n try {\n const mod: any = await import(\"keytar\");\n const candidates = [mod?.default, mod].filter(Boolean);\n for (const c of candidates) {\n if (\n c &&\n typeof c.getPassword === \"function\" &&\n typeof c.setPassword === \"function\" &&\n typeof c.deletePassword === \"function\"\n ) {\n return c;\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n\nasync function ensurePathPermissions(filePath: string): Promise<void> {\n const dir = path.dirname(filePath);\n await fs.mkdir(dir, { recursive: true });\n try {\n await fs.chmod(dir, 0o700);\n } catch {}\n try {\n await fs.chmod(filePath, 0o600);\n } catch {}\n}\n\nexport async function getSession(): Promise<StoredSession | null> {\n const keytar = await maybeLoadKeytar();\n if (keytar) {\n const raw = await keytar.getPassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT);\n if (!raw) return null;\n try {\n const parsed = storedSessionSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) return null;\n return parsed.data;\n } catch {\n return null;\n }\n }\n\n const fp = sessionFilePath();\n const raw = await fs.readFile(fp, \"utf8\").catch(() => null);\n if (!raw) return null;\n try {\n const parsed = storedSessionSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) return null;\n await ensurePathPermissions(fp);\n return parsed.data;\n } catch {\n return null;\n }\n}\n\nexport async function setSession(session: StoredSession): Promise<void> {\n const parsed = storedSessionSchema.safeParse(session);\n if (!parsed.success) {\n throw new CliError(\"Refusing to store invalid session\", { exitCode: 1 });\n }\n\n const keytar = await maybeLoadKeytar();\n if (keytar) {\n await keytar.setPassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT, JSON.stringify(parsed.data));\n return;\n }\n\n const fp = sessionFilePath();\n await writeJsonAtomic(fp, parsed.data);\n await ensurePathPermissions(fp);\n}\n\nexport async function clearSession(): Promise<void> {\n const keytar = await maybeLoadKeytar();\n if (keytar) {\n await keytar.deletePassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT);\n return;\n }\n const fp = sessionFilePath();\n await fs.rm(fp, { force: true }).catch(() => {});\n}\n\n\n","import { CliError } from \"./errors.js\";\nimport type { CliConfig } from \"./config.js\";\nimport { resolveConfig } from \"./config.js\";\nimport { getSession, setSession, type StoredSession } from \"./sessionStore.js\";\nimport { createSupabaseAuthHelpers } from \"./supabase.js\";\n\ntype Json = Record<string, unknown> | unknown[] | string | number | boolean | null;\n\nfunction shouldRefreshSoon(session: StoredSession, skewSeconds = 60): boolean {\n const nowSec = Math.floor(Date.now() / 1000);\n return session.expires_at <= nowSec + skewSeconds;\n}\n\nasync function readJsonSafe(res: Response): Promise<Json | null> {\n const ct = res.headers.get(\"content-type\") ?? \"\";\n if (!ct.toLowerCase().includes(\"application/json\")) return null;\n try {\n return (await res.json()) as Json;\n } catch {\n return null;\n }\n}\n\nasync function getAuthToken(config: CliConfig): Promise<{ token: string; session: StoredSession | null; fromEnv: boolean }> {\n const envToken = process.env.COMERGE_ACCESS_TOKEN;\n if (typeof envToken === \"string\" && envToken.trim().length > 0) {\n return { token: envToken.trim(), session: null, fromEnv: true };\n }\n\n let session = await getSession();\n if (!session) {\n throw new CliError(\"Not logged in\", {\n exitCode: 2,\n hint: \"Run `comerge login` first, or set COMERGE_ACCESS_TOKEN for CI.\",\n });\n }\n\n if (shouldRefreshSoon(session)) {\n try {\n const supabase = createSupabaseAuthHelpers(config);\n session = await supabase.refreshWithStoredSession({ session });\n await setSession(session);\n } catch (err) {\n void err;\n }\n }\n\n return { token: session.access_token, session, fromEnv: false };\n}\n\nexport type ApiClient = {\n getMe(): Promise<Json>;\n getApp(appId: string): Promise<Json>;\n presignImportUpload(payload: { file: { name: string; mimeType: string; size: number; checksumSha256?: string } }): Promise<Json>;\n importFromUpload(payload: { uploadId: string; appName?: string; threadId?: string; path?: string }): Promise<Json>;\n};\n\nexport function createApiClient(config?: CliConfig): ApiClient {\n const cfg = config ?? resolveConfig();\n\n async function request(path: string, init?: RequestInit): Promise<Json> {\n const { token, session, fromEnv } = await getAuthToken(cfg);\n const url = new URL(path, cfg.apiUrl).toString();\n\n const doFetch = async (bearer: string) => {\n const res = await fetch(url, {\n ...init,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n ...(init?.headers ?? {}),\n Authorization: `Bearer ${bearer}`,\n },\n });\n return res;\n };\n\n let res = await doFetch(token);\n if (res.status === 401 && !fromEnv && session?.refresh_token) {\n const supabase = createSupabaseAuthHelpers(cfg);\n const refreshed = await supabase.refreshWithStoredSession({ session });\n await setSession(refreshed);\n res = await doFetch(refreshed.access_token);\n }\n\n if (!res.ok) {\n const body = await readJsonSafe(res);\n const msg =\n (body && typeof body === \"object\" && body && \"message\" in body && typeof (body as any).message === \"string\"\n ? (body as any).message\n : null) ?? `Request failed (${res.status})`;\n throw new CliError(msg, { exitCode: 1, hint: body ? JSON.stringify(body, null, 2) : null });\n }\n\n const json = await readJsonSafe(res);\n return json ?? null;\n }\n\n return {\n getMe: () => request(\"/v1/me\", { method: \"GET\" }),\n getApp: (appId: string) => request(`/v1/apps/${encodeURIComponent(appId)}`, { method: \"GET\" }),\n presignImportUpload: (payload) =>\n request(\"/v1/apps/import/upload/presign\", { method: \"POST\", body: JSON.stringify(payload) }),\n importFromUpload: (payload) => request(\"/v1/apps/import/upload\", { method: \"POST\", body: JSON.stringify(payload) }),\n };\n}\n\n\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\n\nimport { clearSession } from \"../lib/sessionStore.js\";\n\nexport function registerLogoutCommand(program: Command) {\n program\n .command(\"logout\")\n .description(\"Clear local Comerge authentication session\")\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .action(async (opts) => {\n await clearSession();\n const envToken = process.env.COMERGE_ACCESS_TOKEN;\n if (opts.json) {\n console.log(JSON.stringify({ success: true, cleared: true, envTokenPresent: Boolean(envToken) }, null, 2));\n return;\n }\n console.log(pc.green(\"Logged out (local session cleared).\"));\n if (envToken) {\n console.log(pc.dim(\"Note: COMERGE_ACCESS_TOKEN is set in your environment; it will still authenticate requests.\"));\n }\n });\n}\n\n\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\n\nimport { resolveConfig } from \"../lib/config.js\";\nimport { createApiClient } from \"../lib/api.js\";\n\nexport function registerWhoamiCommand(program: Command) {\n program\n .command(\"whoami\")\n .description(\"Show the currently authenticated Comerge user\")\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .action(async (opts) => {\n const config = resolveConfig();\n const api = createApiClient(config);\n const me = await api.getMe();\n if (opts.json) {\n console.log(JSON.stringify(me, null, 2));\n return;\n }\n const profile = (me as any)?.responseObject as { id?: string; email?: string | null } | undefined;\n const label = profile?.email ? `${profile.email}` : profile?.id ? `user ${profile.id}` : \"unknown user\";\n console.log(pc.green(label));\n });\n}\n\n\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\n\nimport { CliError } from \"../lib/errors.js\";\nimport { importLocal } from \"../lib/importLocal.js\";\n\nexport function registerImportCommands(program: Command) {\n const imp = program.command(\"import\").description(\"Import source code into Comerge\");\n\n imp\n .command(\"local\")\n .description(\"Import the current local Expo project\")\n .option(\"--name <appName>\", \"Override app name (default: derived from Expo config / folder name)\")\n .option(\"--path <subdir>\", \"Optional subdirectory to import\")\n .option(\"--max-wait <sec>\", \"Max time to wait for import to finish (default: 1200)\", \"1200\")\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .option(\"--no-wait\", \"Do not poll for completion; return immediately after enqueue\", false)\n .option(\"--no-include-dotenv\", \"Exclude .env* files from the uploaded archive\", false)\n .option(\"--dry-run\", \"Show what would be uploaded (no upload)\", false)\n .action(async (opts) => {\n const maxWaitSec = Number(String(opts.maxWait ?? \"1200\").trim());\n if (!Number.isFinite(maxWaitSec) || maxWaitSec <= 0) {\n throw new CliError(\"Invalid --max-wait\", { exitCode: 2, hint: \"Example: --max-wait 1200\" });\n }\n\n const res = await importLocal({\n appName: opts.name ? String(opts.name) : null,\n subdir: opts.path ? String(opts.path) : null,\n maxWaitMs: Math.floor(maxWaitSec * 1000),\n noWait: Boolean(opts.noWait),\n json: Boolean(opts.json),\n includeDotenv: Boolean(opts.includeDotenv),\n dryRun: Boolean(opts.dryRun),\n });\n\n if (Boolean(opts.json)) {\n console.log(JSON.stringify(res, null, 2));\n return;\n }\n\n console.log(pc.green(`Import accepted. appId=${res.appId}`));\n if (res.status && !opts.noWait) {\n console.log(pc.dim(`Final status: ${res.status}`));\n }\n });\n}\n\n\n","import path from \"node:path\";\n\nimport pc from \"picocolors\";\n\nimport { createApiClient } from \"./api.js\";\nimport { resolveConfig } from \"./config.js\";\nimport { CliError } from \"./errors.js\";\nimport { findExpoProjectRoot } from \"./projectDetect.js\";\nimport { canUseGit, listFilesGit } from \"./gitFiles.js\";\nimport { listFilesFs } from \"./fileSelection.js\";\nimport { computeStats, createZip, sha256FileHex } from \"./zip.js\";\nimport { uploadPresigned } from \"./upload.js\";\n\nexport type ImportLocalParams = {\n appName: string | null;\n subdir: string | null;\n maxWaitMs: number;\n noWait: boolean;\n json: boolean;\n includeDotenv: boolean;\n dryRun: boolean;\n};\n\nexport type ImportLocalResult = {\n uploadId: string;\n appId: string;\n projectId?: string;\n threadId?: string;\n status?: string;\n};\n\nconst SAFE_PATH_RE = /^[A-Za-z0-9._/-]+$/;\n\nfunction sleep(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction formatBytes(bytes: number): string {\n const units = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n let v = bytes;\n let i = 0;\n while (v >= 1024 && i < units.length - 1) {\n v /= 1024;\n i++;\n }\n return `${v.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n\nfunction deriveAppName(projectRoot: string): string {\n const base = path.basename(projectRoot);\n return base || \"Imported App\";\n}\n\nfunction validateOptionalSubdir(subdir: string | null): string | null {\n if (!subdir) return null;\n const s = subdir.trim().replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n if (!s) return null;\n if (!SAFE_PATH_RE.test(s) || s.includes(\"..\")) {\n throw new CliError(\"Invalid --path\", {\n exitCode: 2,\n hint: \"Use a safe subdirectory like packages/mobile-app (letters/numbers/._-/ only).\",\n });\n }\n return s;\n}\n\nfunction getAppStatus(appResp: any): { status: string | null; statusError: string | null } {\n const obj = appResp?.responseObject;\n const status = typeof obj?.status === \"string\" ? obj.status : null;\n const statusError = typeof obj?.statusError === \"string\" ? obj.statusError : null;\n return { status, statusError };\n}\n\nexport async function importLocal(params: ImportLocalParams): Promise<ImportLocalResult> {\n const cfg = resolveConfig();\n const api = createApiClient(cfg);\n\n const projectRoot = await findExpoProjectRoot(process.cwd());\n const subdir = validateOptionalSubdir(params.subdir);\n const importRoot = subdir ? path.join(projectRoot, subdir) : projectRoot;\n\n const appName = (params.appName ?? \"\").trim() || deriveAppName(projectRoot);\n\n const log = (msg: string) => {\n if (params.json) return;\n console.log(msg);\n };\n\n log(pc.dim(`Project: ${projectRoot}`));\n if (subdir) log(pc.dim(`Import path: ${subdir}`));\n\n let files: string[] = [];\n const useGit = await canUseGit(projectRoot);\n if (useGit) {\n const gitPaths = await listFilesGit({ cwd: projectRoot, pathspec: subdir ?? null });\n files = gitPaths;\n if (!params.includeDotenv) {\n files = files.filter((p) => !path.posix.basename(p).startsWith(\".env\"));\n }\n } else {\n files = await listFilesFs({ root: importRoot, includeDotenv: params.includeDotenv });\n if (subdir) {\n files = files.map((p) => path.posix.join(subdir, p));\n }\n }\n\n if (files.length === 0) {\n throw new CliError(\"No files found to upload\", { exitCode: 2, hint: \"Check .gitignore rules or try without --path.\" });\n }\n\n const stats = await computeStats({ root: projectRoot, files, largestN: 10 });\n log(pc.dim(`Files: ${stats.fileCount} Total: ${formatBytes(stats.totalBytes)}`));\n\n if (params.dryRun) {\n const top = stats.largestFiles.slice(0, 10);\n if (top.length > 0) {\n log(pc.dim(\"Largest files:\"));\n for (const f of top) {\n log(pc.dim(` ${formatBytes(f.bytes)} ${f.path}`));\n }\n }\n return { uploadId: \"dry-run\", appId: \"dry-run\", status: \"dry-run\" };\n }\n\n log(pc.dim(\"Creating zip...\"));\n const { zipPath } = await createZip({ root: projectRoot, files, zipName: \"import.zip\" });\n const zipSha = await sha256FileHex(zipPath);\n const zipSize = (await (await import(\"node:fs/promises\")).stat(zipPath)).size;\n\n log(pc.dim(\"Requesting upload URL...\"));\n const presignResp: any = await api.presignImportUpload({\n file: {\n name: \"import.zip\",\n mimeType: \"application/zip\",\n size: zipSize,\n checksumSha256: zipSha,\n },\n });\n const presign = presignResp?.responseObject;\n const uploadId = String(presign?.uploadId ?? \"\");\n const uploadUrl = String(presign?.uploadUrl ?? \"\");\n const headers = (presign?.headers ?? {}) as Record<string, string>;\n if (!uploadId || !uploadUrl) {\n throw new CliError(\"Presign response missing upload fields\", { exitCode: 1, hint: JSON.stringify(presignResp, null, 2) });\n }\n\n log(pc.dim(\"Uploading zip...\"));\n let lastPct = -1;\n await uploadPresigned({\n uploadUrl,\n headers,\n filePath: zipPath,\n onProgress: ({ sentBytes, totalBytes }) => {\n if (params.json) return;\n const pct = totalBytes > 0 ? Math.floor((sentBytes / totalBytes) * 100) : 0;\n if (pct !== lastPct && (pct % 5 === 0 || pct === 100)) {\n lastPct = pct;\n process.stdout.write(pc.dim(`Upload ${pct}%\\r`));\n }\n },\n });\n if (!params.json) process.stdout.write(\"\\n\");\n\n log(pc.dim(\"Triggering import...\"));\n const importResp: any = await api.importFromUpload({\n uploadId,\n appName,\n path: subdir ?? undefined,\n });\n const importObj = importResp?.responseObject;\n const appId = String(importObj?.appId ?? \"\");\n const projectId = importObj?.projectId ? String(importObj.projectId) : undefined;\n const threadId = importObj?.threadId ? String(importObj.threadId) : undefined;\n if (!appId) {\n throw new CliError(\"Import response missing appId\", { exitCode: 1, hint: JSON.stringify(importResp, null, 2) });\n }\n\n if (params.noWait) {\n return { uploadId, appId, projectId, threadId, status: \"accepted\" };\n }\n\n log(pc.dim(\"Waiting for build...\"));\n const startedAt = Date.now();\n let delay = 2000;\n let lastStatus: string | null = null;\n\n while (Date.now() - startedAt < params.maxWaitMs) {\n const appResp: any = await api.getApp(appId);\n const { status, statusError } = getAppStatus(appResp);\n if (status && status !== lastStatus) {\n lastStatus = status;\n log(pc.dim(`Status: ${status}`));\n }\n if (status === \"ready\") {\n return { uploadId, appId, projectId, threadId, status };\n }\n if (status === \"error\") {\n throw new CliError(\"Import failed\", { exitCode: 1, hint: statusError ?? \"App status is error\" });\n }\n await sleep(delay);\n delay = Math.min(10_000, Math.floor(delay * 1.4));\n }\n\n throw new CliError(\"Timed out waiting for import\", {\n exitCode: 1,\n hint: `Try again with --max-wait or check app status with: comerge import local --no-wait`,\n });\n}\n\n\n","import { execa } from \"execa\";\n\nexport async function canUseGit(cwd: string): Promise<boolean> {\n try {\n const res = await execa(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], { cwd, stdio: \"ignore\" });\n return res.exitCode === 0;\n } catch {\n return false;\n }\n}\n\nexport function parseGitLsFilesZ(buf: Buffer): string[] {\n return buf\n .toString(\"utf8\")\n .split(\"\\0\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nexport async function listFilesGit(params: { cwd: string; pathspec?: string | null }): Promise<string[]> {\n const args = [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\"];\n if (params.pathspec) {\n args.push(\"--\", params.pathspec);\n }\n const res = await execa(\"git\", args, { cwd: params.cwd, stdout: \"pipe\", stderr: \"ignore\" });\n return parseGitLsFilesZ(Buffer.from(res.stdout ?? \"\", \"utf8\"));\n}\n\n\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport fg from \"fast-glob\";\nimport ignore from \"ignore\";\n\nconst BUILTIN_IGNORES = [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/.expo/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/coverage/**\",\n \"**/.turbo/**\",\n \"**/.next/**\",\n \"**/ios/build/**\",\n \"**/android/build/**\",\n \"**/.pnpm-store/**\",\n] as const;\n\nfunction normalizeRel(p: string): string {\n return p.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nasync function readGitignore(root: string): Promise<string> {\n const fp = path.join(root, \".gitignore\");\n return await fs.readFile(fp, \"utf8\").catch(() => \"\");\n}\n\nexport async function listFilesFs(params: { root: string; includeDotenv: boolean }): Promise<string[]> {\n const ig = ignore();\n const raw = await readGitignore(params.root);\n if (raw) ig.add(raw);\n\n const entries = await fg([\"**/*\"], {\n cwd: params.root,\n onlyFiles: true,\n dot: true,\n followSymbolicLinks: false,\n unique: true,\n ignore: [...BUILTIN_IGNORES],\n });\n\n const filtered = entries.filter((p) => {\n const rel = normalizeRel(p);\n if (!params.includeDotenv && path.posix.basename(rel).startsWith(\".env\")) return false;\n return !ig.ignores(rel);\n });\n\n return filtered.map(normalizeRel);\n}\n\n\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport archiver from \"archiver\";\n\nimport { CliError } from \"./errors.js\";\n\nexport const MAX_IMPORT_ZIP_BYTES = 50 * 1024 * 1024;\nexport const MAX_IMPORT_FILE_COUNT = 25_000;\n\nexport type ZipStats = {\n fileCount: number;\n totalBytes: number;\n largestFiles: Array<{ path: string; bytes: number }>;\n};\n\nfunction normalizeRel(p: string): string {\n return p.replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nexport function validateRelPath(rel: string): string {\n const p = normalizeRel(rel);\n if (!p) throw new CliError(\"Invalid file path\", { exitCode: 1 });\n if (p.startsWith(\"../\") || p.includes(\"/../\") || p === \"..\") {\n throw new CliError(\"Refusing to zip path traversal entry\", { exitCode: 1, hint: p });\n }\n if (p.startsWith(\"/\")) {\n throw new CliError(\"Refusing to zip absolute path\", { exitCode: 1, hint: p });\n }\n return p;\n}\n\nexport async function computeStats(params: { root: string; files: string[]; largestN?: number }): Promise<ZipStats> {\n const largestN = params.largestN ?? 10;\n if (params.files.length > MAX_IMPORT_FILE_COUNT) {\n throw new CliError(\"Too many files to import\", {\n exitCode: 2,\n hint: `File count ${params.files.length} exceeds limit ${MAX_IMPORT_FILE_COUNT}. Use --path or add ignores.`,\n });\n }\n\n let totalBytes = 0;\n const largest: Array<{ path: string; bytes: number }> = [];\n\n for (const rel0 of params.files) {\n const rel = validateRelPath(rel0);\n const abs = path.join(params.root, rel);\n const st = await fsp.stat(abs);\n if (!st.isFile()) continue;\n const bytes = st.size;\n totalBytes += bytes;\n if (largestN > 0) {\n largest.push({ path: rel, bytes });\n }\n }\n\n largest.sort((a, b) => b.bytes - a.bytes);\n return {\n fileCount: params.files.length,\n totalBytes,\n largestFiles: largest.slice(0, largestN),\n };\n}\n\nexport async function createZip(params: { root: string; files: string[]; zipName?: string }): Promise<{ zipPath: string }> {\n const zipName = (params.zipName ?? \"import.zip\").replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), \"comerge-import-\"));\n const zipPath = path.join(tmpDir, zipName);\n\n await new Promise<void>((resolve, reject) => {\n const output = fs.createWriteStream(zipPath);\n const archive = archiver(\"zip\", { zlib: { level: 9 } });\n output.on(\"close\", () => resolve());\n output.on(\"error\", (err) => reject(err));\n archive.on(\"warning\", (err: any) => {\n // Treat warnings as errors for safety.\n reject(err);\n });\n archive.on(\"error\", (err: any) => reject(err));\n\n archive.pipe(output);\n for (const rel0 of params.files) {\n const rel = validateRelPath(rel0);\n const abs = path.join(params.root, rel);\n archive.file(abs, { name: rel });\n }\n void archive.finalize();\n });\n\n const st = await fsp.stat(zipPath);\n if (st.size > MAX_IMPORT_ZIP_BYTES) {\n throw new CliError(\"Archive exceeds max upload size\", {\n exitCode: 2,\n hint: `Zip size ${st.size} bytes exceeds limit ${MAX_IMPORT_ZIP_BYTES} bytes. Use --path or add ignores.`,\n });\n }\n\n return { zipPath };\n}\n\nexport async function sha256FileHex(filePath: string): Promise<string> {\n const hash = crypto.createHash(\"sha256\");\n await new Promise<void>((resolve, reject) => {\n const s = fs.createReadStream(filePath);\n s.on(\"data\", (chunk) => hash.update(chunk));\n s.on(\"error\", reject);\n s.on(\"end\", () => resolve());\n });\n return hash.digest(\"hex\");\n}\n\n\n","import fs from \"node:fs\";\nimport { PassThrough } from \"node:stream\";\n\nimport { CliError } from \"./errors.js\";\n\nexport async function uploadPresigned(params: {\n uploadUrl: string;\n headers: Record<string, string>;\n filePath: string;\n onProgress?: (p: { sentBytes: number; totalBytes: number }) => void;\n}): Promise<void> {\n const st = await fs.promises.stat(params.filePath).catch(() => null);\n if (!st || !st.isFile()) throw new CliError(\"Upload file not found\", { exitCode: 2 });\n const totalBytes = st.size;\n\n const fileStream = fs.createReadStream(params.filePath);\n const pass = new PassThrough();\n\n let sent = 0;\n fileStream.on(\"data\", (chunk) => {\n sent += chunk.length;\n params.onProgress?.({ sentBytes: sent, totalBytes });\n });\n fileStream.on(\"error\", (err) => pass.destroy(err));\n fileStream.pipe(pass);\n\n const res = await fetch(params.uploadUrl, {\n method: \"PUT\",\n headers: params.headers,\n body: pass as any,\n duplex: \"half\" as any,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new CliError(\"Upload failed\", {\n exitCode: 1,\n hint: `Status: ${res.status}\\n${text}`.trim() || null,\n });\n }\n}\n\n\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\n\nimport { CliError } from \"../lib/errors.js\";\nimport { initLocal } from \"../lib/initLocal.js\";\n\nexport function registerInitCommands(program: Command) {\n const init = program.command(\"init\").description(\"Full loop: import + generate shell wrapper\");\n\n init\n .command(\"local\")\n .description(\"Login if needed, import the local Expo project, then generate the shell wrapper\")\n .option(\"--api-key <pk>\", \"Studio API key (or set COMERGE_STUDIO_API_KEY)\")\n .option(\"--app-key <key>\", \"Bundle app key\", \"MicroMain\")\n .option(\"--out <dir>\", \"Output directory for shell wrapper\", \"comerge-shell\")\n .option(\"--install\", \"Install dependencies in generated shell\", false)\n .option(\"--package-manager <pm>\", \"Override package manager detection (pnpm|npm|yarn|bun)\")\n .option(\"--studio-version <ver>\", \"Version to use for @comergehq/studio\", \"latest\")\n .option(\"--name <appName>\", \"Override imported app name\")\n .option(\"--path <subdir>\", \"Optional subdirectory to import\")\n .option(\"--max-wait <sec>\", \"Max time to wait for import to finish (default: 1200)\", \"1200\")\n .option(\"--no-wait\", \"Do not poll for completion; generate shell immediately\", false)\n .option(\"--no-include-dotenv\", \"Exclude .env* files from the uploaded archive\")\n .option(\"--dry-run\", \"Show what would be uploaded (no login/import/shell)\", false)\n .option(\"--yes\", \"Non-interactive; do not prompt\", false)\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .action(async (opts) => {\n const maxWaitSec = Number(String(opts.maxWait ?? \"1200\").trim());\n if (!Number.isFinite(maxWaitSec) || maxWaitSec <= 0) {\n throw new CliError(\"Invalid --max-wait\", { exitCode: 2, hint: \"Example: --max-wait 1200\" });\n }\n\n const res = await initLocal({\n apiKey: opts.apiKey ? String(opts.apiKey) : null,\n appKey: opts.appKey ? String(opts.appKey) : \"MicroMain\",\n outDir: opts.out ? String(opts.out) : \"comerge-shell\",\n install: Boolean(opts.install),\n packageManager: opts.packageManager ? String(opts.packageManager) : null,\n studioVersion: opts.studioVersion ? String(opts.studioVersion) : \"latest\",\n appName: opts.name ? String(opts.name) : null,\n subdir: opts.path ? String(opts.path) : null,\n maxWaitMs: Math.floor(maxWaitSec * 1000),\n noWait: Boolean(opts.noWait),\n includeDotenv: Boolean(opts.includeDotenv),\n dryRun: Boolean(opts.dryRun),\n yes: Boolean(opts.yes),\n json: Boolean(opts.json),\n });\n\n if (opts.json) {\n console.log(JSON.stringify(res, null, 2));\n return;\n }\n\n console.log(pc.green(`Done. appId=${res.appId}`));\n console.log(pc.dim(`Shell: ${res.shellOutDir}`));\n if (res.status) console.log(pc.dim(`Status: ${res.status}`));\n if (res.noWait) console.log(pc.yellow(\"Note: --no-wait was used; bundles may still be building.\"));\n });\n}\n\n\n","import pc from \"picocolors\";\n\nimport { ensureAuth } from \"./ensureAuth.js\";\nimport { importLocal } from \"./importLocal.js\";\nimport { resolveStudioApiKey } from \"./apiKey.js\";\nimport { shellInit } from \"../commands/shellInit.js\";\n\nexport type InitLocalParams = {\n apiKey: string | null;\n appKey: string;\n outDir: string;\n install: boolean;\n packageManager: string | null;\n studioVersion: string;\n\n appName: string | null;\n subdir: string | null;\n maxWaitMs: number;\n noWait: boolean;\n includeDotenv: boolean;\n dryRun: boolean;\n\n yes: boolean;\n json: boolean;\n};\n\nexport type InitLocalResult = {\n appId: string;\n uploadId?: string;\n projectId?: string;\n threadId?: string;\n status?: string;\n shellOutDir: string;\n noWait: boolean;\n};\n\nexport async function initLocal(params: InitLocalParams): Promise<InitLocalResult> {\n if (params.dryRun) {\n const res = await importLocal({\n appName: params.appName,\n subdir: params.subdir,\n maxWaitMs: params.maxWaitMs,\n noWait: true,\n json: params.json,\n includeDotenv: params.includeDotenv,\n dryRun: true,\n });\n return {\n appId: res.appId,\n uploadId: res.uploadId,\n projectId: res.projectId,\n threadId: res.threadId,\n status: res.status,\n shellOutDir: params.outDir,\n noWait: params.noWait,\n };\n }\n\n await ensureAuth({ yes: params.yes, json: params.json });\n\n const apiKey = await resolveStudioApiKey({ flagApiKey: params.apiKey, yes: params.yes });\n const appKey = String(params.appKey || \"MicroMain\").trim() || \"MicroMain\";\n\n if (!params.json) console.log(pc.dim(\"Importing project...\"));\n const imported = await importLocal({\n appName: params.appName,\n subdir: params.subdir,\n maxWaitMs: params.maxWaitMs,\n noWait: params.noWait,\n json: params.json,\n includeDotenv: params.includeDotenv,\n dryRun: false,\n });\n\n if (!params.json) console.log(pc.dim(\"Generating shell...\"));\n await shellInit({\n outDir: params.outDir,\n appId: imported.appId,\n apiKey,\n appKey,\n yes: true,\n install: params.install,\n packageManager: params.packageManager,\n studioVersion: params.studioVersion,\n });\n\n return {\n appId: imported.appId,\n uploadId: imported.uploadId,\n projectId: imported.projectId,\n threadId: imported.threadId,\n status: imported.status,\n shellOutDir: params.outDir,\n noWait: params.noWait,\n };\n}\n\n\n","import pc from \"picocolors\";\n\nimport { CliError } from \"./errors.js\";\nimport { resolveConfig } from \"./config.js\";\nimport { createApiClient } from \"./api.js\";\nimport { startOAuthCallbackServer } from \"./oauthCallbackServer.js\";\nimport { openBrowser } from \"./browser.js\";\nimport { createSupabaseAuthHelpers } from \"./supabase.js\";\nimport { clearSession, getSession, setSession } from \"./sessionStore.js\";\n\nfunction isInteractive(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nasync function validateBackendSession(): Promise<void> {\n const cfg = resolveConfig();\n const api = createApiClient(cfg);\n await api.getMe();\n}\n\nexport async function ensureAuth(params?: { yes?: boolean; json?: boolean }): Promise<void> {\n const envToken = process.env.COMERGE_ACCESS_TOKEN;\n if (typeof envToken === \"string\" && envToken.trim().length > 0) return;\n\n const existing = await getSession();\n if (existing) {\n try {\n await validateBackendSession();\n return;\n } catch {\n // Continue into login flow if interactive; otherwise fail.\n }\n }\n\n const interactive = isInteractive();\n const yes = Boolean(params?.yes);\n if (!interactive || yes) {\n throw new CliError(\"Not logged in\", {\n exitCode: 2,\n hint: \"Run `comerge login` first, or set COMERGE_ACCESS_TOKEN for CI.\",\n });\n }\n\n const cfg = resolveConfig();\n const server = await startOAuthCallbackServer({ port: null });\n try {\n const supabase = createSupabaseAuthHelpers(cfg);\n const { url } = await supabase.startGoogleLogin({ redirectTo: server.redirectTo });\n\n try {\n await openBrowser(url);\n if (!params?.json) console.log(pc.dim(\"Opened browser for login...\"));\n } catch {\n if (!params?.json) {\n console.log(pc.yellow(\"Could not open the browser automatically.\"));\n console.log(`Open this URL manually:\\n${url}`);\n }\n }\n\n const code = await server.waitForCode();\n const session = await supabase.exchangeCode({ code });\n await setSession(session);\n\n try {\n await validateBackendSession();\n } catch (err) {\n await clearSession().catch(() => {});\n throw err;\n }\n } finally {\n await server.close();\n }\n}\n\n\n","import prompts from \"prompts\";\n\nimport { CliError } from \"./errors.js\";\n\nfunction isInteractive(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nexport async function resolveStudioApiKey(params: {\n flagApiKey: string | null;\n yes: boolean;\n}): Promise<string> {\n const fromFlag = (params.flagApiKey ?? \"\").trim();\n if (fromFlag) return fromFlag;\n\n const fromEnv = (process.env.COMERGE_STUDIO_API_KEY ?? \"\").trim();\n if (fromEnv) return fromEnv;\n\n if (params.yes || !isInteractive()) {\n throw new CliError(\"Missing required Studio API key\", {\n exitCode: 2,\n hint: \"Pass --api-key <pk_...> or set COMERGE_STUDIO_API_KEY.\",\n });\n }\n\n const res = await prompts(\n [\n {\n type: \"password\",\n name: \"apiKey\",\n message: \"Studio API key\",\n validate: (v: string) => (String(v || \"\").trim().length > 0 ? true : \"apiKey is required\"),\n },\n ],\n {\n onCancel: () => {\n throw new CliError(\"Cancelled\", { exitCode: 130 });\n },\n },\n );\n\n const apiKey = String(res.apiKey ?? \"\").trim();\n if (!apiKey) {\n throw new CliError(\"Missing required Studio API key\", { exitCode: 2 });\n }\n return apiKey;\n}\n\n\n"],"mappings":"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","names":["pc","path","fse","main","fs","exists","fs","fs","path","fs","path","fs","path","fse","path","fse","path","fse","exists","fs","fs","fs","fs","path","fse","fs","pc","execa","execa","fs","os","path","z","z","path","os","fs","raw","path","res","pc","pc","pc","pc","pc","pc","path","pc","execa","fs","path","normalizeRel","fs","os","path","normalizeRel","path","os","fs","fs","fs","path","pc","pc","pc","pc","pc","pc","prompts","isInteractive","prompts","pc","pc","pc"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/shellInit.ts","../src/lib/errors.ts","../src/lib/packageJson.ts","../src/lib/fs.ts","../src/lib/projectDetect.ts","../src/lib/templates.ts","../src/lib/packageManager.ts","../src/lib/copyProject.ts","../src/lib/stripProject.ts","../src/lib/appJsonPatch.ts","../src/lib/reanimated.ts","../src/commands/shell.ts","../src/commands/login.ts","../src/lib/config.ts","../src/lib/apiKey.ts","../src/lib/oauthCallbackServer.ts","../src/lib/browser.ts","../src/lib/supabase.ts","../src/lib/sessionStore.ts","../src/lib/api.ts","../src/commands/logout.ts","../src/commands/whoami.ts","../src/commands/import.ts","../src/lib/importLocal.ts","../src/lib/gitFiles.ts","../src/lib/fileSelection.ts","../src/lib/zip.ts","../src/lib/upload.ts","../src/commands/init.ts","../src/lib/initLocal.ts","../src/lib/ensureAuth.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport pc from \"picocolors\";\nimport { createRequire } from \"node:module\";\n\nimport { registerShellCommands } from \"./commands/shell.js\";\nimport { registerLoginCommand } from \"./commands/login.js\";\nimport { registerLogoutCommand } from \"./commands/logout.js\";\nimport { registerWhoamiCommand } from \"./commands/whoami.js\";\nimport { registerImportCommands } from \"./commands/import.js\";\nimport { registerInitCommands } from \"./commands/init.js\";\nimport { CliError } from \"./lib/errors.js\";\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../package.json\") as { version: string };\n\nexport async function main(argv: string[]) {\n const program = new Command();\n program\n .name(\"comerge\")\n .description(\"Comerge CLI\")\n .version(version);\n\n registerShellCommands(program);\n registerLoginCommand(program);\n registerWhoamiCommand(program);\n registerLogoutCommand(program);\n registerImportCommands(program);\n registerInitCommands(program);\n\n program.configureOutput({\n outputError: (str, write) => write(pc.red(str)),\n });\n\n try {\n await program.parseAsync(argv);\n } catch (err) {\n const e = err as unknown;\n if (e instanceof CliError) {\n console.error(pc.red(`Error: ${e.message}`));\n if (e.hint) console.error(pc.dim(e.hint));\n process.exitCode = e.exitCode;\n return;\n }\n console.error(pc.red(`Unexpected error: ${(e as Error)?.message ?? String(e)}`));\n process.exitCode = 1;\n }\n}\n\nvoid main(process.argv);\n\n\n","import path from \"node:path\";\nimport os from \"node:os\";\n\nimport pc from \"picocolors\";\nimport prompts from \"prompts\";\nimport fse from \"fs-extra\";\n\nimport { CliError } from \"../lib/errors.js\";\nimport { readPackageJson, buildShellPackageJson } from \"../lib/packageJson.js\";\nimport { ensureEmptyDir, findAvailableDirPath, writeJsonAtomic, writeTextAtomic } from \"../lib/fs.js\";\nimport { findExpoProjectRoot } from \"../lib/projectDetect.js\";\nimport { shellBabelConfigJs, shellIndexTsx, shellLayoutTsx, shellMetroConfigJs } from \"../lib/templates.js\";\nimport { detectPackageManager, installCommand, type PackageManager } from \"../lib/packageManager.js\";\nimport { execa } from \"execa\";\nimport { copyProject } from \"../lib/copyProject.js\";\nimport { stripProject } from \"../lib/stripProject.js\";\nimport fs from \"node:fs/promises\";\nimport { ensureComergeShellPlugins } from \"../lib/appJsonPatch.js\";\nimport { ensureReanimatedBabelPlugin } from \"../lib/reanimated.js\";\n\nexport type ShellInitParams = {\n outDir: string;\n appId: string;\n apiKey: string;\n appKey: string;\n yes: boolean;\n install: boolean;\n packageManager: string | null;\n studioVersion: string;\n};\n\nexport async function shellInit(params: ShellInitParams): Promise<void> {\n const projectRoot = await findExpoProjectRoot(process.cwd());\n const outDirDefault = params.outDir || \"comerge-shell\";\n\n let outDir = outDirDefault;\n let appId = params.appId ?? \"\";\n let apiKey = params.apiKey ?? \"\";\n let appKey = params.appKey ?? \"MicroMain\";\n\n if (!params.yes) {\n const res = await prompts(\n [\n {\n type: \"text\",\n name: \"outDir\",\n message: \"Output directory\",\n initial: outDir,\n },\n {\n type: \"text\",\n name: \"appKey\",\n message: \"App key\",\n initial: appKey,\n },\n {\n type: \"text\",\n name: \"appId\",\n message: \"Comerge appId\",\n initial: appId,\n validate: (value: string) => (String(value || \"\").trim().length > 0 ? true : \"appId is required\"),\n },\n {\n type: \"password\",\n name: \"apiKey\",\n message: \"Comerge apiKey\",\n initial: apiKey,\n validate: (value: string) => (String(value || \"\").trim().length > 0 ? true : \"apiKey is required\"),\n },\n ],\n {\n onCancel: () => {\n throw new CliError(\"Cancelled\", { exitCode: 130 });\n },\n },\n );\n outDir = String(res.outDir || outDir);\n appKey = String(res.appKey || appKey);\n appId = String(res.appId || appId);\n apiKey = String(res.apiKey || apiKey);\n }\n\n appId = String(appId || \"\").trim();\n apiKey = String(apiKey || \"\").trim();\n if (!appId) {\n throw new CliError(\"Missing required appId\", {\n hint: \"Pass --app-id <uuid> (or omit --yes to be prompted).\",\n exitCode: 2,\n });\n }\n if (!apiKey) {\n throw new CliError(\"Missing required apiKey\", {\n hint: \"Pass --api-key <key> (or omit --yes to be prompted).\",\n exitCode: 2,\n });\n }\n\n const requestedOutputPath = path.resolve(projectRoot, outDir);\n const outputPath = await findAvailableDirPath(requestedOutputPath);\n console.log(pc.dim(`Project: ${projectRoot}`));\n if (outputPath !== requestedOutputPath) {\n console.log(pc.dim(`Output: ${requestedOutputPath} (exists)`));\n console.log(pc.dim(`Using: ${outputPath}`));\n } else {\n console.log(pc.dim(`Output: ${outputPath}`));\n }\n\n // If output is under project root, stage in a temp dir then move into place.\n const outputIsInsideProject =\n outputPath === projectRoot || outputPath.startsWith(projectRoot + path.sep);\n const stagingPath = outputIsInsideProject\n ? await fs.mkdtemp(path.join(os.tmpdir(), \"comerge-shell-\"))\n : outputPath;\n\n let movedToFinal = false;\n try {\n if (!outputIsInsideProject) {\n await ensureEmptyDir(stagingPath);\n }\n\n await copyProject({ projectRoot, outRoot: stagingPath });\n\n await stripProject({ outRoot: stagingPath });\n\n try {\n const didPatch = await ensureComergeShellPlugins(path.join(stagingPath, \"app.json\"));\n if (didPatch) {\n console.log(pc.dim(\"Patched app.json to include required Comerge shell plugins.\"));\n }\n } catch {}\n\n await writeJsonAtomic(path.join(stagingPath, \"comerge.config.json\"), {\n appId,\n appKey: appKey || \"MicroMain\",\n apiKey,\n });\n\n await writeTextAtomic(path.join(stagingPath, \"app/_layout.tsx\"), shellLayoutTsx());\n await writeTextAtomic(path.join(stagingPath, \"app/index.tsx\"), shellIndexTsx());\n await ensureTextFile(path.join(stagingPath, \"babel.config.js\"), shellBabelConfigJs());\n await ensureTextFile(path.join(stagingPath, \"metro.config.js\"), shellMetroConfigJs());\n try {\n const didPatch = await ensureReanimatedBabelPlugin(path.join(stagingPath, \"babel.config.js\"));\n if (didPatch) console.log(pc.dim(\"Patched babel.config.js to include react-native-reanimated/plugin.\"));\n } catch {}\n await ensureTextFile(\n path.join(stagingPath, \"tsconfig.json\"),\n JSON.stringify(\n {\n extends: \"expo/tsconfig.base\",\n compilerOptions: { strict: true, resolveJsonModule: true },\n },\n null,\n 2,\n ) + \"\\n\",\n );\n\n const originalPkg = await readPackageJson(stagingPath);\n const { pkg: shellPkg, warnings, info } = buildShellPackageJson({\n original: originalPkg,\n studioVersion: params.studioVersion,\n });\n await writeJsonAtomic(path.join(stagingPath, \"package.json\"), shellPkg);\n\n for (const w of warnings) console.log(pc.yellow(`Warning: ${w}`));\n for (const i of info) console.log(pc.dim(`Info: ${i}`));\n\n if (outputIsInsideProject) {\n await fse.move(stagingPath, outputPath, { overwrite: false });\n movedToFinal = true;\n }\n\n const finalPath = outputIsInsideProject ? outputPath : stagingPath;\n\n if (params.install) {\n const pm =\n (params.packageManager as PackageManager | null) ?? (await detectPackageManager(projectRoot));\n const { cmd, args } = installCommand(pm);\n console.log(pc.dim(`Installing deps with ${cmd}...`));\n const res = await execa(cmd, args, { cwd: finalPath, stdio: \"inherit\" });\n if (res.exitCode !== 0) {\n throw new CliError(\"Dependency install failed\", { exitCode: res.exitCode ?? 1 });\n }\n\n console.log(pc.dim(\"Running expo prebuild...\"));\n const prebuild = await execa(\"npx\", [\"expo\", \"prebuild\"], { cwd: finalPath, stdio: \"inherit\" });\n if (prebuild.exitCode !== 0) {\n throw new CliError(\"expo prebuild failed\", { exitCode: prebuild.exitCode ?? 1 });\n }\n }\n\n console.log(pc.green(\"Shell app generated.\"));\n const rel = path.relative(process.cwd(), finalPath) || \".\";\n console.log(pc.dim(`Shell: ${rel}`));\n console.log(pc.dim(\"Next steps:\"));\n console.log(pc.dim(` cd ${rel}`));\n console.log(pc.dim(` npx expo run:ios`));\n console.log(pc.dim(` npx expo run:android`));\n } finally {\n if (outputIsInsideProject && !movedToFinal) {\n try {\n await fse.remove(stagingPath);\n } catch {}\n }\n }\n}\n\nasync function ensureTextFile(filePath: string, contents: string): Promise<void> {\n try {\n await fs.access(filePath);\n return;\n } catch {\n }\n await writeTextAtomic(filePath, contents);\n}\n\n\n","export class CliError extends Error {\n public readonly exitCode: number;\n public readonly hint: string | null;\n\n constructor(message: string, opts?: { exitCode?: number; hint?: string | null }) {\n super(message);\n this.name = \"CliError\";\n this.exitCode = opts?.exitCode ?? 1;\n this.hint = opts?.hint ?? null;\n }\n}\n\n\n","import fs from \"node:fs/promises\";\n\nimport { CliError } from \"./errors.js\";\n\nexport type PackageJson = {\n name?: string;\n version?: string;\n private?: boolean;\n main?: string;\n packageManager?: string;\n scripts?: Record<string, string>;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n [key: string]: unknown;\n};\n\nexport async function readPackageJson(projectRoot: string): Promise<PackageJson> {\n const raw = await fs.readFile(`${projectRoot}/package.json`, \"utf8\").catch(() => null);\n if (!raw) {\n throw new CliError(\"package.json not found\", { exitCode: 2 });\n }\n try {\n return JSON.parse(raw) as PackageJson;\n } catch {\n throw new CliError(\"Failed to parse package.json\", { exitCode: 2 });\n }\n}\n\nconst STUDIO_PEERS = [\n \"@callstack/liquid-glass\",\n \"@supabase/supabase-js\",\n \"@gorhom/bottom-sheet\",\n \"expo-file-system\",\n \"expo-haptics\",\n \"expo-linear-gradient\",\n \"lucide-react-native\",\n \"react-native-gesture-handler\",\n \"react-native-reanimated\",\n \"react-native-safe-area-context\",\n \"react-native-svg\",\n \"react-native-view-shot\",\n] as const;\n\nexport function buildShellPackageJson(params: {\n original: PackageJson;\n studioVersion: string;\n}): { pkg: PackageJson; warnings: string[]; info: string[] } {\n const orig = params.original;\n const warnings: string[] = [];\n const info: string[] = [];\n\n const dependencies: Record<string, string> = { ...(orig.dependencies ?? {}) };\n const devDependencies: Record<string, string> = { ...(orig.devDependencies ?? {}) };\n\n const main = \"expo-router/entry\";\n\n dependencies[\"@comergehq/studio\"] = params.studioVersion || \"latest\";\n dependencies[\"@comergehq/runtime\"] = params.studioVersion || \"latest\";\n\n if (!dependencies[\"expo-router\"] && !devDependencies[\"expo-router\"]) {\n dependencies[\"expo-router\"] = \"latest\";\n warnings.push(\"Added missing dependency expo-router@latest\");\n }\n\n for (const dep of STUDIO_PEERS) {\n if (dependencies[dep] || devDependencies[dep]) continue;\n dependencies[dep] = \"latest\";\n info.push(`Added missing peer dependency ${dep}@latest`);\n }\n\n const pkg: PackageJson = {\n ...orig,\n name: orig.name ? `${orig.name}-comerge-shell` : \"comerge-shell\",\n private: true,\n main,\n scripts: {\n dev: \"expo start -c\",\n ios: \"expo start -c --ios\",\n android: \"expo start -c --android\",\n web: \"expo start -c --web\",\n ...(orig.scripts ?? {}),\n },\n dependencies,\n devDependencies,\n };\n\n return { pkg, warnings, info };\n}\n\n\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport fse from \"fs-extra\";\n\nimport { CliError } from \"./errors.js\";\n\nexport async function findAvailableDirPath(preferredDir: string): Promise<string> {\n const preferredExists = await fse.pathExists(preferredDir);\n if (!preferredExists) return preferredDir;\n\n const parent = path.dirname(preferredDir);\n const base = path.basename(preferredDir);\n\n // Best practice: suffix with an incrementing counter.\n for (let i = 2; i <= 1000; i++) {\n const candidate = path.join(parent, `${base}-${i}`);\n if (!(await fse.pathExists(candidate))) return candidate;\n }\n\n throw new CliError(\"Could not find an available output directory name\", {\n exitCode: 2,\n hint: `Tried ${base}-2 through ${base}-1000 under ${parent}.`,\n });\n}\n\nexport async function ensureEmptyDir(dir: string): Promise<void> {\n const exists = await fse.pathExists(dir);\n if (exists) {\n throw new CliError(\"Output directory already exists\", {\n hint: `Choose a new --out directory or delete: ${dir}`,\n exitCode: 2,\n });\n }\n await fse.mkdirp(dir);\n}\n\nexport async function writeJsonAtomic(filePath: string, value: unknown): Promise<void> {\n const dir = path.dirname(filePath);\n await fse.mkdirp(dir);\n const tmp = `${filePath}.tmp-${Date.now()}`;\n await fs.writeFile(tmp, JSON.stringify(value, null, 2) + \"\\n\", \"utf8\");\n await fs.rename(tmp, filePath);\n}\n\nexport async function writeTextAtomic(filePath: string, contents: string): Promise<void> {\n const dir = path.dirname(filePath);\n await fse.mkdirp(dir);\n const tmp = `${filePath}.tmp-${Date.now()}`;\n await fs.writeFile(tmp, contents, \"utf8\");\n await fs.rename(tmp, filePath);\n}\n\n\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { CliError } from \"./errors.js\";\n\nasync function fileExists(p: string): Promise<boolean> {\n try {\n const st = await fs.stat(p);\n return st.isFile();\n } catch {\n return false;\n }\n}\n\nasync function dirExists(p: string): Promise<boolean> {\n try {\n const st = await fs.stat(p);\n return st.isDirectory();\n } catch {\n return false;\n }\n}\n\nexport async function findExpoProjectRoot(startDir: string): Promise<string> {\n let cur = path.resolve(startDir);\n while (true) {\n const pkg = path.join(cur, \"package.json\");\n if (await fileExists(pkg)) {\n const hasAppJson = await fileExists(path.join(cur, \"app.json\"));\n const hasAppConfig = await fileExists(path.join(cur, \"app.config.js\")) || await fileExists(path.join(cur, \"app.config.ts\"));\n if (!hasAppJson && !hasAppConfig) {\n } else {\n return cur;\n }\n }\n\n const parent = path.dirname(cur);\n if (parent === cur) break;\n cur = parent;\n }\n\n throw new CliError(\"Not inside an Expo project\", {\n hint: \"Run this command from the root of your Expo project repository.\",\n exitCode: 2,\n });\n}\n\nexport async function requireAssetsDir(projectRoot: string): Promise<void> {\n const assets = path.join(projectRoot, \"assets\");\n if (!(await dirExists(assets))) {\n throw new CliError(\"Expected an assets/ directory in the project root\", {\n hint: `Create ${assets} or adjust the CLI to support alternate assets paths.`,\n exitCode: 2,\n });\n }\n}\n\n\n","export function shellLayoutTsx(): string {\n return `import { Stack } from 'expo-router';\nimport { GestureHandlerRootView } from 'react-native-gesture-handler';\n\nexport default function Layout() {\n return (\n <GestureHandlerRootView style={{ flex: 1 }}>\n <Stack screenOptions={{ headerShown: false }} />\n </GestureHandlerRootView>\n );\n}\n`;\n}\n\nexport function shellIndexTsx(): string {\n return `import * as React from 'react';\nimport { View } from 'react-native';\nimport { Stack } from 'expo-router';\nimport { ComergeStudio } from '@comergehq/studio';\n\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport config from '../comerge.config.json';\n\nexport default function Index() {\n const appId = String((config as any)?.appId || '');\n const appKey = String((config as any)?.appKey || 'MicroMain');\n const apiKey = String((config as any)?.apiKey || '');\n return (\n <>\n <Stack.Screen options={{ headerShown: false }} />\n <View style={{ flex: 1 }}>\n {appId ? <ComergeStudio appId={appId} apiKey={apiKey} appKey={appKey} /> : null}\n </View>\n </>\n );\n}\n`;\n}\n\nexport function shellBabelConfigJs(): string {\n return `module.exports = function (api) {\n api.cache(true);\n return {\n presets: ['babel-preset-expo'],\n plugins: ['react-native-reanimated/plugin'],\n };\n};\n`;\n}\n\nexport function shellMetroConfigJs(): string {\n return `const { getDefaultConfig } = require('expo/metro-config');\n\nconst config = getDefaultConfig(__dirname);\n\nmodule.exports = config;\n`;\n}\n\n\n","import fs from \"node:fs/promises\";\n\nexport type PackageManager = \"pnpm\" | \"npm\" | \"yarn\" | \"bun\";\n\nasync function exists(p: string): Promise<boolean> {\n try {\n await fs.stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectPackageManager(projectRoot: string): Promise<PackageManager> {\n if (await exists(`${projectRoot}/pnpm-lock.yaml`)) return \"pnpm\";\n if (await exists(`${projectRoot}/yarn.lock`)) return \"yarn\";\n if (await exists(`${projectRoot}/package-lock.json`)) return \"npm\";\n if (await exists(`${projectRoot}/bun.lockb`)) return \"bun\";\n return \"npm\";\n}\n\nexport function installCommand(pm: PackageManager): { cmd: string; args: string[] } {\n switch (pm) {\n case \"pnpm\":\n return { cmd: \"pnpm\", args: [\"install\"] };\n case \"yarn\":\n return { cmd: \"yarn\", args: [\"install\"] };\n case \"bun\":\n return { cmd: \"bun\", args: [\"install\"] };\n case \"npm\":\n default:\n return { cmd: \"npm\", args: [\"install\"] };\n }\n}\n\n\n","import path from \"node:path\";\n\nimport fse from \"fs-extra\";\n\nimport { CliError } from \"./errors.js\";\n\nconst ALWAYS_EXCLUDE_DIRS = new Set([\n \"node_modules\",\n \".git\",\n \".expo\",\n \"dist\",\n \"build\",\n]);\n\nfunction normalizeRel(relPath: string): string {\n return relPath.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nfunction shouldExclude(relPath: string): boolean {\n const rel = normalizeRel(relPath);\n const parts = rel.split(\"/\").filter(Boolean);\n const top = parts[0] ?? \"\";\n\n if (!top) return false;\n if (ALWAYS_EXCLUDE_DIRS.has(top)) return true;\n if (top.startsWith(\"comerge-shell\")) return true;\n\n if (rel.startsWith(\"ios/build/\") || rel === \"ios/build\") return true;\n if (rel.startsWith(\"android/build/\") || rel === \"android/build\") return true;\n\n return false;\n}\n\nexport async function copyProject(params: { projectRoot: string; outRoot: string }): Promise<void> {\n const src = path.resolve(params.projectRoot);\n const dest = path.resolve(params.outRoot);\n\n const srcExists = await fse.pathExists(src);\n if (!srcExists) {\n throw new CliError(\"Project root does not exist\", { exitCode: 2 });\n }\n\n await fse.copy(src, dest, {\n dereference: true,\n preserveTimestamps: true,\n filter: (srcPath) => {\n const rel = path.relative(src, srcPath);\n if (!rel) return true;\n return !shouldExclude(rel);\n },\n });\n}\n\n\n","import path from \"node:path\";\n\nimport fse from \"fs-extra\";\n\nexport const DEFAULT_STRIP_DIRS = [\"app\", \"src\", \"components\", \"lib\", \"hooks\", \"providers\"] as const;\n\nexport async function stripProject(params: { outRoot: string; dirs?: readonly string[] }): Promise<void> {\n const dirs = params.dirs ?? DEFAULT_STRIP_DIRS;\n await Promise.all(\n dirs.map(async (d) => {\n const p = path.join(params.outRoot, d);\n const exists = await fse.pathExists(p);\n if (!exists) return;\n await fse.remove(p);\n }),\n );\n}\n\n\n","import fs from \"node:fs/promises\";\n\nimport { CliError } from \"./errors.js\";\n\ntype AppJson = { expo?: any };\n\nfunction pluginName(entry: any): string | null {\n if (Array.isArray(entry)) return typeof entry[0] === \"string\" ? entry[0] : null;\n return typeof entry === \"string\" ? entry : null;\n}\n\nexport async function ensureComergeShellPlugins(appJsonPath: string): Promise<boolean> {\n let raw: string;\n try {\n raw = await fs.readFile(appJsonPath, \"utf8\");\n } catch {\n return false;\n }\n let parsed: AppJson;\n try {\n parsed = JSON.parse(raw) as AppJson;\n } catch {\n throw new CliError(\"Failed to parse app.json in generated shell\", { exitCode: 2 });\n }\n\n const expo = parsed.expo;\n if (!expo || typeof expo !== \"object\") return false;\n\n const plugins = Array.isArray(expo.plugins) ? [...expo.plugins] : [];\n const routerEntry = plugins.find((p) => pluginName(p) === \"expo-router\");\n const runtimeEntry = plugins.find((p) => pluginName(p) === \"@comergehq/runtime\");\n const needsRouter = !routerEntry;\n const needsRuntime = !runtimeEntry;\n if (!needsRouter && !needsRuntime) return false;\n\n const rest = plugins.filter((p) => {\n const name = pluginName(p);\n return name !== \"expo-router\" && name !== \"@comergehq/runtime\";\n });\n\n expo.plugins = [routerEntry ?? \"expo-router\", runtimeEntry ?? \"@comergehq/runtime\", ...rest];\n await fs.writeFile(appJsonPath, JSON.stringify({ expo }, null, 2) + \"\\n\", \"utf8\");\n return true;\n}\n\n\n","import fs from \"node:fs/promises\";\n\nexport async function ensureReanimatedBabelPlugin(babelConfigPath: string): Promise<boolean> {\n const raw = await fs.readFile(babelConfigPath, \"utf8\").catch(() => null);\n if (!raw) return false;\n if (raw.includes(\"react-native-reanimated/plugin\")) return false;\n\n const patched = patchBabelConfigAddReanimatedPlugin(raw);\n if (patched === raw) return false;\n\n await fs.writeFile(babelConfigPath, patched, \"utf8\");\n return true;\n}\n\nfunction patchBabelConfigAddReanimatedPlugin(raw: string): string {\n const pluginsMatch = /(^|\\n)([ \\t]*)plugins\\s*:\\s*\\[/m.exec(raw);\n if (pluginsMatch) {\n const matchIdx = pluginsMatch.index + pluginsMatch[1].length;\n const indent = pluginsMatch[2] ?? \"\";\n const bracketIdx = raw.indexOf(\"[\", matchIdx);\n if (bracketIdx >= 0) {\n const closeIdx = findMatchingBracket(raw, bracketIdx, \"[\", \"]\");\n if (closeIdx >= 0) {\n const inner = raw.slice(bracketIdx + 1, closeIdx);\n const innerTrim = inner.trim();\n const innerTrimEnd = inner.replace(/[ \\t\\r\\n]+$/g, \"\");\n const elementIndent = indent + \" \";\n let insert = \"\";\n if (!innerTrim) {\n insert = `\\n${elementIndent}'react-native-reanimated/plugin'\\n${indent}`;\n } else if (innerTrimEnd.endsWith(\",\")) {\n insert = `\\n${elementIndent}'react-native-reanimated/plugin'`;\n } else {\n insert = `,\\n${elementIndent}'react-native-reanimated/plugin'`;\n }\n return raw.slice(0, closeIdx) + insert + raw.slice(closeIdx);\n }\n }\n }\n\n const presetsMatch = /(^|\\n)([ \\t]*)presets\\s*:\\s*\\[[^\\]]*\\]\\s*,?/m.exec(raw);\n if (presetsMatch) {\n const indent = presetsMatch[2] ?? \"\";\n const insertAt = presetsMatch.index + presetsMatch[0].length;\n const insertion = `\\n${indent}// Required by react-native-reanimated. Must be listed last.\\n${indent}plugins: ['react-native-reanimated/plugin'],`;\n return raw.slice(0, insertAt) + insertion + raw.slice(insertAt);\n }\n\n return raw;\n}\n\nfunction findMatchingBracket(text: string, openIdx: number, open: string, close: string): number {\n let depth = 0;\n let inSingle = false;\n let inDouble = false;\n let inTemplate = false;\n let inLineComment = false;\n let inBlockComment = false;\n\n for (let i = openIdx; i < text.length; i++) {\n const ch = text[i]!;\n const next = text[i + 1];\n\n if (inLineComment) {\n if (ch === \"\\n\") inLineComment = false;\n continue;\n }\n if (inBlockComment) {\n if (ch === \"*\" && next === \"/\") {\n inBlockComment = false;\n i++;\n }\n continue;\n }\n\n if (!inSingle && !inDouble && !inTemplate) {\n if (ch === \"/\" && next === \"/\") {\n inLineComment = true;\n i++;\n continue;\n }\n if (ch === \"/\" && next === \"*\") {\n inBlockComment = true;\n i++;\n continue;\n }\n }\n\n if (!inDouble && !inTemplate && ch === \"'\" && text[i - 1] !== \"\\\\\") {\n inSingle = !inSingle;\n continue;\n }\n if (!inSingle && !inTemplate && ch === `\"` && text[i - 1] !== \"\\\\\") {\n inDouble = !inDouble;\n continue;\n }\n if (!inSingle && !inDouble && ch === \"`\" && text[i - 1] !== \"\\\\\") {\n inTemplate = !inTemplate;\n continue;\n }\n if (inSingle || inDouble || inTemplate) continue;\n\n if (ch === open) depth++;\n if (ch === close) {\n depth--;\n if (depth === 0) return i;\n }\n }\n return -1;\n}\n\n\n","import type { Command } from \"commander\";\n\nimport { shellInit } from \"./shellInit.js\";\n\nexport function registerShellCommands(program: Command) {\n const shell = program.command(\"shell\").description(\"Shell app utilities\");\n\n shell\n .command(\"init\")\n .description(\"Generate an Expo Router shell app that renders Comerge Studio\")\n .option(\"--out <dir>\", \"Output directory\", \"comerge-shell\")\n .requiredOption(\"--app-id <uuid>\", \"Comerge appId (required)\")\n .requiredOption(\"--api-key <key>\", \"Comerge apiKey (required)\")\n .option(\"--app-key <key>\", \"Bundle app key (default MicroMain)\", \"MicroMain\")\n .option(\"--yes\", \"Non-interactive; use defaults\", false)\n .option(\"--no-install\", \"Skip dependency install + expo prebuild\")\n .option(\n \"--package-manager <pm>\",\n \"Override package manager detection (pnpm|npm|yarn|bun)\",\n )\n .option(\"--studio-version <ver>\", \"Version to use for @comergehq/studio\", \"latest\")\n .action(async (opts) => {\n await shellInit({\n outDir: String(opts.out),\n appId: String(opts.appId ?? \"\"),\n apiKey: String(opts.apiKey ?? \"\"),\n appKey: String(opts.appKey ?? \"MicroMain\"),\n yes: Boolean(opts.yes),\n install: Boolean(opts.install),\n packageManager: opts.packageManager ? String(opts.packageManager) : null,\n studioVersion: String(opts.studioVersion ?? \"latest\"),\n });\n });\n}\n\n\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\n\nimport { CliError } from \"../lib/errors.js\";\nimport { resolveConfig } from \"../lib/config.js\";\nimport { startOAuthCallbackServer } from \"../lib/oauthCallbackServer.js\";\nimport { openBrowser } from \"../lib/browser.js\";\nimport { createSupabaseAuthHelpers } from \"../lib/supabase.js\";\nimport { clearSession, setSession } from \"../lib/sessionStore.js\";\nimport { createApiClient } from \"../lib/api.js\";\n\nexport function registerLoginCommand(program: Command) {\n program\n .command(\"login\")\n .description(\"Authenticate with Comerge\")\n .option(\"--api-key <pk>\", \"API Key (or set COMERGE_API_KEY)\")\n .option(\"--no-browser\", \"Do not open browser automatically; print the URL\")\n .option(\"--port <port>\", \"Local callback port (default: random available port)\")\n .option(\"--yes\", \"Non-interactive; do not prompt\", false)\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .action(async (opts) => {\n const config = await resolveConfig({\n apiKey: opts.apiKey ? String(opts.apiKey) : null,\n yes: Boolean(opts.yes),\n });\n const portRaw = typeof opts.port === \"string\" ? opts.port.trim() : \"\";\n let port: number | null = null;\n if (portRaw) {\n const parsed = Number(portRaw);\n if (!Number.isFinite(parsed) || parsed <= 0 || !Number.isInteger(parsed)) {\n throw new CliError(\"Invalid --port\", { exitCode: 2, hint: \"Example: --port 8085\" });\n }\n port = parsed;\n }\n\n const server = await startOAuthCallbackServer({ port });\n try {\n const supabase = createSupabaseAuthHelpers(config);\n const { url } = await supabase.startGoogleLogin({ redirectTo: server.redirectTo });\n\n const shouldOpenBrowser = Boolean((opts as any).browser ?? true);\n if (shouldOpenBrowser) {\n try {\n await openBrowser(url);\n console.log(pc.dim(\"Opened browser for login...\"));\n } catch (err) {\n console.error(pc.yellow(\"Could not open the browser automatically.\"));\n console.error(pc.dim((err as Error)?.message ?? String(err)));\n console.log(`Open this URL manually:\\n${url}`);\n }\n } else {\n console.log(`Open this URL to login:\\n${url}`);\n }\n\n const code = await server.waitForCode();\n const session = await supabase.exchangeCode({ code });\n await setSession(session);\n\n let me: unknown = null;\n try {\n const api = createApiClient(config);\n me = await api.getMe();\n } catch (err) {\n await clearSession().catch(() => {});\n throw err;\n }\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, me }, null, 2));\n } else {\n const profile = (me as any)?.responseObject as { id?: string; email?: string | null } | undefined;\n const label = profile?.email ? `${profile.email}` : profile?.id ? `user ${profile.id}` : \"user\";\n console.log(pc.green(`Logged in as ${label}.`));\n }\n } finally {\n await server.close();\n }\n });\n}\n\n\n","import { z } from \"zod\";\n\nimport { resolveStudioApiKey } from \"./apiKey.js\";\nimport { CliError } from \"./errors.js\";\n\nconst API_URL = \"https://comerge.ai\";\nconst CLIENT_KEY_HEADER = \"x-comerge-api-key\";\n\nconst urlSchema = z\n .string()\n .min(1)\n .transform((s) => s.trim())\n .refine((s) => {\n try {\n new URL(s);\n return true;\n } catch {\n return false;\n }\n }, \"Invalid URL\")\n .transform((s) => s.replace(/\\/+$/, \"\"));\n\nconst configSchema = z.object({\n apiUrl: urlSchema,\n supabaseUrl: urlSchema,\n supabaseAnonKey: z.string().min(1),\n});\n\nexport type CliConfig = z.infer<typeof configSchema>;\n\nexport type ResolveConfigOptions = {\n apiKey?: string | null;\n yes?: boolean;\n};\n\nconst studioConfigResponseSchema = z.object({\n success: z.boolean(),\n message: z.string(),\n responseObject: z\n .object({\n url: urlSchema,\n anonKey: z.string().min(1),\n })\n .optional(),\n statusCode: z.number(),\n});\n\nlet cachedByApiKey: { apiKey: string; cfg: CliConfig } | null = null;\nlet inFlight: Promise<CliConfig> | null = null;\n\nasync function readJsonSafe(res: Response): Promise<unknown | null> {\n const ct = res.headers.get(\"content-type\") ?? \"\";\n if (!ct.toLowerCase().includes(\"application/json\")) return null;\n try {\n return await res.json();\n } catch {\n return null;\n }\n}\n\nexport async function resolveConfig(opts?: ResolveConfigOptions): Promise<CliConfig> {\n const yes = Boolean(opts?.yes);\n const apiKey = await resolveStudioApiKey({ flagApiKey: opts?.apiKey ?? null, yes });\n\n if (cachedByApiKey?.apiKey === apiKey) return cachedByApiKey.cfg;\n if (inFlight) return inFlight;\n\n inFlight = (async () => {\n const apiUrl = API_URL;\n\n const url = new URL(\"/v1/public/studio-config\", apiUrl).toString();\n const res = await fetch(url, {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n [CLIENT_KEY_HEADER]: apiKey,\n },\n });\n\n const body = await readJsonSafe(res);\n if (!res.ok) {\n const msg =\n (body && typeof body === \"object\" && body && \"message\" in body && typeof (body as any).message === \"string\"\n ? (body as any).message\n : null) ?? `Failed to fetch studio config (${res.status})`;\n throw new CliError(msg, {\n exitCode: 1,\n hint: body ? JSON.stringify(body, null, 2) : \"Check your API Key and backend connectivity.\",\n });\n }\n\n const parsedResp = studioConfigResponseSchema.safeParse(body);\n if (!parsedResp.success || !parsedResp.data.success || !parsedResp.data.responseObject) {\n throw new CliError(\"Invalid studio-config response\", {\n exitCode: 1,\n hint: body ? JSON.stringify(body, null, 2) : null,\n });\n }\n\n const cfgRaw = {\n apiUrl,\n supabaseUrl: parsedResp.data.responseObject.url,\n supabaseAnonKey: parsedResp.data.responseObject.anonKey,\n };\n\n const parsedCfg = configSchema.safeParse(cfgRaw);\n if (!parsedCfg.success) {\n throw new CliError(\"Invalid CLI configuration\", {\n exitCode: 1,\n hint: parsedCfg.error.issues.map((i) => `${i.path.join(\".\") || \"config\"}: ${i.message}`).join(\"; \"),\n });\n }\n\n cachedByApiKey = { apiKey, cfg: parsedCfg.data };\n return parsedCfg.data;\n })().finally(() => {\n inFlight = null;\n });\n\n return inFlight;\n}\n\n\n","import prompts from \"prompts\";\n\nimport { CliError } from \"./errors.js\";\n\nfunction isInteractive(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nlet cachedApiKey: string | null = null;\n\nexport async function resolveStudioApiKey(params: {\n flagApiKey: string | null;\n yes: boolean;\n}): Promise<string> {\n if (cachedApiKey) return cachedApiKey;\n\n const fromFlag = (params.flagApiKey ?? \"\").trim();\n if (fromFlag) {\n cachedApiKey = fromFlag;\n return fromFlag;\n }\n\n const fromEnv = (process.env.COMERGE_API_KEY ?? \"\").trim();\n if (fromEnv) {\n cachedApiKey = fromEnv;\n return fromEnv;\n }\n\n if (params.yes || !isInteractive()) {\n throw new CliError(\"Missing required API Key\", {\n exitCode: 2,\n hint: \"Pass --api-key <pk_...> or set COMERGE_API_KEY.\",\n });\n }\n\n const res = await prompts(\n [\n {\n type: \"password\",\n name: \"apiKey\",\n message: \"API Key\",\n validate: (v: string) => (String(v || \"\").trim().length > 0 ? true : \"apiKey is required\"),\n },\n ],\n {\n onCancel: () => {\n throw new CliError(\"Cancelled\", { exitCode: 130 });\n },\n },\n );\n\n const apiKey = String(res.apiKey ?? \"\").trim();\n if (!apiKey) {\n throw new CliError(\"Missing required API Key\", { exitCode: 2 });\n }\n cachedApiKey = apiKey;\n return apiKey;\n}\n\n\n","import http from \"node:http\";\n\nimport { CliError } from \"./errors.js\";\n\nexport type OAuthCallbackServer = {\n redirectTo: string;\n waitForCode(): Promise<string>;\n close(): Promise<void>;\n};\n\nexport async function startOAuthCallbackServer(params?: {\n port?: number | null;\n timeoutMs?: number;\n}): Promise<OAuthCallbackServer> {\n const timeoutMs = params?.timeoutMs ?? 3 * 60_000;\n const requestedPort = params?.port ?? null;\n\n let resolveCode: ((code: string) => void) | null = null;\n let rejectCode: ((err: unknown) => void) | null = null;\n const codePromise = new Promise<string>((resolve, reject) => {\n resolveCode = resolve;\n rejectCode = reject;\n });\n\n const server = http.createServer((req, res) => {\n try {\n const base = `http://127.0.0.1`;\n const u = new URL(req.url ?? \"/\", base);\n const errorDescription = u.searchParams.get(\"error_description\");\n const error = u.searchParams.get(\"error\");\n const code = u.searchParams.get(\"code\");\n\n if (errorDescription || error) {\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(`<html><body><h3>Login failed</h3><p>${escapeHtml(errorDescription ?? error ?? \"Unknown error\")}</p></body></html>`);\n rejectCode?.(new CliError(\"Login failed\", { exitCode: 1, hint: errorDescription ?? error ?? undefined }));\n return;\n }\n\n if (!code) {\n res.writeHead(400, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(`<html><body><h3>Missing code</h3><p>No authorization code was provided.</p></body></html>`);\n return;\n }\n\n res.writeHead(200, { \"Content-Type\": \"text/html; charset=utf-8\" });\n res.end(\n `<html><body><h3>Login complete</h3><p>You can close this tab and return to the terminal.</p></body></html>`,\n );\n resolveCode?.(code);\n } catch (err) {\n rejectCode?.(err);\n res.writeHead(500, { \"Content-Type\": \"text/plain; charset=utf-8\" });\n res.end(\"Internal error\");\n } finally {\n try {\n server.close();\n } catch {}\n }\n });\n\n const listenPort = typeof requestedPort === \"number\" ? requestedPort : 0;\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject);\n server.listen(listenPort, \"127.0.0.1\", () => resolve());\n });\n\n const addr = server.address();\n if (!addr || typeof addr === \"string\") {\n server.close();\n throw new CliError(\"Failed to start callback server\", { exitCode: 1 });\n }\n\n const redirectTo = `http://127.0.0.1:${addr.port}/callback`;\n\n const timeout = setTimeout(() => {\n rejectCode?.(\n new CliError(\"Login timed out\", {\n exitCode: 1,\n hint: \"Try running `comerge login` again.\",\n }),\n );\n try {\n server.close();\n } catch {}\n }, timeoutMs).unref();\n\n const waitForCode = async () => {\n try {\n return await codePromise;\n } finally {\n clearTimeout(timeout);\n }\n };\n\n const close = async () => {\n clearTimeout(timeout);\n await new Promise<void>((resolve) => server.close(() => resolve())).catch(() => {});\n };\n\n return { redirectTo, waitForCode, close };\n}\n\nfunction escapeHtml(input: string): string {\n return input\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\n\n","import { execa } from \"execa\";\n\nimport { CliError } from \"./errors.js\";\n\nexport async function openBrowser(url: string): Promise<void> {\n const platform = process.platform;\n\n try {\n if (platform === \"darwin\") {\n await execa(\"open\", [url], { stdio: \"ignore\" });\n return;\n }\n if (platform === \"win32\") {\n await execa(\"cmd\", [\"/c\", \"start\", \"\", url], { stdio: \"ignore\", windowsHide: true });\n return;\n }\n await execa(\"xdg-open\", [url], { stdio: \"ignore\" });\n } catch (err) {\n throw new CliError(\"Failed to open browser automatically\", {\n exitCode: 1,\n hint: `Open this URL manually:\\n${url}\\n\\n${(err as Error)?.message ?? String(err)}`,\n });\n }\n}\n\n\n","import { createClient, type Session, type SupabaseClient } from \"@supabase/supabase-js\";\n\nimport type { CliConfig } from \"./config.js\";\nimport { CliError } from \"./errors.js\";\nimport type { StoredSession } from \"./sessionStore.js\";\n\ntype StorageLike = {\n getItem(key: string): string | null | Promise<string | null>;\n setItem(key: string, value: string): void | Promise<void>;\n removeItem(key: string): void | Promise<void>;\n};\n\nexport type SupabaseAuthHelpers = {\n startGoogleLogin(params: { redirectTo: string }): Promise<{ url: string }>;\n exchangeCode(params: { code: string }): Promise<StoredSession>;\n refreshWithStoredSession(params: { session: StoredSession }): Promise<StoredSession>;\n};\n\nfunction createInMemoryStorage(): StorageLike {\n const map = new Map<string, string>();\n return {\n getItem: (k) => map.get(k) ?? null,\n setItem: (k, v) => {\n map.set(k, v);\n },\n removeItem: (k) => {\n map.delete(k);\n },\n };\n}\n\nfunction createSupabaseClient(config: CliConfig, storage: StorageLike): SupabaseClient {\n return createClient(config.supabaseUrl, config.supabaseAnonKey, {\n auth: {\n flowType: \"pkce\",\n persistSession: false,\n autoRefreshToken: false,\n detectSessionInUrl: false,\n storage,\n },\n global: {\n headers: {\n \"X-Requested-By\": \"comerge-cli\",\n },\n },\n });\n}\n\nfunction toStoredSession(session: Session): StoredSession {\n if (!session.access_token || !session.refresh_token || !session.expires_at) {\n throw new CliError(\"Supabase session missing required fields\", { exitCode: 1 });\n }\n return {\n access_token: session.access_token,\n refresh_token: session.refresh_token,\n expires_at: session.expires_at,\n token_type: session.token_type ?? undefined,\n user: session.user ? { id: session.user.id, email: (session.user.email ?? null) as any } : undefined,\n };\n}\n\nexport function createSupabaseAuthHelpers(config: CliConfig): SupabaseAuthHelpers {\n const storage = createInMemoryStorage();\n const supabase = createSupabaseClient(config, storage);\n\n return {\n async startGoogleLogin(params: { redirectTo: string }) {\n const { data, error } = await supabase.auth.signInWithOAuth({\n provider: \"google\",\n options: {\n redirectTo: params.redirectTo,\n skipBrowserRedirect: true,\n queryParams: {\n access_type: \"offline\",\n prompt: \"consent\",\n },\n },\n });\n if (error) throw error;\n if (!data?.url) throw new CliError(\"Supabase did not return an OAuth URL\", { exitCode: 1 });\n return { url: data.url };\n },\n\n async exchangeCode(params: { code: string }) {\n const { data, error } = await supabase.auth.exchangeCodeForSession(params.code);\n if (error) throw error;\n if (!data?.session) throw new CliError(\"No session returned from Supabase\", { exitCode: 1 });\n return toStoredSession(data.session);\n },\n\n async refreshWithStoredSession(params: { session: StoredSession }) {\n const { data, error } = await supabase.auth.setSession({\n access_token: params.session.access_token,\n refresh_token: params.session.refresh_token,\n });\n if (error) throw error;\n if (!data?.session) throw new CliError(\"No session returned after refresh\", { exitCode: 1 });\n return toStoredSession(data.session);\n },\n };\n}\n\n\n","import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { CliError } from \"./errors.js\";\nimport { writeJsonAtomic } from \"./fs.js\";\n\nconst storedSessionSchema = z.object({\n access_token: z.string().min(1),\n refresh_token: z.string().min(1),\n expires_at: z.number().int().positive(),\n token_type: z.string().min(1).optional(),\n user: z\n .object({\n id: z.string().min(1),\n email: z.string().email().optional().nullable(),\n })\n .optional(),\n});\n\nexport type StoredSession = z.infer<typeof storedSessionSchema>;\n\nconst KEYTAR_SERVICE = \"comerge-cli\";\nconst KEYTAR_ACCOUNT = \"default\";\n\nfunction xdgConfigHome(): string {\n const v = process.env.XDG_CONFIG_HOME;\n if (typeof v === \"string\" && v.trim().length > 0) return v;\n return path.join(os.homedir(), \".config\");\n}\n\nfunction sessionFilePath(): string {\n return path.join(xdgConfigHome(), \"comerge\", \"session.json\");\n}\n\nasync function maybeLoadKeytar(): Promise<{\n getPassword(service: string, account: string): Promise<string | null>;\n setPassword(service: string, account: string, password: string): Promise<void>;\n deletePassword(service: string, account: string): Promise<boolean>;\n} | null> {\n try {\n const mod: any = await import(\"keytar\");\n const candidates = [mod?.default, mod].filter(Boolean);\n for (const c of candidates) {\n if (\n c &&\n typeof c.getPassword === \"function\" &&\n typeof c.setPassword === \"function\" &&\n typeof c.deletePassword === \"function\"\n ) {\n return c;\n }\n }\n return null;\n } catch {\n return null;\n }\n}\n\nasync function ensurePathPermissions(filePath: string): Promise<void> {\n const dir = path.dirname(filePath);\n await fs.mkdir(dir, { recursive: true });\n try {\n await fs.chmod(dir, 0o700);\n } catch {}\n try {\n await fs.chmod(filePath, 0o600);\n } catch {}\n}\n\nexport async function getSession(): Promise<StoredSession | null> {\n const keytar = await maybeLoadKeytar();\n if (keytar) {\n const raw = await keytar.getPassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT);\n if (!raw) return null;\n try {\n const parsed = storedSessionSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) return null;\n return parsed.data;\n } catch {\n return null;\n }\n }\n\n const fp = sessionFilePath();\n const raw = await fs.readFile(fp, \"utf8\").catch(() => null);\n if (!raw) return null;\n try {\n const parsed = storedSessionSchema.safeParse(JSON.parse(raw));\n if (!parsed.success) return null;\n await ensurePathPermissions(fp);\n return parsed.data;\n } catch {\n return null;\n }\n}\n\nexport async function setSession(session: StoredSession): Promise<void> {\n const parsed = storedSessionSchema.safeParse(session);\n if (!parsed.success) {\n throw new CliError(\"Refusing to store invalid session\", { exitCode: 1 });\n }\n\n const keytar = await maybeLoadKeytar();\n if (keytar) {\n await keytar.setPassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT, JSON.stringify(parsed.data));\n return;\n }\n\n const fp = sessionFilePath();\n await writeJsonAtomic(fp, parsed.data);\n await ensurePathPermissions(fp);\n}\n\nexport async function clearSession(): Promise<void> {\n const keytar = await maybeLoadKeytar();\n if (keytar) {\n await keytar.deletePassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT);\n return;\n }\n const fp = sessionFilePath();\n await fs.rm(fp, { force: true }).catch(() => {});\n}\n\n\n","import { CliError } from \"./errors.js\";\nimport type { CliConfig } from \"./config.js\";\nimport { getSession, setSession, type StoredSession } from \"./sessionStore.js\";\nimport { createSupabaseAuthHelpers } from \"./supabase.js\";\n\ntype Json = Record<string, unknown> | unknown[] | string | number | boolean | null;\n\nfunction shouldRefreshSoon(session: StoredSession, skewSeconds = 60): boolean {\n const nowSec = Math.floor(Date.now() / 1000);\n return session.expires_at <= nowSec + skewSeconds;\n}\n\nasync function readJsonSafe(res: Response): Promise<Json | null> {\n const ct = res.headers.get(\"content-type\") ?? \"\";\n if (!ct.toLowerCase().includes(\"application/json\")) return null;\n try {\n return (await res.json()) as Json;\n } catch {\n return null;\n }\n}\n\nasync function getAuthToken(config: CliConfig): Promise<{ token: string; session: StoredSession | null; fromEnv: boolean }> {\n const envToken = process.env.COMERGE_ACCESS_TOKEN;\n if (typeof envToken === \"string\" && envToken.trim().length > 0) {\n return { token: envToken.trim(), session: null, fromEnv: true };\n }\n\n let session = await getSession();\n if (!session) {\n throw new CliError(\"Not logged in\", {\n exitCode: 2,\n hint: \"Run `comerge login` first, or set COMERGE_ACCESS_TOKEN for CI.\",\n });\n }\n\n if (shouldRefreshSoon(session)) {\n try {\n const supabase = createSupabaseAuthHelpers(config);\n session = await supabase.refreshWithStoredSession({ session });\n await setSession(session);\n } catch (err) {\n void err;\n }\n }\n\n return { token: session.access_token, session, fromEnv: false };\n}\n\nexport type ApiClient = {\n getMe(): Promise<Json>;\n getApp(appId: string): Promise<Json>;\n presignImportUpload(payload: { file: { name: string; mimeType: string; size: number; checksumSha256?: string } }): Promise<Json>;\n importFromUpload(payload: { uploadId: string; appName?: string; threadId?: string; path?: string }): Promise<Json>;\n};\n\nexport function createApiClient(config: CliConfig): ApiClient {\n const cfg = config;\n\n async function request(path: string, init?: RequestInit): Promise<Json> {\n const { token, session, fromEnv } = await getAuthToken(cfg);\n const url = new URL(path, cfg.apiUrl).toString();\n\n const doFetch = async (bearer: string) => {\n const res = await fetch(url, {\n ...init,\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n ...(init?.headers ?? {}),\n Authorization: `Bearer ${bearer}`,\n },\n });\n return res;\n };\n\n let res = await doFetch(token);\n if (res.status === 401 && !fromEnv && session?.refresh_token) {\n const supabase = createSupabaseAuthHelpers(cfg);\n const refreshed = await supabase.refreshWithStoredSession({ session });\n await setSession(refreshed);\n res = await doFetch(refreshed.access_token);\n }\n\n if (!res.ok) {\n const body = await readJsonSafe(res);\n const msg =\n (body && typeof body === \"object\" && body && \"message\" in body && typeof (body as any).message === \"string\"\n ? (body as any).message\n : null) ?? `Request failed (${res.status})`;\n throw new CliError(msg, { exitCode: 1, hint: body ? JSON.stringify(body, null, 2) : null });\n }\n\n const json = await readJsonSafe(res);\n return json ?? null;\n }\n\n return {\n getMe: () => request(\"/v1/me\", { method: \"GET\" }),\n getApp: (appId: string) => request(`/v1/apps/${encodeURIComponent(appId)}`, { method: \"GET\" }),\n presignImportUpload: (payload) =>\n request(\"/v1/apps/import/upload/presign\", { method: \"POST\", body: JSON.stringify(payload) }),\n importFromUpload: (payload) => request(\"/v1/apps/import/upload\", { method: \"POST\", body: JSON.stringify(payload) }),\n };\n}\n\n\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\n\nimport { clearSession } from \"../lib/sessionStore.js\";\n\nexport function registerLogoutCommand(program: Command) {\n program\n .command(\"logout\")\n .description(\"Clear local Comerge authentication session\")\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .action(async (opts) => {\n await clearSession();\n const envToken = process.env.COMERGE_ACCESS_TOKEN;\n if (opts.json) {\n console.log(JSON.stringify({ success: true, cleared: true, envTokenPresent: Boolean(envToken) }, null, 2));\n return;\n }\n console.log(pc.green(\"Logged out (local session cleared).\"));\n if (envToken) {\n console.log(pc.dim(\"Note: COMERGE_ACCESS_TOKEN is set in your environment; it will still authenticate requests.\"));\n }\n });\n}\n\n\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\n\nimport { resolveConfig } from \"../lib/config.js\";\nimport { createApiClient } from \"../lib/api.js\";\n\nexport function registerWhoamiCommand(program: Command) {\n program\n .command(\"whoami\")\n .description(\"Show the currently authenticated Comerge user\")\n .option(\"--api-key <pk>\", \"API Key (or set COMERGE_API_KEY)\")\n .option(\"--yes\", \"Non-interactive; do not prompt\", false)\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .action(async (opts) => {\n const config = await resolveConfig({\n apiKey: opts.apiKey ? String(opts.apiKey) : null,\n yes: Boolean(opts.yes),\n });\n const api = createApiClient(config);\n const me = await api.getMe();\n if (opts.json) {\n console.log(JSON.stringify(me, null, 2));\n return;\n }\n const profile = (me as any)?.responseObject as { id?: string; email?: string | null } | undefined;\n const label = profile?.email ? `${profile.email}` : profile?.id ? `user ${profile.id}` : \"unknown user\";\n console.log(pc.green(label));\n });\n}\n\n\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\n\nimport { CliError } from \"../lib/errors.js\";\nimport { importLocal } from \"../lib/importLocal.js\";\n\nexport function registerImportCommands(program: Command) {\n const imp = program.command(\"import\").description(\"Import source code into Comerge\");\n\n imp\n .command(\"local\")\n .description(\"Import the current local Expo project\")\n .option(\"--api-key <pk>\", \"API Key (or set COMERGE_API_KEY)\")\n .option(\"--yes\", \"Non-interactive; do not prompt\", false)\n .option(\"--name <appName>\", \"Override app name (default: derived from Expo config / folder name)\")\n .option(\"--path <subdir>\", \"Optional subdirectory to import\")\n .option(\"--max-wait <sec>\", \"Max time to wait for import to finish (default: 1200)\", \"1200\")\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .option(\"--no-wait\", \"Do not poll for completion; return immediately after enqueue\", false)\n .option(\"--no-include-dotenv\", \"Exclude .env* files from the uploaded archive\", false)\n .option(\"--dry-run\", \"Show what would be uploaded (no upload)\", false)\n .action(async (opts) => {\n const maxWaitSec = Number(String(opts.maxWait ?? \"1200\").trim());\n if (!Number.isFinite(maxWaitSec) || maxWaitSec <= 0) {\n throw new CliError(\"Invalid --max-wait\", { exitCode: 2, hint: \"Example: --max-wait 1200\" });\n }\n\n const res = await importLocal({\n apiKey: opts.apiKey ? String(opts.apiKey) : null,\n yes: Boolean(opts.yes),\n appName: opts.name ? String(opts.name) : null,\n subdir: opts.path ? String(opts.path) : null,\n maxWaitMs: Math.floor(maxWaitSec * 1000),\n noWait: Boolean(opts.noWait),\n json: Boolean(opts.json),\n includeDotenv: Boolean(opts.includeDotenv),\n dryRun: Boolean(opts.dryRun),\n });\n\n if (Boolean(opts.json)) {\n console.log(JSON.stringify(res, null, 2));\n return;\n }\n\n console.log(pc.green(`Import accepted. appId=${res.appId}`));\n if (res.status && !opts.noWait) {\n console.log(pc.dim(`Final status: ${res.status}`));\n }\n });\n}\n\n\n","import path from \"node:path\";\n\nimport pc from \"picocolors\";\n\nimport { createApiClient } from \"./api.js\";\nimport { resolveConfig } from \"./config.js\";\nimport { CliError } from \"./errors.js\";\nimport { findExpoProjectRoot } from \"./projectDetect.js\";\nimport { canUseGit, listFilesGit } from \"./gitFiles.js\";\nimport { listFilesFs } from \"./fileSelection.js\";\nimport { computeStats, createZip, sha256FileHex } from \"./zip.js\";\nimport { uploadPresigned } from \"./upload.js\";\n\nexport type ImportLocalParams = {\n apiKey?: string | null;\n yes?: boolean;\n appName: string | null;\n subdir: string | null;\n maxWaitMs: number;\n noWait: boolean;\n json: boolean;\n includeDotenv: boolean;\n dryRun: boolean;\n};\n\nexport type ImportLocalResult = {\n uploadId: string;\n appId: string;\n projectId?: string;\n threadId?: string;\n status?: string;\n};\n\nconst SAFE_PATH_RE = /^[A-Za-z0-9._/-]+$/;\nconst COMERGE_SHELL_SEGMENT_RE = /(^|\\/)comerge-shell[^/]*(\\/|$)/;\n\nfunction sleep(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n\nfunction formatBytes(bytes: number): string {\n const units = [\"B\", \"KB\", \"MB\", \"GB\"] as const;\n let v = bytes;\n let i = 0;\n while (v >= 1024 && i < units.length - 1) {\n v /= 1024;\n i++;\n }\n return `${v.toFixed(i === 0 ? 0 : 1)} ${units[i]}`;\n}\n\nfunction deriveAppName(projectRoot: string): string {\n const base = path.basename(projectRoot);\n return base || \"Imported App\";\n}\n\nfunction validateOptionalSubdir(subdir: string | null): string | null {\n if (!subdir) return null;\n const s = subdir.trim().replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n if (!s) return null;\n if (!SAFE_PATH_RE.test(s) || s.includes(\"..\")) {\n throw new CliError(\"Invalid --path\", {\n exitCode: 2,\n hint: \"Use a safe subdirectory like packages/mobile-app (letters/numbers/._-/ only).\",\n });\n }\n return s;\n}\n\nfunction getAppStatus(appResp: any): { status: string | null; statusError: string | null } {\n const obj = appResp?.responseObject;\n const status = typeof obj?.status === \"string\" ? obj.status : null;\n const statusError = typeof obj?.statusError === \"string\" ? obj.statusError : null;\n return { status, statusError };\n}\n\nexport async function importLocal(params: ImportLocalParams): Promise<ImportLocalResult> {\n const cfg = await resolveConfig({ apiKey: params.apiKey ?? null, yes: Boolean(params.yes) });\n const api = createApiClient(cfg);\n\n const projectRoot = await findExpoProjectRoot(process.cwd());\n const subdir = validateOptionalSubdir(params.subdir);\n const importRoot = subdir ? path.join(projectRoot, subdir) : projectRoot;\n\n const appName = (params.appName ?? \"\").trim() || deriveAppName(projectRoot);\n\n const log = (msg: string) => {\n if (params.json) return;\n console.log(msg);\n };\n\n log(pc.dim(`Project: ${projectRoot}`));\n if (subdir) log(pc.dim(`Import path: ${subdir}`));\n\n let files: string[] = [];\n const useGit = await canUseGit(projectRoot);\n if (useGit) {\n const gitPaths = await listFilesGit({ cwd: projectRoot, pathspec: subdir ?? null });\n files = gitPaths.filter((p) => !COMERGE_SHELL_SEGMENT_RE.test(p.replace(/\\\\/g, \"/\")));\n if (!params.includeDotenv) {\n files = files.filter((p) => !path.posix.basename(p).startsWith(\".env\"));\n }\n } else {\n files = await listFilesFs({ root: importRoot, includeDotenv: params.includeDotenv });\n if (subdir) {\n files = files.map((p) => path.posix.join(subdir, p));\n }\n }\n\n if (files.length === 0) {\n throw new CliError(\"No files found to upload\", { exitCode: 2, hint: \"Check .gitignore rules or try without --path.\" });\n }\n\n const stats = await computeStats({ root: projectRoot, files, largestN: 10 });\n log(pc.dim(`Files: ${stats.fileCount} Total: ${formatBytes(stats.totalBytes)}`));\n\n if (params.dryRun) {\n const top = stats.largestFiles.slice(0, 10);\n if (top.length > 0) {\n log(pc.dim(\"Largest files:\"));\n for (const f of top) {\n log(pc.dim(` ${formatBytes(f.bytes)} ${f.path}`));\n }\n }\n return { uploadId: \"dry-run\", appId: \"dry-run\", status: \"dry-run\" };\n }\n\n log(pc.dim(\"Creating zip...\"));\n const { zipPath } = await createZip({ root: projectRoot, files, zipName: \"import.zip\" });\n const zipSha = await sha256FileHex(zipPath);\n const zipSize = (await (await import(\"node:fs/promises\")).stat(zipPath)).size;\n\n log(pc.dim(\"Requesting upload URL...\"));\n const presignResp: any = await api.presignImportUpload({\n file: {\n name: \"import.zip\",\n mimeType: \"application/zip\",\n size: zipSize,\n checksumSha256: zipSha,\n },\n });\n const presign = presignResp?.responseObject;\n const uploadId = String(presign?.uploadId ?? \"\");\n const uploadUrl = String(presign?.uploadUrl ?? \"\");\n const headers = (presign?.headers ?? {}) as Record<string, string>;\n if (!uploadId || !uploadUrl) {\n throw new CliError(\"Presign response missing upload fields\", { exitCode: 1, hint: JSON.stringify(presignResp, null, 2) });\n }\n\n log(pc.dim(\"Uploading zip...\"));\n let lastPct = -1;\n await uploadPresigned({\n uploadUrl,\n headers,\n filePath: zipPath,\n onProgress: ({ sentBytes, totalBytes }) => {\n if (params.json) return;\n const pct = totalBytes > 0 ? Math.floor((sentBytes / totalBytes) * 100) : 0;\n if (pct !== lastPct && (pct % 5 === 0 || pct === 100)) {\n lastPct = pct;\n process.stdout.write(pc.dim(`Upload ${pct}%\\r`));\n }\n },\n });\n if (!params.json) process.stdout.write(\"\\n\");\n\n log(pc.dim(\"Triggering import...\"));\n const importResp: any = await api.importFromUpload({\n uploadId,\n appName,\n path: subdir ?? undefined,\n });\n const importObj = importResp?.responseObject;\n const appId = String(importObj?.appId ?? \"\");\n const projectId = importObj?.projectId ? String(importObj.projectId) : undefined;\n const threadId = importObj?.threadId ? String(importObj.threadId) : undefined;\n if (!appId) {\n throw new CliError(\"Import response missing appId\", { exitCode: 1, hint: JSON.stringify(importResp, null, 2) });\n }\n\n if (params.noWait) {\n return { uploadId, appId, projectId, threadId, status: \"accepted\" };\n }\n\n log(pc.dim(\"Waiting for build...\"));\n const startedAt = Date.now();\n let delay = 2000;\n let lastStatus: string | null = null;\n\n while (Date.now() - startedAt < params.maxWaitMs) {\n const appResp: any = await api.getApp(appId);\n const { status, statusError } = getAppStatus(appResp);\n if (status && status !== lastStatus) {\n lastStatus = status;\n log(pc.dim(`Status: ${status}`));\n }\n if (status === \"ready\") {\n return { uploadId, appId, projectId, threadId, status };\n }\n if (status === \"error\") {\n throw new CliError(\"Import failed\", { exitCode: 1, hint: statusError ?? \"App status is error\" });\n }\n await sleep(delay);\n delay = Math.min(10_000, Math.floor(delay * 1.4));\n }\n\n throw new CliError(\"Timed out waiting for import\", {\n exitCode: 1,\n hint: `Try again with --max-wait or check app status with: comerge import local --no-wait`,\n });\n}\n\n\n","import { execa } from \"execa\";\n\nexport async function canUseGit(cwd: string): Promise<boolean> {\n try {\n const res = await execa(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], { cwd, stdio: \"ignore\" });\n return res.exitCode === 0;\n } catch {\n return false;\n }\n}\n\nexport function parseGitLsFilesZ(buf: Buffer): string[] {\n return buf\n .toString(\"utf8\")\n .split(\"\\0\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n}\n\nexport async function listFilesGit(params: { cwd: string; pathspec?: string | null }): Promise<string[]> {\n const args = [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\"];\n if (params.pathspec) {\n args.push(\"--\", params.pathspec);\n }\n const res = await execa(\"git\", args, { cwd: params.cwd, stdout: \"pipe\", stderr: \"ignore\" });\n return parseGitLsFilesZ(Buffer.from(res.stdout ?? \"\", \"utf8\"));\n}\n\n\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport fg from \"fast-glob\";\nimport ignore from \"ignore\";\n\nconst BUILTIN_IGNORES = [\n \"**/node_modules/**\",\n \"**/.git/**\",\n \"**/.expo/**\",\n \"**/dist/**\",\n \"**/build/**\",\n \"**/coverage/**\",\n \"**/.turbo/**\",\n \"**/.next/**\",\n \"**/ios/build/**\",\n \"**/android/build/**\",\n \"**/.pnpm-store/**\",\n \"**/comerge-shell*/**\",\n] as const;\n\nfunction normalizeRel(p: string): string {\n return p.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nasync function readGitignore(root: string): Promise<string> {\n const fp = path.join(root, \".gitignore\");\n return await fs.readFile(fp, \"utf8\").catch(() => \"\");\n}\n\nexport async function listFilesFs(params: { root: string; includeDotenv: boolean }): Promise<string[]> {\n const ig = ignore();\n const raw = await readGitignore(params.root);\n if (raw) ig.add(raw);\n\n const entries = await fg([\"**/*\"], {\n cwd: params.root,\n onlyFiles: true,\n dot: true,\n followSymbolicLinks: false,\n unique: true,\n ignore: [...BUILTIN_IGNORES],\n });\n\n const filtered = entries.filter((p) => {\n const rel = normalizeRel(p);\n if (!params.includeDotenv && path.posix.basename(rel).startsWith(\".env\")) return false;\n return !ig.ignores(rel);\n });\n\n return filtered.map(normalizeRel);\n}\n\n\n","import crypto from \"node:crypto\";\nimport fs from \"node:fs\";\nimport fsp from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport archiver from \"archiver\";\n\nimport { CliError } from \"./errors.js\";\n\nexport const MAX_IMPORT_ZIP_BYTES = 50 * 1024 * 1024;\nexport const MAX_IMPORT_FILE_COUNT = 25_000;\n\nexport type ZipStats = {\n fileCount: number;\n totalBytes: number;\n largestFiles: Array<{ path: string; bytes: number }>;\n};\n\nfunction normalizeRel(p: string): string {\n return p.replace(/\\\\/g, \"/\").replace(/\\/+/g, \"/\").replace(/^\\/+/, \"\");\n}\n\nexport function validateRelPath(rel: string): string {\n const p = normalizeRel(rel);\n if (!p) throw new CliError(\"Invalid file path\", { exitCode: 1 });\n if (p.startsWith(\"../\") || p.includes(\"/../\") || p === \"..\") {\n throw new CliError(\"Refusing to zip path traversal entry\", { exitCode: 1, hint: p });\n }\n if (p.startsWith(\"/\")) {\n throw new CliError(\"Refusing to zip absolute path\", { exitCode: 1, hint: p });\n }\n return p;\n}\n\nexport async function computeStats(params: { root: string; files: string[]; largestN?: number }): Promise<ZipStats> {\n const largestN = params.largestN ?? 10;\n if (params.files.length > MAX_IMPORT_FILE_COUNT) {\n throw new CliError(\"Too many files to import\", {\n exitCode: 2,\n hint: `File count ${params.files.length} exceeds limit ${MAX_IMPORT_FILE_COUNT}. Use --path or add ignores.`,\n });\n }\n\n let totalBytes = 0;\n const largest: Array<{ path: string; bytes: number }> = [];\n\n for (const rel0 of params.files) {\n const rel = validateRelPath(rel0);\n const abs = path.join(params.root, rel);\n const st = await fsp.stat(abs);\n if (!st.isFile()) continue;\n const bytes = st.size;\n totalBytes += bytes;\n if (largestN > 0) {\n largest.push({ path: rel, bytes });\n }\n }\n\n largest.sort((a, b) => b.bytes - a.bytes);\n return {\n fileCount: params.files.length,\n totalBytes,\n largestFiles: largest.slice(0, largestN),\n };\n}\n\nexport async function createZip(params: { root: string; files: string[]; zipName?: string }): Promise<{ zipPath: string }> {\n const zipName = (params.zipName ?? \"import.zip\").replace(/[^a-zA-Z0-9._-]+/g, \"_\");\n const tmpDir = await fsp.mkdtemp(path.join(os.tmpdir(), \"comerge-import-\"));\n const zipPath = path.join(tmpDir, zipName);\n\n await new Promise<void>((resolve, reject) => {\n const output = fs.createWriteStream(zipPath);\n const archive = archiver(\"zip\", { zlib: { level: 9 } });\n output.on(\"close\", () => resolve());\n output.on(\"error\", (err) => reject(err));\n archive.on(\"warning\", (err: any) => {\n // Treat warnings as errors for safety.\n reject(err);\n });\n archive.on(\"error\", (err: any) => reject(err));\n\n archive.pipe(output);\n for (const rel0 of params.files) {\n const rel = validateRelPath(rel0);\n const abs = path.join(params.root, rel);\n archive.file(abs, { name: rel });\n }\n void archive.finalize();\n });\n\n const st = await fsp.stat(zipPath);\n if (st.size > MAX_IMPORT_ZIP_BYTES) {\n throw new CliError(\"Archive exceeds max upload size\", {\n exitCode: 2,\n hint: `Zip size ${st.size} bytes exceeds limit ${MAX_IMPORT_ZIP_BYTES} bytes. Use --path or add ignores.`,\n });\n }\n\n return { zipPath };\n}\n\nexport async function sha256FileHex(filePath: string): Promise<string> {\n const hash = crypto.createHash(\"sha256\");\n await new Promise<void>((resolve, reject) => {\n const s = fs.createReadStream(filePath);\n s.on(\"data\", (chunk) => hash.update(chunk));\n s.on(\"error\", reject);\n s.on(\"end\", () => resolve());\n });\n return hash.digest(\"hex\");\n}\n\n\n","import fs from \"node:fs\";\nimport { PassThrough } from \"node:stream\";\n\nimport { CliError } from \"./errors.js\";\n\nexport async function uploadPresigned(params: {\n uploadUrl: string;\n headers: Record<string, string>;\n filePath: string;\n onProgress?: (p: { sentBytes: number; totalBytes: number }) => void;\n}): Promise<void> {\n const st = await fs.promises.stat(params.filePath).catch(() => null);\n if (!st || !st.isFile()) throw new CliError(\"Upload file not found\", { exitCode: 2 });\n const totalBytes = st.size;\n\n const fileStream = fs.createReadStream(params.filePath);\n const pass = new PassThrough();\n\n let sent = 0;\n fileStream.on(\"data\", (chunk) => {\n sent += chunk.length;\n params.onProgress?.({ sentBytes: sent, totalBytes });\n });\n fileStream.on(\"error\", (err) => pass.destroy(err));\n fileStream.pipe(pass);\n\n const res = await fetch(params.uploadUrl, {\n method: \"PUT\",\n headers: params.headers,\n body: pass as any,\n duplex: \"half\" as any,\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"\");\n throw new CliError(\"Upload failed\", {\n exitCode: 1,\n hint: `Status: ${res.status}\\n${text}`.trim() || null,\n });\n }\n}\n\n\n","import type { Command } from \"commander\";\nimport pc from \"picocolors\";\n\nimport { CliError } from \"../lib/errors.js\";\nimport { initLocal } from \"../lib/initLocal.js\";\n\nexport function registerInitCommands(program: Command) {\n const init = program.command(\"init\").description(\"Import to Comerge + generate shell wrapper\");\n\n init\n .command(\"local\")\n .description(\"Login if needed, import the local Expo project, then generate the shell wrapper\")\n .option(\"--api-key <pk>\", \"API Key (or set COMERGE_API_KEY)\")\n .option(\"--app-key <key>\", \"Bundle app key\", \"MicroMain\")\n .option(\"--out <dir>\", \"Output directory for shell wrapper\", \"comerge-shell\")\n .option(\"--no-install\", \"Skip dependency install + expo prebuild in generated shell\")\n .option(\"--package-manager <pm>\", \"Override package manager detection (pnpm|npm|yarn|bun)\")\n .option(\"--studio-version <ver>\", \"Version to use for @comergehq/studio\", \"latest\")\n .option(\"--name <appName>\", \"Override imported app name\")\n .option(\"--path <subdir>\", \"Optional subdirectory to import\")\n .option(\"--max-wait <sec>\", \"Max time to wait for import to finish (default: 1200)\", \"1200\")\n .option(\"--no-wait\", \"Do not poll for completion; generate shell immediately\", false)\n .option(\"--no-include-dotenv\", \"Exclude .env* files from the uploaded archive\")\n .option(\"--dry-run\", \"Show what would be uploaded (no login/import/shell)\", false)\n .option(\"--yes\", \"Non-interactive; do not prompt\", false)\n .option(\"--json\", \"Output machine-readable JSON\", false)\n .action(async (opts) => {\n const maxWaitSec = Number(String(opts.maxWait ?? \"1200\").trim());\n if (!Number.isFinite(maxWaitSec) || maxWaitSec <= 0) {\n throw new CliError(\"Invalid --max-wait\", { exitCode: 2, hint: \"Example: --max-wait 1200\" });\n }\n\n const res = await initLocal({\n apiKey: opts.apiKey ? String(opts.apiKey) : null,\n appKey: opts.appKey ? String(opts.appKey) : \"MicroMain\",\n outDir: opts.out ? String(opts.out) : \"comerge-shell\",\n install: Boolean(opts.install),\n packageManager: opts.packageManager ? String(opts.packageManager) : null,\n studioVersion: opts.studioVersion ? String(opts.studioVersion) : \"latest\",\n appName: opts.name ? String(opts.name) : null,\n subdir: opts.path ? String(opts.path) : null,\n maxWaitMs: Math.floor(maxWaitSec * 1000),\n noWait: Boolean(opts.noWait),\n includeDotenv: Boolean(opts.includeDotenv),\n dryRun: Boolean(opts.dryRun),\n yes: Boolean(opts.yes),\n json: Boolean(opts.json),\n });\n\n if (opts.json) {\n console.log(JSON.stringify(res, null, 2));\n return;\n }\n\n console.log(pc.green(`Done. appId=${res.appId}`));\n if (res.status) console.log(pc.dim(`Status: ${res.status}`));\n if (res.noWait) console.log(pc.yellow(\"Note: --no-wait was used; bundles may still be building.\"));\n });\n}\n\n\n","import pc from \"picocolors\";\n\nimport { ensureAuth } from \"./ensureAuth.js\";\nimport { importLocal } from \"./importLocal.js\";\nimport { resolveStudioApiKey } from \"./apiKey.js\";\nimport { shellInit } from \"../commands/shellInit.js\";\n\nexport type InitLocalParams = {\n apiKey: string | null;\n appKey: string;\n outDir: string;\n install: boolean;\n packageManager: string | null;\n studioVersion: string;\n\n appName: string | null;\n subdir: string | null;\n maxWaitMs: number;\n noWait: boolean;\n includeDotenv: boolean;\n dryRun: boolean;\n\n yes: boolean;\n json: boolean;\n};\n\nexport type InitLocalResult = {\n appId: string;\n uploadId?: string;\n projectId?: string;\n threadId?: string;\n status?: string;\n shellOutDir: string;\n noWait: boolean;\n};\n\nexport async function initLocal(params: InitLocalParams): Promise<InitLocalResult> {\n if (params.dryRun) {\n const res = await importLocal({\n apiKey: params.apiKey,\n yes: params.yes,\n appName: params.appName,\n subdir: params.subdir,\n maxWaitMs: params.maxWaitMs,\n noWait: true,\n json: params.json,\n includeDotenv: params.includeDotenv,\n dryRun: true,\n });\n return {\n appId: res.appId,\n uploadId: res.uploadId,\n projectId: res.projectId,\n threadId: res.threadId,\n status: res.status,\n shellOutDir: params.outDir,\n noWait: params.noWait,\n };\n }\n\n const apiKey = await resolveStudioApiKey({ flagApiKey: params.apiKey, yes: params.yes });\n await ensureAuth({ apiKey, yes: params.yes, json: params.json });\n const appKey = String(params.appKey || \"MicroMain\").trim() || \"MicroMain\";\n\n if (!params.json) console.log(pc.dim(\"Importing project...\"));\n const imported = await importLocal({\n apiKey,\n yes: params.yes,\n appName: params.appName,\n subdir: params.subdir,\n maxWaitMs: params.maxWaitMs,\n noWait: params.noWait,\n json: params.json,\n includeDotenv: params.includeDotenv,\n dryRun: false,\n });\n\n if (!params.json) console.log(pc.dim(\"Generating shell...\"));\n await shellInit({\n outDir: params.outDir,\n appId: imported.appId,\n apiKey,\n appKey,\n yes: true,\n install: params.install,\n packageManager: params.packageManager,\n studioVersion: params.studioVersion,\n });\n\n return {\n appId: imported.appId,\n uploadId: imported.uploadId,\n projectId: imported.projectId,\n threadId: imported.threadId,\n status: imported.status,\n shellOutDir: params.outDir,\n noWait: params.noWait,\n };\n}\n\n\n","import pc from \"picocolors\";\n\nimport { CliError } from \"./errors.js\";\nimport { resolveConfig } from \"./config.js\";\nimport { createApiClient } from \"./api.js\";\nimport { startOAuthCallbackServer } from \"./oauthCallbackServer.js\";\nimport { openBrowser } from \"./browser.js\";\nimport { createSupabaseAuthHelpers } from \"./supabase.js\";\nimport { clearSession, getSession, setSession } from \"./sessionStore.js\";\n\nfunction isInteractive(): boolean {\n return Boolean(process.stdin.isTTY && process.stdout.isTTY);\n}\n\nasync function validateBackendSession(params?: { apiKey?: string | null; yes?: boolean }): Promise<void> {\n const cfg = await resolveConfig({ apiKey: params?.apiKey ?? null, yes: Boolean(params?.yes) });\n const api = createApiClient(cfg);\n await api.getMe();\n}\n\nexport async function ensureAuth(params?: { apiKey?: string | null; yes?: boolean; json?: boolean }): Promise<void> {\n const envToken = process.env.COMERGE_ACCESS_TOKEN;\n if (typeof envToken === \"string\" && envToken.trim().length > 0) return;\n\n const existing = await getSession();\n if (existing) {\n try {\n await validateBackendSession({ apiKey: params?.apiKey ?? null, yes: params?.yes });\n return;\n } catch {\n // Continue into login flow if interactive; otherwise fail.\n }\n }\n\n const interactive = isInteractive();\n const yes = Boolean(params?.yes);\n if (!interactive || yes) {\n throw new CliError(\"Not logged in\", {\n exitCode: 2,\n hint: \"Run `comerge login` first, or set COMERGE_ACCESS_TOKEN for CI.\",\n });\n }\n\n const cfg = await resolveConfig({ apiKey: params?.apiKey ?? null, yes: Boolean(params?.yes) });\n const server = await startOAuthCallbackServer({ port: null });\n try {\n const supabase = createSupabaseAuthHelpers(cfg);\n const { url } = await supabase.startGoogleLogin({ redirectTo: server.redirectTo });\n\n try {\n await openBrowser(url);\n if (!params?.json) console.log(pc.dim(\"Opened browser for login...\"));\n } catch {\n if (!params?.json) {\n console.log(pc.yellow(\"Could not open the browser automatically.\"));\n console.log(`Open this URL manually:\\n${url}`);\n }\n }\n\n const code = await server.waitForCode();\n const session = await supabase.exchangeCode({ code });\n await setSession(session);\n\n try {\n await validateBackendSession({ apiKey: params?.apiKey ?? null, yes: params?.yes });\n } catch (err) {\n await clearSession().catch(() => {});\n throw err;\n }\n } finally {\n await server.close();\n }\n}\n\n\n"],"mappings":"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","names":["pc","path","fse","main","fs","exists","fs","fs","path","fs","path","fs","path","fse","path","fse","path","fse","exists","fs","fs","fs","fs","path","fs","fse","pc","prompts","prompts","execa","execa","fs","os","path","z","z","path","os","fs","raw","readJsonSafe","path","res","pc","pc","pc","pc","pc","pc","path","pc","execa","fs","path","normalizeRel","fs","os","path","normalizeRel","path","os","fs","fs","fs","path","pc","pc","pc","pc","pc","isInteractive","pc","pc","pc","require","pc"]}
|