@zivis/cli 0.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/app/index.d.ts +10 -0
- package/dist/commands/app/index.js +245 -0
- package/dist/commands/app/index.js.map +1 -0
- package/dist/commands/auth/index.d.ts +2 -0
- package/dist/commands/auth/index.js +41 -0
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/login.d.ts +8 -0
- package/dist/commands/auth/login.js +65 -0
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.d.ts +5 -0
- package/dist/commands/auth/logout.js +14 -0
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/sessions.d.ts +4 -0
- package/dist/commands/auth/sessions.js +30 -0
- package/dist/commands/auth/sessions.js.map +1 -0
- package/dist/commands/auth/status.d.ts +4 -0
- package/dist/commands/auth/status.js +53 -0
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/credits/index.d.ts +2 -0
- package/dist/commands/credits/index.js +51 -0
- package/dist/commands/credits/index.js.map +1 -0
- package/dist/commands/mcp/index.d.ts +2 -0
- package/dist/commands/mcp/index.js +70 -0
- package/dist/commands/mcp/index.js.map +1 -0
- package/dist/commands/open/index.d.ts +10 -0
- package/dist/commands/open/index.js +57 -0
- package/dist/commands/open/index.js.map +1 -0
- package/dist/commands/scan/index.d.ts +2 -0
- package/dist/commands/scan/index.js +140 -0
- package/dist/commands/scan/index.js.map +1 -0
- package/dist/commands/target/index.d.ts +2 -0
- package/dist/commands/target/index.js +146 -0
- package/dist/commands/target/index.js.map +1 -0
- package/dist/commands/tm/index.d.ts +2 -0
- package/dist/commands/tm/index.js +266 -0
- package/dist/commands/tm/index.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/extractor/adapters/go/index.d.ts +7 -0
- package/dist/internal/extractor/adapters/go/index.js +71 -0
- package/dist/internal/extractor/adapters/go/index.js.map +1 -0
- package/dist/internal/extractor/adapters/go/manifest.d.ts +37 -0
- package/dist/internal/extractor/adapters/go/manifest.js +199 -0
- package/dist/internal/extractor/adapters/go/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/go/parser.d.ts +6 -0
- package/dist/internal/extractor/adapters/go/parser.js +23 -0
- package/dist/internal/extractor/adapters/go/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/go/scanner.d.ts +39 -0
- package/dist/internal/extractor/adapters/go/scanner.js +216 -0
- package/dist/internal/extractor/adapters/go/scanner.js.map +1 -0
- package/dist/internal/extractor/adapters/python/index.d.ts +5 -0
- package/dist/internal/extractor/adapters/python/index.js +68 -0
- package/dist/internal/extractor/adapters/python/index.js.map +1 -0
- package/dist/internal/extractor/adapters/python/manifest.d.ts +25 -0
- package/dist/internal/extractor/adapters/python/manifest.js +236 -0
- package/dist/internal/extractor/adapters/python/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/python/parser.d.ts +5 -0
- package/dist/internal/extractor/adapters/python/parser.js +22 -0
- package/dist/internal/extractor/adapters/python/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/python/scanner.d.ts +37 -0
- package/dist/internal/extractor/adapters/python/scanner.js +284 -0
- package/dist/internal/extractor/adapters/python/scanner.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/index.d.ts +9 -0
- package/dist/internal/extractor/adapters/typescript/index.js +84 -0
- package/dist/internal/extractor/adapters/typescript/index.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/manifest.d.ts +41 -0
- package/dist/internal/extractor/adapters/typescript/manifest.js +156 -0
- package/dist/internal/extractor/adapters/typescript/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/parser.d.ts +14 -0
- package/dist/internal/extractor/adapters/typescript/parser.js +33 -0
- package/dist/internal/extractor/adapters/typescript/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/scanner.d.ts +43 -0
- package/dist/internal/extractor/adapters/typescript/scanner.js +188 -0
- package/dist/internal/extractor/adapters/typescript/scanner.js.map +1 -0
- package/dist/internal/extractor/index.d.ts +22 -0
- package/dist/internal/extractor/index.js +107 -0
- package/dist/internal/extractor/index.js.map +1 -0
- package/dist/internal/extractor/types.d.ts +124 -0
- package/dist/internal/extractor/types.js +28 -0
- package/dist/internal/extractor/types.js.map +1 -0
- package/dist/internal/extractor/walker.d.ts +32 -0
- package/dist/internal/extractor/walker.js +110 -0
- package/dist/internal/extractor/walker.js.map +1 -0
- package/dist/internal/ide-setup.d.ts +7 -0
- package/dist/internal/ide-setup.js +131 -0
- package/dist/internal/ide-setup.js.map +1 -0
- package/dist/internal/orgs.d.ts +8 -0
- package/dist/internal/orgs.js +31 -0
- package/dist/internal/orgs.js.map +1 -0
- package/dist/internal/project-binding.d.ts +11 -0
- package/dist/internal/project-binding.js +96 -0
- package/dist/internal/project-binding.js.map +1 -0
- package/dist/internal/target-auth/api-config.d.ts +37 -0
- package/dist/internal/target-auth/api-config.js +40 -0
- package/dist/internal/target-auth/api-config.js.map +1 -0
- package/dist/internal/target-auth/config.d.ts +20 -0
- package/dist/internal/target-auth/config.js +58 -0
- package/dist/internal/target-auth/config.js.map +1 -0
- package/dist/internal/target-auth/index.d.ts +30 -0
- package/dist/internal/target-auth/index.js +101 -0
- package/dist/internal/target-auth/index.js.map +1 -0
- package/dist/internal/target-auth/keychain.d.ts +23 -0
- package/dist/internal/target-auth/keychain.js +150 -0
- package/dist/internal/target-auth/keychain.js.map +1 -0
- package/dist/internal/target-auth/types.d.ts +51 -0
- package/dist/internal/target-auth/types.js +11 -0
- package/dist/internal/target-auth/types.js.map +1 -0
- package/dist/internal/target-auth/workos.d.ts +20 -0
- package/dist/internal/target-auth/workos.js +196 -0
- package/dist/internal/target-auth/workos.js.map +1 -0
- package/package.json +41 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Command } from "commander";
|
|
2
|
+
/**
|
|
3
|
+
* Phase J.4 command group. The customer-facing primitive is "Application" —
|
|
4
|
+
* the thing they built and want tested. This group replaces the older
|
|
5
|
+
* `zivis target` set: same keychain layout, but auth config is pulled from
|
|
6
|
+
* the platform instead of read from a local file. Teammates discover an
|
|
7
|
+
* Application's IdP by querying the API; their tokens still stay in their
|
|
8
|
+
* own keychain.
|
|
9
|
+
*/
|
|
10
|
+
export declare function registerAppCommands(program: Command): void;
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { ApiClient } from "@zivis-ai/mcp-security/api-client";
|
|
2
|
+
import { DEFAULT_CONFIG } from "@zivis-ai/mcp-security/types";
|
|
3
|
+
import { loginApplication, logoutTarget, tokenInfo, getValidTargetToken, } from "../../internal/target-auth/index.js";
|
|
4
|
+
import { getStorageName } from "../../internal/target-auth/keychain.js";
|
|
5
|
+
import { decodeJwtPayload } from "../../internal/target-auth/workos.js";
|
|
6
|
+
import { fetchAuthConfig } from "../../internal/target-auth/api-config.js";
|
|
7
|
+
const DEFAULT_PERSONA = "default";
|
|
8
|
+
/**
|
|
9
|
+
* Phase J.4 command group. The customer-facing primitive is "Application" —
|
|
10
|
+
* the thing they built and want tested. This group replaces the older
|
|
11
|
+
* `zivis target` set: same keychain layout, but auth config is pulled from
|
|
12
|
+
* the platform instead of read from a local file. Teammates discover an
|
|
13
|
+
* Application's IdP by querying the API; their tokens still stay in their
|
|
14
|
+
* own keychain.
|
|
15
|
+
*/
|
|
16
|
+
export function registerAppCommands(program) {
|
|
17
|
+
const app = program
|
|
18
|
+
.command("app")
|
|
19
|
+
.description("manage authentication against your customer-facing applications");
|
|
20
|
+
app
|
|
21
|
+
.command("list")
|
|
22
|
+
.description("list applications in the active org")
|
|
23
|
+
.option("-s, --session <name>", "named session")
|
|
24
|
+
.option("--json", "emit raw JSON")
|
|
25
|
+
.action(async (opts) => {
|
|
26
|
+
const client = buildClient(opts);
|
|
27
|
+
const apps = await client.request("GET", "/api/rt/applications");
|
|
28
|
+
if (opts.json) {
|
|
29
|
+
process.stdout.write(JSON.stringify(apps, null, 2) + "\n");
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (!apps.length) {
|
|
33
|
+
console.log("No applications in this org.");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
for (const a of apps) {
|
|
37
|
+
const type = a.type ? ` (${a.type})` : "";
|
|
38
|
+
const cred = a.useEphemeralCreds ? " ephemeral" : "";
|
|
39
|
+
console.log(`${a.id} ${a.name}${type}${cred}`);
|
|
40
|
+
if (a.baseUrl)
|
|
41
|
+
console.log(` ${a.baseUrl}`);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
app
|
|
45
|
+
.command("show <appId>")
|
|
46
|
+
.description("print an application's auth config (debugging)")
|
|
47
|
+
.option("-s, --session <name>", "named session")
|
|
48
|
+
.action(async (appId, opts) => {
|
|
49
|
+
const cfg = await fetchAuthConfig(appId, opts.session);
|
|
50
|
+
process.stdout.write(JSON.stringify(cfg, null, 2) + "\n");
|
|
51
|
+
});
|
|
52
|
+
app
|
|
53
|
+
.command("create")
|
|
54
|
+
.description("create a customer-facing Application configured for ephemeral PKCE auth")
|
|
55
|
+
.requiredOption("--name <name>", "application display name")
|
|
56
|
+
.requiredOption("--base-url <url>", "primary base URL (e.g., https://api.acme.io)")
|
|
57
|
+
.option("--type <type>", "agent | mcp_server | llm_endpoint | rest_api | ad_hoc_url", "agent")
|
|
58
|
+
.option("--description <text>", "optional description")
|
|
59
|
+
.option("--client-id <id>", "OAuth client_id (PKCE public client)")
|
|
60
|
+
.option("--oidc-issuer <url>", "OIDC issuer (for discovery)")
|
|
61
|
+
.option("--auth-url <url>", "explicit OAuth authorize endpoint")
|
|
62
|
+
.option("--token-url <url>", "explicit OAuth token endpoint")
|
|
63
|
+
.option("--scopes <list>", "comma-separated scopes (default: openid,offline_access)")
|
|
64
|
+
.option("--no-ephemeral", "do NOT opt into ephemeral creds (legacy KV-backed flow)")
|
|
65
|
+
.option("-s, --session <name>", "named session")
|
|
66
|
+
.option("--json", "emit raw JSON")
|
|
67
|
+
.action(async (opts) => {
|
|
68
|
+
const useEphemeral = opts.ephemeral !== false;
|
|
69
|
+
const body = {
|
|
70
|
+
name: opts.name,
|
|
71
|
+
baseUrl: opts.baseUrl,
|
|
72
|
+
type: opts.type,
|
|
73
|
+
useEphemeralCreds: useEphemeral,
|
|
74
|
+
// PKCE-only public-client mode is the whole reason for ephemeral creds —
|
|
75
|
+
// require oauth_pkce as the auth type. Non-PKCE flows (static_token,
|
|
76
|
+
// client_credentials, bearer_refresh) need their own subcommands.
|
|
77
|
+
authType: "oauth_pkce",
|
|
78
|
+
};
|
|
79
|
+
if (opts.description)
|
|
80
|
+
body.description = opts.description;
|
|
81
|
+
if (opts.clientId)
|
|
82
|
+
body.clientId = opts.clientId;
|
|
83
|
+
if (opts.oidcIssuer)
|
|
84
|
+
body.oidcIssuer = opts.oidcIssuer;
|
|
85
|
+
if (opts.authUrl)
|
|
86
|
+
body.authorizationUrl = opts.authUrl;
|
|
87
|
+
if (opts.tokenUrl)
|
|
88
|
+
body.tokenUrl = opts.tokenUrl;
|
|
89
|
+
if (opts.scopes) {
|
|
90
|
+
body.scopes = String(opts.scopes).split(",").map((s) => s.trim()).filter(Boolean);
|
|
91
|
+
}
|
|
92
|
+
if (!useEphemeral) {
|
|
93
|
+
console.error("[zivis] --no-ephemeral selected but `app create` only handles PKCE public-client mode in v1.\n" +
|
|
94
|
+
"[zivis] Use the web UI to create static-token / client-credentials applications.");
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
const client = buildClient(opts);
|
|
98
|
+
try {
|
|
99
|
+
const created = await client.request("POST", "/api/rt/applications", body);
|
|
100
|
+
if (opts.json) {
|
|
101
|
+
process.stdout.write(JSON.stringify(created, null, 2) + "\n");
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
console.log(`✓ Created application ${created.id}`);
|
|
105
|
+
console.log(` ${created.name}${created.type ? ` (${created.type})` : ""}`);
|
|
106
|
+
console.log("");
|
|
107
|
+
console.log(`Next: zivis app auth ${created.id}`);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
console.error("Create failed:", err instanceof Error ? err.message : err);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
app
|
|
115
|
+
.command("update <appId>")
|
|
116
|
+
.description("update an application's metadata (name, type, ephemeral-creds toggle, etc.)")
|
|
117
|
+
.option("--name <name>", "rename the application")
|
|
118
|
+
.option("--description <text>", "update the description")
|
|
119
|
+
.option("--type <type>", "agent | mcp_server | llm_endpoint | rest_api | ad_hoc_url")
|
|
120
|
+
.option("--use-ephemeral", "opt into ephemeral-creds mode (Phase J)")
|
|
121
|
+
.option("--no-ephemeral-disable", "opt OUT of ephemeral-creds mode (legacy KV-backed)")
|
|
122
|
+
.option("--base-url <url>", "update base URL")
|
|
123
|
+
.option("--client-id <id>", "update OAuth client_id")
|
|
124
|
+
.option("--oidc-issuer <url>", "update OIDC issuer")
|
|
125
|
+
.option("-s, --session <name>", "named session")
|
|
126
|
+
.option("--json", "emit raw JSON")
|
|
127
|
+
.action(async (appId, opts) => {
|
|
128
|
+
const body = {};
|
|
129
|
+
if (opts.name)
|
|
130
|
+
body.name = opts.name;
|
|
131
|
+
if (opts.description !== undefined)
|
|
132
|
+
body.description = opts.description;
|
|
133
|
+
if (opts.type)
|
|
134
|
+
body.type = opts.type;
|
|
135
|
+
if (opts.useEphemeral)
|
|
136
|
+
body.useEphemeralCreds = true;
|
|
137
|
+
if (opts.ephemeralDisable === false)
|
|
138
|
+
body.useEphemeralCreds = false;
|
|
139
|
+
if (opts.baseUrl)
|
|
140
|
+
body.baseUrl = opts.baseUrl;
|
|
141
|
+
if (opts.clientId)
|
|
142
|
+
body.clientId = opts.clientId;
|
|
143
|
+
if (opts.oidcIssuer)
|
|
144
|
+
body.oidcIssuer = opts.oidcIssuer;
|
|
145
|
+
if (Object.keys(body).length === 0) {
|
|
146
|
+
console.error("No fields to update. Pass at least one of --name/--type/--use-ephemeral/etc.");
|
|
147
|
+
process.exit(1);
|
|
148
|
+
}
|
|
149
|
+
const client = buildClient(opts);
|
|
150
|
+
try {
|
|
151
|
+
const result = await client.request("PATCH", `/api/rt/applications/${encodeURIComponent(appId)}`, body);
|
|
152
|
+
const application = result.application ?? result;
|
|
153
|
+
if (opts.json) {
|
|
154
|
+
process.stdout.write(JSON.stringify(application, null, 2) + "\n");
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
console.log(`✓ Updated ${application.id ?? appId}`);
|
|
158
|
+
for (const k of Object.keys(body)) {
|
|
159
|
+
console.log(` ${k}: ${JSON.stringify(body[k])}`);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
catch (err) {
|
|
163
|
+
console.error("Update failed:", err instanceof Error ? err.message : err);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
}
|
|
166
|
+
});
|
|
167
|
+
app
|
|
168
|
+
.command("auth <appId>")
|
|
169
|
+
.description("PKCE login against the application's IdP; tokens stay in your OS keychain")
|
|
170
|
+
.option("-p, --persona <name>", "persona for permutation testing", DEFAULT_PERSONA)
|
|
171
|
+
.option("-s, --session <name>", "named session")
|
|
172
|
+
.action(async (appId, opts) => {
|
|
173
|
+
try {
|
|
174
|
+
const tokens = await loginApplication(appId, opts.persona, opts.session);
|
|
175
|
+
const claims = decodeJwtPayload(tokens.access_token) || {};
|
|
176
|
+
console.log(`✓ Logged in as persona "${opts.persona}"`);
|
|
177
|
+
console.log(` storage: ${getStorageName()}`);
|
|
178
|
+
if (claims.sub)
|
|
179
|
+
console.log(` sub: ${claims.sub}`);
|
|
180
|
+
if (claims.email)
|
|
181
|
+
console.log(` email: ${claims.email}`);
|
|
182
|
+
if (claims.org_id)
|
|
183
|
+
console.log(` org: ${claims.org_id}`);
|
|
184
|
+
console.log(` expires: ${new Date(tokens.expires_at).toISOString()}`);
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
console.error("Login failed:", err instanceof Error ? err.message : err);
|
|
188
|
+
process.exit(1);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
app
|
|
192
|
+
.command("token <appId>")
|
|
193
|
+
.description("print a valid access_token (auto-refreshes); for piping into curl/scripts")
|
|
194
|
+
.option("-p, --persona <name>", "persona", DEFAULT_PERSONA)
|
|
195
|
+
.action(async (appId, opts) => {
|
|
196
|
+
try {
|
|
197
|
+
const tokens = await getValidTargetToken(appId, opts.persona);
|
|
198
|
+
if (!tokens) {
|
|
199
|
+
console.error(`No token for application ${appId} (persona: ${opts.persona}). Run: zivis app auth ${appId} -p ${opts.persona}`);
|
|
200
|
+
process.exit(2);
|
|
201
|
+
}
|
|
202
|
+
process.stdout.write(tokens.access_token);
|
|
203
|
+
}
|
|
204
|
+
catch (err) {
|
|
205
|
+
console.error("Token fetch failed:", err instanceof Error ? err.message : err);
|
|
206
|
+
process.exit(1);
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
app
|
|
210
|
+
.command("whoami <appId>")
|
|
211
|
+
.description("decode the stored token and print expiry + key claims")
|
|
212
|
+
.option("-p, --persona <name>", "persona", DEFAULT_PERSONA)
|
|
213
|
+
.option("--json", "emit raw JSON")
|
|
214
|
+
.action(async (appId, opts) => {
|
|
215
|
+
const info = await tokenInfo(appId, opts.persona);
|
|
216
|
+
if (!info) {
|
|
217
|
+
console.error(`No tokens stored for application ${appId} (persona: ${opts.persona}).`);
|
|
218
|
+
process.exit(2);
|
|
219
|
+
}
|
|
220
|
+
const out = { applicationId: appId, persona: opts.persona, ...info };
|
|
221
|
+
if (opts.json) {
|
|
222
|
+
process.stdout.write(JSON.stringify(out, null, 2) + "\n");
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
console.log(`Application: ${appId}`);
|
|
226
|
+
console.log(`Persona: ${opts.persona}`);
|
|
227
|
+
console.log(`Valid: ${info.valid}`);
|
|
228
|
+
console.log(`Expires: ${info.expiresAt}`);
|
|
229
|
+
console.log(`Remaining: ${info.secondsRemaining}s`);
|
|
230
|
+
console.log(`Refresh: ${info.hasRefresh ? "available" : "none"}`);
|
|
231
|
+
});
|
|
232
|
+
app
|
|
233
|
+
.command("logout <appId>")
|
|
234
|
+
.description("clear stored tokens for an application persona")
|
|
235
|
+
.option("-p, --persona <name>", "persona", DEFAULT_PERSONA)
|
|
236
|
+
.action(async (appId, opts) => {
|
|
237
|
+
await logoutTarget(appId, opts.persona);
|
|
238
|
+
console.log(`✓ Cleared tokens for application ${appId} (persona: ${opts.persona})`);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
function buildClient(opts) {
|
|
242
|
+
const config = opts.session ? { ...DEFAULT_CONFIG, session: opts.session } : DEFAULT_CONFIG;
|
|
243
|
+
return new ApiClient(config);
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/app/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { loginCommand } from "./login.js";
|
|
2
|
+
import { statusCommand } from "./status.js";
|
|
3
|
+
import { logoutCommand } from "./logout.js";
|
|
4
|
+
import { sessionsCommand } from "./sessions.js";
|
|
5
|
+
export function registerAuthCommands(program) {
|
|
6
|
+
const auth = program.command("auth").description("authentication");
|
|
7
|
+
auth
|
|
8
|
+
.command("login")
|
|
9
|
+
.description("OAuth PKCE login (stores tokens in OS keychain)")
|
|
10
|
+
.option("-s, --session <name>", "named session for multi-tenant")
|
|
11
|
+
.option("-o, --org <workosOrgId>", "scope JWT to a specific WorkOS org")
|
|
12
|
+
.option("-y, --yes", "skip interactive confirmation")
|
|
13
|
+
.option("--bind", "auto-write .zivis/project.json binding")
|
|
14
|
+
.option("--no-bind", "skip project binding")
|
|
15
|
+
.action(async (opts) => {
|
|
16
|
+
await loginCommand(opts);
|
|
17
|
+
});
|
|
18
|
+
auth
|
|
19
|
+
.command("status")
|
|
20
|
+
.description("show current auth state and active session")
|
|
21
|
+
.option("-s, --session <name>", "session to inspect")
|
|
22
|
+
.action(async (opts) => {
|
|
23
|
+
await statusCommand(opts);
|
|
24
|
+
});
|
|
25
|
+
auth
|
|
26
|
+
.command("logout")
|
|
27
|
+
.description("clear stored credentials")
|
|
28
|
+
.option("-s, --session <name>", "session to clear")
|
|
29
|
+
.option("--all", "clear every stored session")
|
|
30
|
+
.action(async (opts) => {
|
|
31
|
+
await logoutCommand(opts);
|
|
32
|
+
});
|
|
33
|
+
auth
|
|
34
|
+
.command("sessions")
|
|
35
|
+
.description("list every named session with stored credentials")
|
|
36
|
+
.option("--remove <name>", "remove a specific session")
|
|
37
|
+
.action(async (opts) => {
|
|
38
|
+
await sessionsCommand(opts);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/auth/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAEnE,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iDAAiD,CAAC;SAC9D,MAAM,CAAC,sBAAsB,EAAE,gCAAgC,CAAC;SAChE,MAAM,CAAC,yBAAyB,EAAE,oCAAoC,CAAC;SACvE,MAAM,CAAC,WAAW,EAAE,+BAA+B,CAAC;SACpD,MAAM,CAAC,QAAQ,EAAE,wCAAwC,CAAC;SAC1D,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4CAA4C,CAAC;SACzD,MAAM,CAAC,sBAAsB,EAAE,oBAAoB,CAAC;SACpD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,0BAA0B,CAAC;SACvC,MAAM,CAAC,sBAAsB,EAAE,kBAAkB,CAAC;SAClD,MAAM,CAAC,OAAO,EAAE,4BAA4B,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEL,IAAI;SACD,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,kDAAkD,CAAC;SAC/D,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,CAAC;SACtD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { login } from "@zivis-ai/mcp-security/auth";
|
|
2
|
+
import { getStorageName } from "@zivis-ai/mcp-security/auth";
|
|
3
|
+
import { saveSessionEntry } from "@zivis-ai/mcp-security/auth";
|
|
4
|
+
import { detectProjectBinding } from "@zivis-ai/mcp-security/project-binding";
|
|
5
|
+
import { DEFAULT_CONFIG } from "@zivis-ai/mcp-security/types";
|
|
6
|
+
import { extractEmail } from "../../internal/orgs.js";
|
|
7
|
+
import { ensureProjectBinding } from "../../internal/project-binding.js";
|
|
8
|
+
import { setupVsCodeClaude, setupVsCodeCopilot, setupClaudeCodeCli, } from "../../internal/ide-setup.js";
|
|
9
|
+
export async function loginCommand(opts) {
|
|
10
|
+
const config = DEFAULT_CONFIG;
|
|
11
|
+
const detected = detectProjectBinding(process.cwd());
|
|
12
|
+
const session = opts.session || detected?.binding.session || config.session;
|
|
13
|
+
let organizationId = opts.org;
|
|
14
|
+
if (!organizationId && detected?.binding.workosOrgId) {
|
|
15
|
+
organizationId = detected.binding.workosOrgId;
|
|
16
|
+
console.log(`Using org from project binding: ${organizationId}${detected.binding.orgName ? ` (${detected.binding.orgName})` : ""}`);
|
|
17
|
+
}
|
|
18
|
+
if (detected?.binding.session && !opts.session) {
|
|
19
|
+
console.log(`Using session from project binding: ${session}`);
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const tokens = await login(config, session, organizationId, {
|
|
23
|
+
orgName: detected?.binding.orgName,
|
|
24
|
+
skipConfirm: opts.yes === true,
|
|
25
|
+
});
|
|
26
|
+
const storageName = getStorageName();
|
|
27
|
+
const email = extractEmail(tokens.id_token);
|
|
28
|
+
const sessionName = session || "default";
|
|
29
|
+
await saveSessionEntry(sessionName, email);
|
|
30
|
+
const sessionLabel = session ? ` (session: ${session})` : "";
|
|
31
|
+
console.log(`✓ Logged in as ${email}${sessionLabel}`);
|
|
32
|
+
console.log(`✓ Credentials stored in ${storageName}`);
|
|
33
|
+
if (organizationId) {
|
|
34
|
+
console.log(`✓ JWT scoped to organization: ${organizationId}`);
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
await setupVsCodeClaude(session);
|
|
38
|
+
await setupVsCodeCopilot(session);
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
console.log(` WARNING: Failed to update .vscode/mcp.json: ${err instanceof Error ? err.message : err}`);
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
await setupClaudeCodeCli(session);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
console.log(` WARNING: Failed to update Claude Code CLI config: ${err instanceof Error ? err.message : err}`);
|
|
48
|
+
}
|
|
49
|
+
await ensureProjectBinding({
|
|
50
|
+
config,
|
|
51
|
+
session: sessionName,
|
|
52
|
+
accessToken: tokens.access_token,
|
|
53
|
+
organizationId,
|
|
54
|
+
cwd: process.cwd(),
|
|
55
|
+
autoBind: opts.bind === true,
|
|
56
|
+
skipBind: opts.noBind === true,
|
|
57
|
+
});
|
|
58
|
+
process.exit(0);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
console.error("Login failed:", err instanceof Error ? err.message : err);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/commands/auth/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { keychainClearAll, keychainClearSession } from "@zivis-ai/mcp-security/auth";
|
|
2
|
+
import { removeSessionEntry } from "@zivis-ai/mcp-security/auth";
|
|
3
|
+
export async function logoutCommand(opts) {
|
|
4
|
+
if (opts.session) {
|
|
5
|
+
await keychainClearSession(opts.session);
|
|
6
|
+
await removeSessionEntry(opts.session);
|
|
7
|
+
console.log(`✓ Session "${opts.session}" credentials cleared`);
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
await keychainClearAll();
|
|
11
|
+
console.log("✓ Default credentials cleared");
|
|
12
|
+
console.log(" Note: Named sessions are not affected. Use 'zivis auth sessions' to list them.");
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=logout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/commands/auth/logout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAOjE,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAmB;IACrD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,oBAAoB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,OAAO,uBAAuB,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,EAAE,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,kFAAkF,CAAC,CAAC;AAClG,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { listSessions, removeSessionEntry, keychainClearSession } from "@zivis-ai/mcp-security/auth";
|
|
2
|
+
export async function sessionsCommand(opts) {
|
|
3
|
+
if (opts.remove) {
|
|
4
|
+
await keychainClearSession(opts.remove);
|
|
5
|
+
await removeSessionEntry(opts.remove);
|
|
6
|
+
console.log(`✓ Session "${opts.remove}" removed`);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const sessions = await listSessions();
|
|
10
|
+
const activeSession = process.env.ZIVIS_SESSION;
|
|
11
|
+
if (sessions.length === 0) {
|
|
12
|
+
console.log("No sessions stored.");
|
|
13
|
+
console.log("");
|
|
14
|
+
console.log("To create a session:");
|
|
15
|
+
console.log(" zivis auth login # default session");
|
|
16
|
+
console.log(" zivis auth login --session <name> # named session");
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
console.log("Sessions:");
|
|
20
|
+
console.log("");
|
|
21
|
+
for (const s of sessions) {
|
|
22
|
+
const active = s.name === (activeSession || "default") ? " (active)" : "";
|
|
23
|
+
const nameCol = s.name.padEnd(20);
|
|
24
|
+
console.log(` ${nameCol} ${s.email}${active}`);
|
|
25
|
+
}
|
|
26
|
+
console.log("");
|
|
27
|
+
console.log("To use a session in a project, add to .mcp.json:");
|
|
28
|
+
console.log(' "env": { "ZIVIS_SESSION": "<session-name>" }');
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../../src/commands/auth/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAMrG,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAqB;IACzD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,CAAC,MAAM,WAAW,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,YAAY,EAAE,CAAC;IACtC,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAEhD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACzB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,aAAa,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK,GAAG,MAAM,EAAE,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;IAChE,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { resolveAuth, loadTokens, getStorageName, keychainRead } from "@zivis-ai/mcp-security/auth";
|
|
2
|
+
import { detectProjectBinding } from "@zivis-ai/mcp-security/project-binding";
|
|
3
|
+
import { DEFAULT_CONFIG } from "@zivis-ai/mcp-security/types";
|
|
4
|
+
import { extractEmail } from "../../internal/orgs.js";
|
|
5
|
+
export async function statusCommand(opts) {
|
|
6
|
+
const config = DEFAULT_CONFIG;
|
|
7
|
+
const detected = detectProjectBinding(process.cwd());
|
|
8
|
+
const session = opts.session || config.session || detected?.binding.session;
|
|
9
|
+
const resolveConfig = session ? { ...config, session } : config;
|
|
10
|
+
if (session) {
|
|
11
|
+
const source = opts.session
|
|
12
|
+
? "flag"
|
|
13
|
+
: config.session
|
|
14
|
+
? "ZIVIS_SESSION"
|
|
15
|
+
: "project binding";
|
|
16
|
+
console.log(`Session: ${session} (from ${source})`);
|
|
17
|
+
}
|
|
18
|
+
const creds = await resolveAuth(resolveConfig);
|
|
19
|
+
switch (creds.method) {
|
|
20
|
+
case "oauth": {
|
|
21
|
+
const tokens = await loadTokens(session);
|
|
22
|
+
const email = extractEmail(tokens?.id_token);
|
|
23
|
+
console.log(`Auth: OAuth (${email})`);
|
|
24
|
+
if (tokens) {
|
|
25
|
+
const expiresIn = Math.round((tokens.expires_at - Date.now()) / 1000 / 60);
|
|
26
|
+
console.log(`Token: ${expiresIn > 0 ? `expires in ${expiresIn} min` : "expired (will refresh)"}`);
|
|
27
|
+
}
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
case "apikey": {
|
|
31
|
+
const masked = creds.apiKey?.startsWith("sk_")
|
|
32
|
+
? `sk_...${creds.apiKey.slice(-4)}`
|
|
33
|
+
: "***";
|
|
34
|
+
const source = (await keychainRead("apikey")) ? getStorageName() : "environment variable";
|
|
35
|
+
console.log(`Auth: API Key (${masked}) from ${source}`);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
case "none":
|
|
39
|
+
console.log("Auth: Not authenticated");
|
|
40
|
+
console.log("");
|
|
41
|
+
if (session) {
|
|
42
|
+
console.log(`Session "${session}" has no credentials.`);
|
|
43
|
+
console.log(`Run: zivis auth login --session ${session}`);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
console.log("To authenticate:");
|
|
47
|
+
console.log(" zivis auth login");
|
|
48
|
+
}
|
|
49
|
+
break;
|
|
50
|
+
}
|
|
51
|
+
console.log(`API: ${resolveConfig.apiBaseUrl}`);
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ApiClient } from "@zivis-ai/mcp-security/api-client";
|
|
2
|
+
import { DEFAULT_CONFIG } from "@zivis-ai/mcp-security/types";
|
|
3
|
+
function buildClient(opts) {
|
|
4
|
+
const config = opts.session ? { ...DEFAULT_CONFIG, session: opts.session } : DEFAULT_CONFIG;
|
|
5
|
+
return new ApiClient(config);
|
|
6
|
+
}
|
|
7
|
+
export function registerCreditsCommands(program) {
|
|
8
|
+
program
|
|
9
|
+
.command("credits")
|
|
10
|
+
.description("show credit balance and recent burn by action type")
|
|
11
|
+
.option("-s, --session <name>", "named session")
|
|
12
|
+
.option("--json", "emit raw JSON (combined balance + usage-summary)")
|
|
13
|
+
.action(async (opts) => {
|
|
14
|
+
const client = buildClient(opts);
|
|
15
|
+
const [balance, usage] = await Promise.all([
|
|
16
|
+
client.request("GET", "/api/credits/balance"),
|
|
17
|
+
client
|
|
18
|
+
.request("GET", "/api/credits/usage-summary")
|
|
19
|
+
.catch(() => ({})),
|
|
20
|
+
]);
|
|
21
|
+
if (opts.json) {
|
|
22
|
+
process.stdout.write(JSON.stringify({ balance, usage }, null, 2) + "\n");
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
console.log("Credits");
|
|
26
|
+
if (typeof balance.balance === "number") {
|
|
27
|
+
console.log(` Balance: ${balance.balance}`);
|
|
28
|
+
}
|
|
29
|
+
if (typeof balance.totalGranted === "number") {
|
|
30
|
+
console.log(` Granted: ${balance.totalGranted}`);
|
|
31
|
+
}
|
|
32
|
+
if (typeof balance.totalSpent === "number") {
|
|
33
|
+
console.log(` Spent: ${balance.totalSpent}`);
|
|
34
|
+
}
|
|
35
|
+
if (typeof balance.reservedAmount === "number" && balance.reservedAmount > 0) {
|
|
36
|
+
console.log(` Reserved: ${balance.reservedAmount} (in-flight scans)`);
|
|
37
|
+
}
|
|
38
|
+
const entries = Object.entries(usage).filter(([, v]) => v && typeof v === "object");
|
|
39
|
+
if (entries.length > 0) {
|
|
40
|
+
console.log("");
|
|
41
|
+
console.log("Recent usage by action:");
|
|
42
|
+
for (const [action, v] of entries) {
|
|
43
|
+
const row = v;
|
|
44
|
+
const spent = row.spent ?? 0;
|
|
45
|
+
const runs = row.runs ?? 0;
|
|
46
|
+
console.log(` ${action.padEnd(18)} ${String(spent).padStart(8)} (${runs} runs)`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/credits/index.ts"],"names":[],"mappings":"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"}
|