@zivis/cli 0.1.0-alpha.4 → 0.1.0-alpha.5
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.
|
@@ -3,6 +3,20 @@ import { login, getStorageName, saveSessionEntry, loadTokens } from "@zivis/mcp/
|
|
|
3
3
|
import { DEFAULT_CONFIG } from "@zivis/mcp/types";
|
|
4
4
|
import { fetchUserOrgs, extractEmail } from "../../internal/orgs.js";
|
|
5
5
|
import { ensureProjectBinding } from "../../internal/project-binding.js";
|
|
6
|
+
/** Parse "received org_01XXX" out of the JWT mismatch error message. */
|
|
7
|
+
function parseReceivedOrgId(msg) {
|
|
8
|
+
const m = msg.match(/received (org_\w+)/);
|
|
9
|
+
return m ? m[1] : null;
|
|
10
|
+
}
|
|
11
|
+
async function prompt(question) {
|
|
12
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
|
|
13
|
+
try {
|
|
14
|
+
return (await rl.question(question)).trim();
|
|
15
|
+
}
|
|
16
|
+
finally {
|
|
17
|
+
rl.close();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
6
20
|
export async function initCommand(opts) {
|
|
7
21
|
const config = DEFAULT_CONFIG;
|
|
8
22
|
const session = opts.session || "default";
|
|
@@ -12,7 +26,8 @@ export async function initCommand(opts) {
|
|
|
12
26
|
if (stored) {
|
|
13
27
|
bootstrapToken = stored.access_token;
|
|
14
28
|
const email = extractEmail(stored.id_token);
|
|
15
|
-
console.log(`Using existing session (${email})
|
|
29
|
+
console.log(`Using existing session (${email}).`);
|
|
30
|
+
console.log(`To force re-login first: zivis auth logout && zivis auth init\n`);
|
|
16
31
|
}
|
|
17
32
|
else {
|
|
18
33
|
console.log("Step 1/2: Authenticate (browser will open)...");
|
|
@@ -42,53 +57,75 @@ export async function initCommand(opts) {
|
|
|
42
57
|
}
|
|
43
58
|
let selectedOrg = orgs[0];
|
|
44
59
|
if (orgs.length > 1) {
|
|
45
|
-
console.log("
|
|
46
|
-
orgs.forEach((org, i) => {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const idx = parseInt(answer, 10) - 1;
|
|
53
|
-
if (isNaN(idx) || idx < 0 || idx >= orgs.length) {
|
|
54
|
-
console.error("Invalid selection.");
|
|
55
|
-
process.exit(1);
|
|
56
|
-
}
|
|
57
|
-
selectedOrg = orgs[idx];
|
|
58
|
-
}
|
|
59
|
-
finally {
|
|
60
|
-
rl.close();
|
|
60
|
+
console.log("Your organizations:");
|
|
61
|
+
orgs.forEach((org, i) => console.log(` ${i + 1}. ${org.name}`));
|
|
62
|
+
const answer = await prompt(`\nSelect org [1-${orgs.length}]: `);
|
|
63
|
+
const idx = parseInt(answer, 10) - 1;
|
|
64
|
+
if (isNaN(idx) || idx < 0 || idx >= orgs.length) {
|
|
65
|
+
console.error("Invalid selection.");
|
|
66
|
+
process.exit(1);
|
|
61
67
|
}
|
|
68
|
+
selectedOrg = orgs[idx];
|
|
62
69
|
}
|
|
63
70
|
else {
|
|
64
|
-
console.log(
|
|
71
|
+
console.log(`One org found: ${selectedOrg.name}`);
|
|
65
72
|
}
|
|
66
73
|
if (!selectedOrg.workosOrgId) {
|
|
67
74
|
console.error(`Org "${selectedOrg.name}" has no WorkOS organization ID — cannot scope login.`);
|
|
68
75
|
process.exit(1);
|
|
69
76
|
}
|
|
70
|
-
|
|
77
|
+
// Attempt org-scoped login, with graceful handling for browser-session mismatches
|
|
71
78
|
let scopedTokens;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
79
|
+
let finalOrgId = selectedOrg.workosOrgId;
|
|
80
|
+
let finalOrgName = selectedOrg.name;
|
|
81
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
82
|
+
console.log(`\n${stored ? "Step 1/1" : "Step 2/2"}: Logging in to ${finalOrgName} (browser will open)...`);
|
|
83
|
+
try {
|
|
84
|
+
scopedTokens = await login(config, session, finalOrgId, {
|
|
85
|
+
orgName: finalOrgName,
|
|
86
|
+
skipConfirm: true,
|
|
87
|
+
});
|
|
88
|
+
break; // success
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
92
|
+
const receivedOrgId = parseReceivedOrgId(msg);
|
|
93
|
+
if (!receivedOrgId) {
|
|
94
|
+
console.error("Login failed:", msg);
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
// Browser authenticated to a different org than selected
|
|
98
|
+
const receivedOrg = orgs.find((o) => o.workosOrgId === receivedOrgId);
|
|
99
|
+
const receivedName = receivedOrg?.name ?? receivedOrgId;
|
|
100
|
+
console.error(`\n⚠ Browser authenticated to "${receivedName}" instead of "${finalOrgName}".`);
|
|
101
|
+
console.error(` This happens when your browser's active session is for a different org.\n`);
|
|
102
|
+
if (attempt >= 1) {
|
|
103
|
+
console.error("Still mismatched after retry. Run `zivis auth init` again after switching orgs in your browser.");
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
const choice = await prompt(`Use "${receivedName}" instead? [Y/n] `);
|
|
107
|
+
if (choice.toLowerCase() === "n" || choice.toLowerCase() === "no") {
|
|
108
|
+
console.log("Aborted. Log into the correct org in your browser then run `zivis auth init` again.");
|
|
109
|
+
process.exit(0);
|
|
110
|
+
}
|
|
111
|
+
// Retry scoped to what the browser actually has
|
|
112
|
+
finalOrgId = receivedOrgId;
|
|
113
|
+
finalOrgName = receivedName;
|
|
114
|
+
}
|
|
77
115
|
}
|
|
78
|
-
|
|
79
|
-
console.error("Login failed:", err instanceof Error ? err.message : err);
|
|
116
|
+
if (!scopedTokens) {
|
|
80
117
|
process.exit(1);
|
|
81
118
|
}
|
|
82
119
|
const email = extractEmail(scopedTokens.id_token);
|
|
83
120
|
const storageName = getStorageName();
|
|
84
121
|
await saveSessionEntry(session, email);
|
|
85
|
-
console.log(`\n✓ Logged in as ${email} → ${
|
|
122
|
+
console.log(`\n✓ Logged in as ${email} → ${finalOrgName}`);
|
|
86
123
|
console.log(`✓ Credentials stored in ${storageName}`);
|
|
87
124
|
await ensureProjectBinding({
|
|
88
125
|
config,
|
|
89
126
|
session,
|
|
90
127
|
accessToken: scopedTokens.access_token,
|
|
91
|
-
organizationId:
|
|
128
|
+
organizationId: finalOrgId,
|
|
92
129
|
cwd: process.cwd(),
|
|
93
130
|
autoBind: true,
|
|
94
131
|
skipBind: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/auth/init.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACtF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAMzE,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAiB;IACjD,MAAM,MAAM,GAAG,cAAc,CAAC;IAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC;IAE1C,oEAAoE;IACpE,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,MAAM,EAAE,CAAC;QACX,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC;QACrC,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/auth/init.ts"],"names":[],"mappings":"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"}
|