@zivis/cli 0.1.0-alpha.28 → 0.1.0-alpha.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/commands/app/index.js +2 -2
- package/dist/commands/app/index.js.map +1 -1
- package/dist/commands/auth/index.js +0 -24
- package/dist/commands/auth/index.js.map +1 -1
- package/dist/commands/auth/login.js +7 -12
- package/dist/commands/auth/login.js.map +1 -1
- package/dist/commands/auth/logout.js +5 -17
- package/dist/commands/auth/logout.js.map +1 -1
- package/dist/commands/auth/status.js +10 -31
- package/dist/commands/auth/status.js.map +1 -1
- package/dist/commands/credits/index.js +2 -2
- package/dist/commands/credits/index.js.map +1 -1
- package/dist/commands/mcp/index.js +13 -79
- package/dist/commands/mcp/index.js.map +1 -1
- package/dist/commands/scan/index.js +2 -2
- package/dist/commands/scan/index.js.map +1 -1
- package/dist/commands/tm/index.js +3 -3
- package/dist/commands/tm/index.js.map +1 -1
- package/dist/internal/ide-setup.d.ts +7 -38
- package/dist/internal/ide-setup.js +41 -359
- package/dist/internal/ide-setup.js.map +1 -1
- package/dist/internal/project-binding.d.ts +0 -2
- package/dist/internal/project-binding.js +8 -18
- package/dist/internal/project-binding.js.map +1 -1
- package/package.json +2 -2
- package/dist/commands/auth/bind.d.ts +0 -30
- package/dist/commands/auth/bind.js +0 -174
- package/dist/commands/auth/bind.js.map +0 -1
- package/dist/commands/auth/init.d.ts +0 -4
- package/dist/commands/auth/init.js +0 -242
- package/dist/commands/auth/init.js.map +0 -1
- package/dist/commands/auth/token.d.ts +0 -17
- package/dist/commands/auth/token.js +0 -90
- package/dist/commands/auth/token.js.map +0 -1
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* zivis auth bind
|
|
3
|
-
*
|
|
4
|
-
* The recommended setup command for developers using ZIVIS with an IDE or
|
|
5
|
-
* agentic workflow.
|
|
6
|
-
*
|
|
7
|
-
* How it works:
|
|
8
|
-
* 1. Opens a browser → WorkOS login scoped to the project's org
|
|
9
|
-
* 2. ZIVIS backend verifies org membership and mints a Local Project
|
|
10
|
-
* Binding Token (a WorkOS API key scoped to this user + org)
|
|
11
|
-
* 3. The token is stored in the OS keychain under `apikey.<session>`
|
|
12
|
-
* 4. IDE configs (.cursor/mcp.json, .vscode/mcp.json) are written with
|
|
13
|
-
* --workspace pointing to this repo
|
|
14
|
-
* 5. OAuth tokens from the login ceremony are discarded — the API key
|
|
15
|
-
* is the only long-lived credential
|
|
16
|
-
*
|
|
17
|
-
* The result: the MCP server uses a stable, org-scoped token that never
|
|
18
|
-
* refreshes and never drifts to a different org.
|
|
19
|
-
*
|
|
20
|
-
* Security model:
|
|
21
|
-
* - WorkOS login = identity + membership proof (ephemeral)
|
|
22
|
-
* - Local Project Binding Token = execution credential (permanent until revoked)
|
|
23
|
-
* - Keys are visible in `zivis auth status` and Settings → API Tokens for audit
|
|
24
|
-
* - `zivis auth logout` clears the key locally; revoke in the UI to invalidate
|
|
25
|
-
* it server-side
|
|
26
|
-
*/
|
|
27
|
-
export interface BindCmdOpts {
|
|
28
|
-
yes?: boolean;
|
|
29
|
-
}
|
|
30
|
-
export declare function bindCommand(opts: BindCmdOpts): Promise<void>;
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* zivis auth bind
|
|
3
|
-
*
|
|
4
|
-
* The recommended setup command for developers using ZIVIS with an IDE or
|
|
5
|
-
* agentic workflow.
|
|
6
|
-
*
|
|
7
|
-
* How it works:
|
|
8
|
-
* 1. Opens a browser → WorkOS login scoped to the project's org
|
|
9
|
-
* 2. ZIVIS backend verifies org membership and mints a Local Project
|
|
10
|
-
* Binding Token (a WorkOS API key scoped to this user + org)
|
|
11
|
-
* 3. The token is stored in the OS keychain under `apikey.<session>`
|
|
12
|
-
* 4. IDE configs (.cursor/mcp.json, .vscode/mcp.json) are written with
|
|
13
|
-
* --workspace pointing to this repo
|
|
14
|
-
* 5. OAuth tokens from the login ceremony are discarded — the API key
|
|
15
|
-
* is the only long-lived credential
|
|
16
|
-
*
|
|
17
|
-
* The result: the MCP server uses a stable, org-scoped token that never
|
|
18
|
-
* refreshes and never drifts to a different org.
|
|
19
|
-
*
|
|
20
|
-
* Security model:
|
|
21
|
-
* - WorkOS login = identity + membership proof (ephemeral)
|
|
22
|
-
* - Local Project Binding Token = execution credential (permanent until revoked)
|
|
23
|
-
* - Keys are visible in `zivis auth status` and Settings → API Tokens for audit
|
|
24
|
-
* - `zivis auth logout` clears the key locally; revoke in the UI to invalidate
|
|
25
|
-
* it server-side
|
|
26
|
-
*/
|
|
27
|
-
import * as os from "node:os";
|
|
28
|
-
import * as crypto from "node:crypto";
|
|
29
|
-
import * as child_process from "node:child_process";
|
|
30
|
-
import { login } from "@zivis/mcp/auth";
|
|
31
|
-
import { keychainStore, keychainClearSession } from "@zivis/mcp/auth";
|
|
32
|
-
import { detectProjectBinding, resolveConfigFromBinding } from "@zivis/mcp/project-binding";
|
|
33
|
-
import { extractEmail } from "../../internal/orgs.js";
|
|
34
|
-
import { ensureProjectBinding } from "../../internal/project-binding.js";
|
|
35
|
-
import { setupCursorWorkspace, setupVsCodeClaude, setupVsCodeCopilot, setupClaudeCodeCli, } from "../../internal/ide-setup.js";
|
|
36
|
-
/** Get the git remote URL of the current repo for the key name, or fallback. */
|
|
37
|
-
function getRepoFingerprint() {
|
|
38
|
-
try {
|
|
39
|
-
const remote = child_process
|
|
40
|
-
.execSync("git remote get-url origin 2>/dev/null", { encoding: "utf8" })
|
|
41
|
-
.trim();
|
|
42
|
-
if (remote) {
|
|
43
|
-
return crypto.createHash("sha256").update(remote).digest("hex").slice(0, 12);
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
// no git or no remote
|
|
48
|
-
}
|
|
49
|
-
return crypto.createHash("sha256").update(process.cwd()).digest("hex").slice(0, 12);
|
|
50
|
-
}
|
|
51
|
-
export async function bindCommand(opts) {
|
|
52
|
-
const config = resolveConfigFromBinding(process.cwd());
|
|
53
|
-
const cwd = process.cwd();
|
|
54
|
-
const detected = detectProjectBinding(cwd);
|
|
55
|
-
// We need a project binding to know which org to bind to.
|
|
56
|
-
// The binding provides workosOrgId + session name.
|
|
57
|
-
if (!detected?.binding.workosOrgId) {
|
|
58
|
-
console.error("");
|
|
59
|
-
console.error("[zivis] ERROR: No project binding found.");
|
|
60
|
-
console.error("[zivis] Run zivis auth login first to establish a project binding,");
|
|
61
|
-
console.error("[zivis] or ensure .zivis/project.json exists with a workosOrgId.");
|
|
62
|
-
console.error("");
|
|
63
|
-
console.error(" To create a binding:");
|
|
64
|
-
console.error(" zivis auth login");
|
|
65
|
-
process.exit(1);
|
|
66
|
-
}
|
|
67
|
-
const { workosOrgId, session: bindingSession, orgName } = detected.binding;
|
|
68
|
-
const session = bindingSession;
|
|
69
|
-
console.log("");
|
|
70
|
-
console.log(`Binding this repo to ${orgName ?? workosOrgId} (session: "${session}")`);
|
|
71
|
-
console.log("This will mint a Local Project Binding Token for MCP and IDE use.");
|
|
72
|
-
console.log("");
|
|
73
|
-
// Step 1: OAuth PKCE login — identity ceremony only.
|
|
74
|
-
// We scope it to the org from the project binding so there's no ambiguity.
|
|
75
|
-
let tokens;
|
|
76
|
-
try {
|
|
77
|
-
tokens = await login(config, `__bind_temp_${session}`, workosOrgId, {
|
|
78
|
-
orgName,
|
|
79
|
-
sessionLabel: session,
|
|
80
|
-
skipConfirm: opts.yes === true,
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
console.error("[zivis] Authentication failed:", err instanceof Error ? err.message : err);
|
|
85
|
-
process.exit(1);
|
|
86
|
-
}
|
|
87
|
-
const email = extractEmail(tokens.id_token);
|
|
88
|
-
console.log(`✓ Authenticated as ${email}`);
|
|
89
|
-
// Step 2: Call POST /api/auth/bind with the fresh access token.
|
|
90
|
-
// The backend verifies membership and mints the WorkOS API key.
|
|
91
|
-
const repoFingerprint = getRepoFingerprint();
|
|
92
|
-
const hostname = os.hostname();
|
|
93
|
-
let bindResult;
|
|
94
|
-
try {
|
|
95
|
-
const response = await fetch(`${config.apiBaseUrl}/api/auth/bind`, {
|
|
96
|
-
method: "POST",
|
|
97
|
-
headers: {
|
|
98
|
-
Authorization: `Bearer ${tokens.access_token}`,
|
|
99
|
-
"Content-Type": "application/json",
|
|
100
|
-
"User-Agent": "@zivis/cli",
|
|
101
|
-
},
|
|
102
|
-
body: JSON.stringify({ repoFingerprint, hostname }),
|
|
103
|
-
});
|
|
104
|
-
if (!response.ok) {
|
|
105
|
-
const body = (await response.json().catch(() => ({})));
|
|
106
|
-
console.error(`[zivis] Backend bind failed (HTTP ${response.status}): ${body.message ?? body.error ?? "unknown error"}`);
|
|
107
|
-
process.exit(1);
|
|
108
|
-
}
|
|
109
|
-
bindResult = (await response.json());
|
|
110
|
-
}
|
|
111
|
-
catch (err) {
|
|
112
|
-
console.error("[zivis] Network error calling /api/auth/bind:", err instanceof Error ? err.message : err);
|
|
113
|
-
process.exit(1);
|
|
114
|
-
}
|
|
115
|
-
finally {
|
|
116
|
-
// Step 3: Discard the OAuth tokens — they were only needed for the bind ceremony.
|
|
117
|
-
// The Local Project Binding Token is the only credential we keep.
|
|
118
|
-
await keychainClearSession(`__bind_temp_${session}`).catch(() => { });
|
|
119
|
-
}
|
|
120
|
-
// Step 4: Store the Local Project Binding Token in the OS keychain.
|
|
121
|
-
// Stored under apikey.<session> so the MCP server finds it in the
|
|
122
|
-
// preferred credential slot (ahead of OAuth tokens in the precedence chain).
|
|
123
|
-
const apiKeyAccount = `apikey.${session}`;
|
|
124
|
-
try {
|
|
125
|
-
await keychainStore(apiKeyAccount, bindResult.key);
|
|
126
|
-
}
|
|
127
|
-
catch (err) {
|
|
128
|
-
console.error("[zivis] Failed to store token in OS keychain:", err instanceof Error ? err.message : err);
|
|
129
|
-
process.exit(1);
|
|
130
|
-
}
|
|
131
|
-
const maskedKey = `${bindResult.key.slice(0, 10)}...${bindResult.key.slice(-4)}`;
|
|
132
|
-
console.log(`✓ Local Project Binding Token stored (${maskedKey})`);
|
|
133
|
-
console.log(` Org: ${bindResult.orgName} (${bindResult.workosOrgId})`);
|
|
134
|
-
console.log(` Key name: ${bindResult.keyName}`);
|
|
135
|
-
// Step 5: Write IDE configs with --workspace so the MCP process is isolated.
|
|
136
|
-
try {
|
|
137
|
-
await setupCursorWorkspace();
|
|
138
|
-
}
|
|
139
|
-
catch (err) {
|
|
140
|
-
console.log(` WARNING: Failed to update .cursor/mcp.json: ${err instanceof Error ? err.message : err}`);
|
|
141
|
-
}
|
|
142
|
-
try {
|
|
143
|
-
await setupVsCodeClaude();
|
|
144
|
-
await setupVsCodeCopilot();
|
|
145
|
-
}
|
|
146
|
-
catch (err) {
|
|
147
|
-
console.log(` WARNING: Failed to update .vscode/mcp.json: ${err instanceof Error ? err.message : err}`);
|
|
148
|
-
}
|
|
149
|
-
try {
|
|
150
|
-
await setupClaudeCodeCli();
|
|
151
|
-
}
|
|
152
|
-
catch (err) {
|
|
153
|
-
console.log(` WARNING: Failed to update Claude Code CLI config: ${err instanceof Error ? err.message : err}`);
|
|
154
|
-
}
|
|
155
|
-
// Step 6: Ensure the project binding file is up to date.
|
|
156
|
-
await ensureProjectBinding({
|
|
157
|
-
config,
|
|
158
|
-
session,
|
|
159
|
-
accessToken: tokens.access_token,
|
|
160
|
-
organizationId: workosOrgId,
|
|
161
|
-
cwd,
|
|
162
|
-
autoBind: true,
|
|
163
|
-
skipBind: false,
|
|
164
|
-
force: false,
|
|
165
|
-
});
|
|
166
|
-
console.log("");
|
|
167
|
-
console.log("✓ Bind complete. Reload your IDE to activate the MCP server.");
|
|
168
|
-
console.log("");
|
|
169
|
-
console.log(" To verify: zivis auth status");
|
|
170
|
-
console.log(" To revoke: zivis auth logout (or Settings → API Tokens in the UI)");
|
|
171
|
-
console.log("");
|
|
172
|
-
process.exit(0);
|
|
173
|
-
}
|
|
174
|
-
//# sourceMappingURL=bind.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bind.js","sourceRoot":"","sources":["../../../src/commands/auth/bind.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,MAAM,aAAa,CAAC;AACtC,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAE5F,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,6BAA6B,CAAC;AAMrC,gFAAgF;AAChF,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,aAAa;aACzB,QAAQ,CAAC,uCAAuC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;aACvE,IAAI,EAAE,CAAC;QACV,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;IACD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAiB;IACjD,MAAM,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IAE3C,0DAA0D;IAC1D,mDAAmD;IACnD,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;QACpF,OAAO,CAAC,KAAK,CAAC,kEAAkE,CAAC,CAAC;QAClF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC3E,MAAM,OAAO,GAAG,cAAc,CAAC;IAE/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,wBAAwB,OAAO,IAAI,WAAW,eAAe,OAAO,IAAI,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,qDAAqD;IACrD,2EAA2E;IAC3E,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,eAAe,OAAO,EAAE,EAAE,WAAW,EAAE;YAClE,OAAO;YACP,YAAY,EAAE,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,GAAG,KAAK,IAAI;SAC/B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,EAAE,CAAC,CAAC;IAE3C,gEAAgE;IAChE,gEAAgE;IAChE,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;IAC7C,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;IAE/B,IAAI,UAUH,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,gBAAgB,EAAE;YACjE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,CAAC,YAAY,EAAE;gBAC9C,cAAc,EAAE,kBAAkB;gBAClC,YAAY,EAAE,YAAY;aAC3B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC;SACpD,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA2B,CAAC;YACjF,OAAO,CAAC,KAAK,CACX,qCAAqC,QAAQ,CAAC,MAAM,MAAM,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,IAAI,eAAe,EAAE,CAC1G,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,UAAU,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;IAC5D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,kFAAkF;QAClF,kEAAkE;QAClE,MAAM,oBAAoB,CAAC,eAAe,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,oEAAoE;IACpE,kEAAkE;IAClE,6EAA6E;IAC7E,MAAM,aAAa,GAAG,UAAU,OAAO,EAAE,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+CAA+C,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACzG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,OAAO,CAAC,GAAG,CAAC,yCAAyC,SAAS,GAAG,CAAC,CAAC;IACnE,OAAO,CAAC,GAAG,CAAC,UAAU,UAAU,CAAC,OAAO,KAAK,UAAU,CAAC,WAAW,GAAG,CAAC,CAAC;IACxE,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IAEjD,6EAA6E;IAC7E,IAAI,CAAC;QACH,MAAM,oBAAoB,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,iDAAiD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,CAAC;QACH,MAAM,iBAAiB,EAAE,CAAC;QAC1B,MAAM,kBAAkB,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,iDAAiD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,CAAC;QACH,MAAM,kBAAkB,EAAE,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,uDAAuD,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACjH,CAAC;IAED,yDAAyD;IACzD,MAAM,oBAAoB,CAAC;QACzB,MAAM;QACN,OAAO;QACP,WAAW,EAAE,MAAM,CAAC,YAAY;QAChC,cAAc,EAAE,WAAW;QAC3B,GAAG;QACH,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;QACf,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,2EAA2E,CAAC,CAAC;IACzF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
import * as readline from "node:readline/promises";
|
|
2
|
-
import { login, getStorageName, saveSessionEntry } from "@zivis/mcp/auth";
|
|
3
|
-
import { resolveConfigFromBinding } from "@zivis/mcp/project-binding";
|
|
4
|
-
import { fetchUserOrgs, extractEmail } from "../../internal/orgs.js";
|
|
5
|
-
import { ensureProjectBinding } from "../../internal/project-binding.js";
|
|
6
|
-
import { decodeJwtPayload } from "@zivis/mcp/auth/jwt";
|
|
7
|
-
import { detectIdesInRepo, writeGuidance } from "../../internal/ide-setup.js";
|
|
8
|
-
async function prompt(question) {
|
|
9
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
|
|
10
|
-
try {
|
|
11
|
-
return (await rl.question(question)).trim();
|
|
12
|
-
}
|
|
13
|
-
finally {
|
|
14
|
-
rl.close();
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* After project binding succeeds, offer to write IDE guidance files.
|
|
19
|
-
* This is the prime moment to ask — the user is already in setup mode.
|
|
20
|
-
*/
|
|
21
|
-
async function offerGuidanceInstall(cwd) {
|
|
22
|
-
const detectedIdes = detectIdesInRepo(cwd);
|
|
23
|
-
if (detectedIdes.length === 0)
|
|
24
|
-
return;
|
|
25
|
-
const ideLabels = {
|
|
26
|
-
cursor: "Cursor",
|
|
27
|
-
"claude-code-cli": "Claude Code (CLAUDE.md)",
|
|
28
|
-
"vscode-copilot": "VS Code (Copilot)",
|
|
29
|
-
"vscode-claude": "VS Code (Claude)",
|
|
30
|
-
cline: "Cline",
|
|
31
|
-
windsurf: "Windsurf",
|
|
32
|
-
};
|
|
33
|
-
const ideNames = detectedIdes.map((ide) => ideLabels[ide] ?? ide).join(", ");
|
|
34
|
-
console.log(`\nDetected IDE configs in this repo: ${ideNames}`);
|
|
35
|
-
const ans = await prompt("Add ZIVIS guidance so your AI assistant suggests security checks at the right moments?\n" +
|
|
36
|
-
"(Adds a rule/instruction file. You can edit or remove it anytime.) [Y/n] ");
|
|
37
|
-
if (ans.toLowerCase() === "n" || ans.toLowerCase() === "no") {
|
|
38
|
-
console.log(" Skipped. Run 'zivis mcp install --client <ide> --with-guidance' anytime to add later.");
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
const written = [];
|
|
42
|
-
for (const ide of detectedIdes) {
|
|
43
|
-
try {
|
|
44
|
-
const files = writeGuidance({ cwd, client: ide });
|
|
45
|
-
written.push(...files);
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
console.warn(` Warning: Could not write guidance for ${ide}: ${err instanceof Error ? err.message : err}`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
if (written.length > 0) {
|
|
52
|
-
console.log(`✓ Wrote guidance files:`);
|
|
53
|
-
for (const f of written)
|
|
54
|
-
console.log(` ${f}`);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
export async function initCommand(opts) {
|
|
58
|
-
// Prefer URL config from the existing project binding (if any) so that
|
|
59
|
-
// re-running `zivis auth init` in a staging repo hits staging automatically.
|
|
60
|
-
const config = resolveConfigFromBinding(process.cwd());
|
|
61
|
-
const session = opts.session || "default";
|
|
62
|
-
const envLabel = config.apiBaseUrl.includes("staging") ? "staging" : "production";
|
|
63
|
-
console.log(`Environment: ${envLabel} (${config.apiBaseUrl})`);
|
|
64
|
-
console.log("");
|
|
65
|
-
// Step 1: Open browser — no org pre-selection. User picks the org in their browser.
|
|
66
|
-
console.log("Opening browser for authentication...");
|
|
67
|
-
console.log("Log into the org you want to bind this project to.\n");
|
|
68
|
-
let tokens;
|
|
69
|
-
try {
|
|
70
|
-
tokens = await login(config, session, undefined, { skipConfirm: true });
|
|
71
|
-
}
|
|
72
|
-
catch (err) {
|
|
73
|
-
console.error("Login failed:", err instanceof Error ? err.message : err);
|
|
74
|
-
process.exit(1);
|
|
75
|
-
}
|
|
76
|
-
const email = extractEmail(tokens.id_token);
|
|
77
|
-
// Step 2: Determine which org the JWT is scoped to
|
|
78
|
-
const claims = decodeJwtPayload(tokens.access_token);
|
|
79
|
-
const jwtOrgId = claims?.org_id;
|
|
80
|
-
if (jwtOrgId) {
|
|
81
|
-
// Look up org name before confirming
|
|
82
|
-
let orgName;
|
|
83
|
-
try {
|
|
84
|
-
const orgs = await fetchUserOrgs(config, tokens.access_token);
|
|
85
|
-
orgName = orgs.find((o) => o.workosOrgId === jwtOrgId)?.name;
|
|
86
|
-
if (!orgName && orgs.length > 0) {
|
|
87
|
-
console.log(`\n ⚠ WorkOS org ${jwtOrgId} is not registered in ZIVIS.`);
|
|
88
|
-
console.log(` Your ZIVIS orgs: ${orgs.map((o) => `${o.name} (${o.workosOrgId})`).join(", ")}`);
|
|
89
|
-
console.log(` Try logging into ${config.apiBaseUrl} in your browser first, then re-run init.\n`);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
catch (e) {
|
|
93
|
-
console.error(` (note: org name lookup failed — ${e instanceof Error ? e.message : e})`);
|
|
94
|
-
}
|
|
95
|
-
const orgLabel = orgName ?? `unknown org (${jwtOrgId})`;
|
|
96
|
-
console.log(`\nAuthenticated as: ${email}`);
|
|
97
|
-
console.log(`Org: ${orgLabel}`);
|
|
98
|
-
console.log(`Environment: ${envLabel} (${config.apiBaseUrl})\n`);
|
|
99
|
-
const confirm = await prompt(`Bind this project to "${orgLabel}"? [Y/n] `);
|
|
100
|
-
if (confirm.toLowerCase() === "n" || confirm.toLowerCase() === "no") {
|
|
101
|
-
console.log("");
|
|
102
|
-
const retry = await prompt("Retry login in a private/incognito window? [Y/n] ");
|
|
103
|
-
if (retry.toLowerCase() !== "n" && retry.toLowerCase() !== "no") {
|
|
104
|
-
console.log("\nOpening a private/incognito window — log into the correct org...\n");
|
|
105
|
-
let retryTokens;
|
|
106
|
-
try {
|
|
107
|
-
retryTokens = await login(config, session, undefined, { skipConfirm: true, incognito: true });
|
|
108
|
-
}
|
|
109
|
-
catch (err) {
|
|
110
|
-
console.error("Login failed:", err instanceof Error ? err.message : err);
|
|
111
|
-
process.exit(1);
|
|
112
|
-
}
|
|
113
|
-
// Recurse by re-entering the confirmation flow with the new tokens
|
|
114
|
-
tokens = retryTokens;
|
|
115
|
-
const retryClaims = decodeJwtPayload(retryTokens.access_token);
|
|
116
|
-
const retryOrgId = retryClaims?.org_id;
|
|
117
|
-
if (!retryOrgId) {
|
|
118
|
-
console.error("JWT returned no org scope. Try `zivis auth logout` then `zivis auth init` again.");
|
|
119
|
-
process.exit(1);
|
|
120
|
-
}
|
|
121
|
-
let retryOrgName;
|
|
122
|
-
try {
|
|
123
|
-
const retryOrgs = await fetchUserOrgs(config, retryTokens.access_token);
|
|
124
|
-
retryOrgName = retryOrgs.find((o) => o.workosOrgId === retryOrgId)?.name;
|
|
125
|
-
}
|
|
126
|
-
catch (e) {
|
|
127
|
-
console.error(` (note: org name lookup failed — ${e instanceof Error ? e.message : e})`);
|
|
128
|
-
}
|
|
129
|
-
const retryLabel = retryOrgName ?? retryOrgId;
|
|
130
|
-
const retryEmail = extractEmail(retryTokens.id_token);
|
|
131
|
-
console.log(`\nAuthenticated as: ${retryEmail}`);
|
|
132
|
-
console.log(`Org: ${retryLabel}\n`);
|
|
133
|
-
const retryConfirm = await prompt(`Bind this project to "${retryLabel}"? [Y/n] `);
|
|
134
|
-
if (retryConfirm.toLowerCase() === "n" || retryConfirm.toLowerCase() === "no") {
|
|
135
|
-
console.log("Aborted.");
|
|
136
|
-
process.exit(0);
|
|
137
|
-
}
|
|
138
|
-
const storageName2 = getStorageName();
|
|
139
|
-
await saveSessionEntry(session, retryEmail);
|
|
140
|
-
console.log(`\n✓ Logged in as ${retryEmail} → ${retryLabel}`);
|
|
141
|
-
console.log(`✓ Credentials stored in ${storageName2}`);
|
|
142
|
-
await ensureProjectBinding({
|
|
143
|
-
config, session, accessToken: retryTokens.access_token,
|
|
144
|
-
organizationId: retryOrgId, cwd: process.cwd(), autoBind: true, skipBind: false, force: true,
|
|
145
|
-
});
|
|
146
|
-
await offerGuidanceInstall(process.cwd());
|
|
147
|
-
process.exit(0);
|
|
148
|
-
}
|
|
149
|
-
console.log("\nAborted. Switch orgs in your browser then run `zivis auth logout && zivis auth init`.");
|
|
150
|
-
process.exit(0);
|
|
151
|
-
}
|
|
152
|
-
const storageName = getStorageName();
|
|
153
|
-
await saveSessionEntry(session, email);
|
|
154
|
-
console.log(`\n✓ Logged in as ${email} → ${orgLabel}`);
|
|
155
|
-
console.log(`✓ Credentials stored in ${storageName}`);
|
|
156
|
-
await ensureProjectBinding({
|
|
157
|
-
config,
|
|
158
|
-
session,
|
|
159
|
-
accessToken: tokens.access_token,
|
|
160
|
-
organizationId: jwtOrgId,
|
|
161
|
-
cwd: process.cwd(),
|
|
162
|
-
autoBind: true,
|
|
163
|
-
skipBind: false,
|
|
164
|
-
force: true,
|
|
165
|
-
});
|
|
166
|
-
await offerGuidanceInstall(process.cwd());
|
|
167
|
-
}
|
|
168
|
-
else {
|
|
169
|
-
// No org in JWT — user is authenticated but not scoped to an org yet.
|
|
170
|
-
// Fetch orgs and let them pick, then do a scoped login.
|
|
171
|
-
console.log("\nYour account isn't scoped to a specific org yet.");
|
|
172
|
-
console.log("Fetching your organizations...\n");
|
|
173
|
-
let orgs;
|
|
174
|
-
try {
|
|
175
|
-
orgs = await fetchUserOrgs(config, tokens.access_token);
|
|
176
|
-
}
|
|
177
|
-
catch (err) {
|
|
178
|
-
console.error("Failed to fetch organizations:", err instanceof Error ? err.message : err);
|
|
179
|
-
process.exit(1);
|
|
180
|
-
}
|
|
181
|
-
if (orgs.length === 0) {
|
|
182
|
-
console.error("No organizations found. Contact support.");
|
|
183
|
-
process.exit(1);
|
|
184
|
-
}
|
|
185
|
-
if (orgs.length === 1) {
|
|
186
|
-
console.log(`One org found: ${orgs[0].name}. Re-authenticating scoped to that org...`);
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
console.log("Your organizations:");
|
|
190
|
-
orgs.forEach((org, i) => console.log(` ${i + 1}. ${org.name}`));
|
|
191
|
-
const answer = await prompt(`\nSelect org to bind this project to [1-${orgs.length}]: `);
|
|
192
|
-
const idx = parseInt(answer, 10) - 1;
|
|
193
|
-
if (isNaN(idx) || idx < 0 || idx >= orgs.length) {
|
|
194
|
-
console.error("Invalid selection.");
|
|
195
|
-
process.exit(1);
|
|
196
|
-
}
|
|
197
|
-
const selected = orgs[idx];
|
|
198
|
-
if (!selected.workosOrgId) {
|
|
199
|
-
console.error(`Org "${selected.name}" has no WorkOS org ID.`);
|
|
200
|
-
process.exit(1);
|
|
201
|
-
}
|
|
202
|
-
console.log(`\nRe-opening browser scoped to ${selected.name}...`);
|
|
203
|
-
console.log("(Tip: if your browser logs into the wrong org, use option 2 to get a URL for a private/incognito window)\n");
|
|
204
|
-
try {
|
|
205
|
-
const scopedTokens = await login(config, session, selected.workosOrgId, {
|
|
206
|
-
orgName: selected.name,
|
|
207
|
-
skipConfirm: true,
|
|
208
|
-
});
|
|
209
|
-
const storageName2 = getStorageName();
|
|
210
|
-
await saveSessionEntry(session, email);
|
|
211
|
-
console.log(`\n✓ Logged in as ${email} → ${selected.name}`);
|
|
212
|
-
console.log(`✓ Credentials stored in ${storageName2}`);
|
|
213
|
-
await ensureProjectBinding({
|
|
214
|
-
config,
|
|
215
|
-
session,
|
|
216
|
-
accessToken: scopedTokens.access_token,
|
|
217
|
-
organizationId: selected.workosOrgId,
|
|
218
|
-
cwd: process.cwd(),
|
|
219
|
-
autoBind: true,
|
|
220
|
-
skipBind: false,
|
|
221
|
-
force: true,
|
|
222
|
-
});
|
|
223
|
-
await offerGuidanceInstall(process.cwd());
|
|
224
|
-
}
|
|
225
|
-
catch (err) {
|
|
226
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
227
|
-
const m = msg.match(/received (org_\w+)/);
|
|
228
|
-
if (m) {
|
|
229
|
-
console.error(`\n⚠ Browser authenticated to a different org than selected.`);
|
|
230
|
-
console.error(` Your browser has an active session for a different org.\n`);
|
|
231
|
-
console.error(` To fix: run \`zivis auth init\` again and paste the URL into a private/incognito window.`);
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
console.error("Login failed:", msg);
|
|
235
|
-
}
|
|
236
|
-
process.exit(1);
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
process.exit(0);
|
|
241
|
-
}
|
|
242
|
-
//# sourceMappingURL=init.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/auth/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* zivis auth token
|
|
3
|
-
*
|
|
4
|
-
* Store a ZIVIS API access token in the OS keychain for a named session.
|
|
5
|
-
* API tokens are the preferred auth method for the MCP server and CI pipelines
|
|
6
|
-
* — they don't expire and don't require browser interaction.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* zivis auth token sk_<...> # default session
|
|
10
|
-
* zivis auth token sk_<...> --session zivis # named session
|
|
11
|
-
*
|
|
12
|
-
* Tokens are generated in the ZIVIS platform: Settings → API Tokens
|
|
13
|
-
*/
|
|
14
|
-
export interface TokenCmdOpts {
|
|
15
|
-
session?: string;
|
|
16
|
-
}
|
|
17
|
-
export declare function tokenCommand(apiKey: string, opts: TokenCmdOpts): Promise<void>;
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* zivis auth token
|
|
3
|
-
*
|
|
4
|
-
* Store a ZIVIS API access token in the OS keychain for a named session.
|
|
5
|
-
* API tokens are the preferred auth method for the MCP server and CI pipelines
|
|
6
|
-
* — they don't expire and don't require browser interaction.
|
|
7
|
-
*
|
|
8
|
-
* Usage:
|
|
9
|
-
* zivis auth token sk_<...> # default session
|
|
10
|
-
* zivis auth token sk_<...> --session zivis # named session
|
|
11
|
-
*
|
|
12
|
-
* Tokens are generated in the ZIVIS platform: Settings → API Tokens
|
|
13
|
-
*/
|
|
14
|
-
import { keychainStore, getStorageName } from "@zivis/mcp/auth";
|
|
15
|
-
import { detectProjectBinding, resolveConfigFromBinding } from "@zivis/mcp/project-binding";
|
|
16
|
-
const API_KEY_PREFIX = "sk_";
|
|
17
|
-
const API_KEY_REGEX = /^sk_[a-z0-9_]{10,}$/i;
|
|
18
|
-
function getApiKeyAccount(session) {
|
|
19
|
-
return session ? `apikey.${session}` : "apikey";
|
|
20
|
-
}
|
|
21
|
-
function validateKeyFormat(key) {
|
|
22
|
-
return API_KEY_REGEX.test(key);
|
|
23
|
-
}
|
|
24
|
-
export async function tokenCommand(apiKey, opts) {
|
|
25
|
-
// Validate format
|
|
26
|
-
if (!validateKeyFormat(apiKey)) {
|
|
27
|
-
console.error(`Invalid API token format. Expected: ${API_KEY_PREFIX}<token value>`);
|
|
28
|
-
console.error(`Got: ${apiKey.substring(0, 20)}...`);
|
|
29
|
-
console.error(`\nGenerate a token at: Settings → API Tokens in the ZIVIS platform.`);
|
|
30
|
-
process.exit(1);
|
|
31
|
-
}
|
|
32
|
-
// Determine session from opts or project binding
|
|
33
|
-
const detected = detectProjectBinding(process.cwd());
|
|
34
|
-
const session = opts.session ?? detected?.binding.session;
|
|
35
|
-
const account = getApiKeyAccount(session);
|
|
36
|
-
const sessionLabel = session ? `session "${session}"` : "default session";
|
|
37
|
-
const storageName = getStorageName();
|
|
38
|
-
try {
|
|
39
|
-
await keychainStore(account, apiKey);
|
|
40
|
-
}
|
|
41
|
-
catch (err) {
|
|
42
|
-
console.error(`Failed to store token: ${err instanceof Error ? err.message : err}`);
|
|
43
|
-
process.exit(1);
|
|
44
|
-
}
|
|
45
|
-
const maskedKey = `${apiKey.substring(0, 12)}...${apiKey.slice(-4)}`;
|
|
46
|
-
console.log(`✓ API token stored for ${sessionLabel}`);
|
|
47
|
-
console.log(` Key: ${maskedKey}`);
|
|
48
|
-
console.log(` Storage: ${storageName} (account: ${account})`);
|
|
49
|
-
if (session) {
|
|
50
|
-
console.log(`\nThe MCP server will use this token automatically for projects bound to session "${session}".`);
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
console.log(`\nThe MCP server will use this token for the default session.`);
|
|
54
|
-
console.log(`Tip: Use --session <name> to scope this token to a specific org.`);
|
|
55
|
-
}
|
|
56
|
-
if (detected) {
|
|
57
|
-
const orgLabel = detected.binding.orgName
|
|
58
|
-
? ` (${detected.binding.orgName})`
|
|
59
|
-
: "";
|
|
60
|
-
console.log(`\nProject binding detected: this repo is bound to session "${detected.binding.session}"${orgLabel}.`);
|
|
61
|
-
if (!session) {
|
|
62
|
-
console.log(` Tip: Run with --session ${detected.binding.session} to scope this token to that org.`);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
// Optionally verify the key works against the API
|
|
66
|
-
const config = resolveConfigFromBinding(process.cwd());
|
|
67
|
-
const apiBaseUrl = config.apiBaseUrl;
|
|
68
|
-
try {
|
|
69
|
-
const response = await fetch(`${apiBaseUrl}/api/mcp/session`, {
|
|
70
|
-
headers: { "X-API-Key": apiKey, "User-Agent": "@zivis/cli" },
|
|
71
|
-
});
|
|
72
|
-
if (response.ok) {
|
|
73
|
-
const data = (await response.json());
|
|
74
|
-
const orgName = data.org?.name ?? "unknown org";
|
|
75
|
-
const email = data.user?.email ?? "unknown user";
|
|
76
|
-
console.log(`\n✓ Token verified — authenticated as ${email} in ${orgName}`);
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
const body = await response.json().catch(() => ({}));
|
|
80
|
-
console.log(`\n Warning: Could not verify token against API (HTTP ${response.status}): ${body.message ?? body.error ?? "unknown error"}`);
|
|
81
|
-
console.log(` Token was stored but may be invalid or lack the 'mcp' scope.`);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
// Network error — token is stored, just couldn't verify
|
|
86
|
-
console.log(`\n Note: Could not reach the ZIVIS API to verify the token (stored anyway).`);
|
|
87
|
-
}
|
|
88
|
-
process.exit(0);
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=token.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../../src/commands/auth/token.ts"],"names":[],"mappings":"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"}
|