@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.
Files changed (112) hide show
  1. package/dist/commands/app/index.d.ts +10 -0
  2. package/dist/commands/app/index.js +245 -0
  3. package/dist/commands/app/index.js.map +1 -0
  4. package/dist/commands/auth/index.d.ts +2 -0
  5. package/dist/commands/auth/index.js +41 -0
  6. package/dist/commands/auth/index.js.map +1 -0
  7. package/dist/commands/auth/login.d.ts +8 -0
  8. package/dist/commands/auth/login.js +65 -0
  9. package/dist/commands/auth/login.js.map +1 -0
  10. package/dist/commands/auth/logout.d.ts +5 -0
  11. package/dist/commands/auth/logout.js +14 -0
  12. package/dist/commands/auth/logout.js.map +1 -0
  13. package/dist/commands/auth/sessions.d.ts +4 -0
  14. package/dist/commands/auth/sessions.js +30 -0
  15. package/dist/commands/auth/sessions.js.map +1 -0
  16. package/dist/commands/auth/status.d.ts +4 -0
  17. package/dist/commands/auth/status.js +53 -0
  18. package/dist/commands/auth/status.js.map +1 -0
  19. package/dist/commands/credits/index.d.ts +2 -0
  20. package/dist/commands/credits/index.js +51 -0
  21. package/dist/commands/credits/index.js.map +1 -0
  22. package/dist/commands/mcp/index.d.ts +2 -0
  23. package/dist/commands/mcp/index.js +70 -0
  24. package/dist/commands/mcp/index.js.map +1 -0
  25. package/dist/commands/open/index.d.ts +10 -0
  26. package/dist/commands/open/index.js +57 -0
  27. package/dist/commands/open/index.js.map +1 -0
  28. package/dist/commands/scan/index.d.ts +2 -0
  29. package/dist/commands/scan/index.js +140 -0
  30. package/dist/commands/scan/index.js.map +1 -0
  31. package/dist/commands/target/index.d.ts +2 -0
  32. package/dist/commands/target/index.js +146 -0
  33. package/dist/commands/target/index.js.map +1 -0
  34. package/dist/commands/tm/index.d.ts +2 -0
  35. package/dist/commands/tm/index.js +266 -0
  36. package/dist/commands/tm/index.js.map +1 -0
  37. package/dist/index.d.ts +2 -0
  38. package/dist/index.js +41 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/internal/extractor/adapters/go/index.d.ts +7 -0
  41. package/dist/internal/extractor/adapters/go/index.js +71 -0
  42. package/dist/internal/extractor/adapters/go/index.js.map +1 -0
  43. package/dist/internal/extractor/adapters/go/manifest.d.ts +37 -0
  44. package/dist/internal/extractor/adapters/go/manifest.js +199 -0
  45. package/dist/internal/extractor/adapters/go/manifest.js.map +1 -0
  46. package/dist/internal/extractor/adapters/go/parser.d.ts +6 -0
  47. package/dist/internal/extractor/adapters/go/parser.js +23 -0
  48. package/dist/internal/extractor/adapters/go/parser.js.map +1 -0
  49. package/dist/internal/extractor/adapters/go/scanner.d.ts +39 -0
  50. package/dist/internal/extractor/adapters/go/scanner.js +216 -0
  51. package/dist/internal/extractor/adapters/go/scanner.js.map +1 -0
  52. package/dist/internal/extractor/adapters/python/index.d.ts +5 -0
  53. package/dist/internal/extractor/adapters/python/index.js +68 -0
  54. package/dist/internal/extractor/adapters/python/index.js.map +1 -0
  55. package/dist/internal/extractor/adapters/python/manifest.d.ts +25 -0
  56. package/dist/internal/extractor/adapters/python/manifest.js +236 -0
  57. package/dist/internal/extractor/adapters/python/manifest.js.map +1 -0
  58. package/dist/internal/extractor/adapters/python/parser.d.ts +5 -0
  59. package/dist/internal/extractor/adapters/python/parser.js +22 -0
  60. package/dist/internal/extractor/adapters/python/parser.js.map +1 -0
  61. package/dist/internal/extractor/adapters/python/scanner.d.ts +37 -0
  62. package/dist/internal/extractor/adapters/python/scanner.js +284 -0
  63. package/dist/internal/extractor/adapters/python/scanner.js.map +1 -0
  64. package/dist/internal/extractor/adapters/typescript/index.d.ts +9 -0
  65. package/dist/internal/extractor/adapters/typescript/index.js +84 -0
  66. package/dist/internal/extractor/adapters/typescript/index.js.map +1 -0
  67. package/dist/internal/extractor/adapters/typescript/manifest.d.ts +41 -0
  68. package/dist/internal/extractor/adapters/typescript/manifest.js +156 -0
  69. package/dist/internal/extractor/adapters/typescript/manifest.js.map +1 -0
  70. package/dist/internal/extractor/adapters/typescript/parser.d.ts +14 -0
  71. package/dist/internal/extractor/adapters/typescript/parser.js +33 -0
  72. package/dist/internal/extractor/adapters/typescript/parser.js.map +1 -0
  73. package/dist/internal/extractor/adapters/typescript/scanner.d.ts +43 -0
  74. package/dist/internal/extractor/adapters/typescript/scanner.js +188 -0
  75. package/dist/internal/extractor/adapters/typescript/scanner.js.map +1 -0
  76. package/dist/internal/extractor/index.d.ts +22 -0
  77. package/dist/internal/extractor/index.js +107 -0
  78. package/dist/internal/extractor/index.js.map +1 -0
  79. package/dist/internal/extractor/types.d.ts +124 -0
  80. package/dist/internal/extractor/types.js +28 -0
  81. package/dist/internal/extractor/types.js.map +1 -0
  82. package/dist/internal/extractor/walker.d.ts +32 -0
  83. package/dist/internal/extractor/walker.js +110 -0
  84. package/dist/internal/extractor/walker.js.map +1 -0
  85. package/dist/internal/ide-setup.d.ts +7 -0
  86. package/dist/internal/ide-setup.js +131 -0
  87. package/dist/internal/ide-setup.js.map +1 -0
  88. package/dist/internal/orgs.d.ts +8 -0
  89. package/dist/internal/orgs.js +31 -0
  90. package/dist/internal/orgs.js.map +1 -0
  91. package/dist/internal/project-binding.d.ts +11 -0
  92. package/dist/internal/project-binding.js +96 -0
  93. package/dist/internal/project-binding.js.map +1 -0
  94. package/dist/internal/target-auth/api-config.d.ts +37 -0
  95. package/dist/internal/target-auth/api-config.js +40 -0
  96. package/dist/internal/target-auth/api-config.js.map +1 -0
  97. package/dist/internal/target-auth/config.d.ts +20 -0
  98. package/dist/internal/target-auth/config.js +58 -0
  99. package/dist/internal/target-auth/config.js.map +1 -0
  100. package/dist/internal/target-auth/index.d.ts +30 -0
  101. package/dist/internal/target-auth/index.js +101 -0
  102. package/dist/internal/target-auth/index.js.map +1 -0
  103. package/dist/internal/target-auth/keychain.d.ts +23 -0
  104. package/dist/internal/target-auth/keychain.js +150 -0
  105. package/dist/internal/target-auth/keychain.js.map +1 -0
  106. package/dist/internal/target-auth/types.d.ts +51 -0
  107. package/dist/internal/target-auth/types.js +11 -0
  108. package/dist/internal/target-auth/types.js.map +1 -0
  109. package/dist/internal/target-auth/workos.d.ts +20 -0
  110. package/dist/internal/target-auth/workos.js +196 -0
  111. package/dist/internal/target-auth/workos.js.map +1 -0
  112. 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,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerAuthCommands(program: Command): void;
@@ -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,8 @@
1
+ export interface LoginCmdOpts {
2
+ session?: string;
3
+ org?: string;
4
+ yes?: boolean;
5
+ bind?: boolean;
6
+ noBind?: boolean;
7
+ }
8
+ export declare function loginCommand(opts: LoginCmdOpts): Promise<void>;
@@ -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,5 @@
1
+ export interface LogoutCmdOpts {
2
+ session?: string;
3
+ all?: boolean;
4
+ }
5
+ export declare function logoutCommand(opts: LogoutCmdOpts): Promise<void>;
@@ -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,4 @@
1
+ export interface SessionsCmdOpts {
2
+ remove?: string;
3
+ }
4
+ export declare function sessionsCommand(opts: SessionsCmdOpts): Promise<void>;
@@ -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,4 @@
1
+ export interface StatusCmdOpts {
2
+ session?: string;
3
+ }
4
+ export declare function statusCommand(opts: StatusCmdOpts): Promise<void>;
@@ -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,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerCreditsCommands(program: Command): void;
@@ -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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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerMcpCommands(program: Command): void;