@zivis/cli 0.1.0-alpha.40 → 0.1.0-alpha.6
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 +8 -0
- package/dist/commands/app/index.js +16 -4
- package/dist/commands/app/index.js.map +1 -0
- package/dist/commands/auth/index.js +2 -20
- package/dist/commands/auth/index.js.map +1 -0
- package/dist/commands/auth/init.d.ts +0 -1
- package/dist/commands/auth/init.js +97 -231
- package/dist/commands/auth/init.js.map +1 -0
- package/dist/commands/auth/login.d.ts +0 -2
- package/dist/commands/auth/login.js +18 -136
- package/dist/commands/auth/login.js.map +1 -0
- package/dist/commands/auth/logout.js +7 -19
- package/dist/commands/auth/logout.js.map +1 -0
- package/dist/commands/auth/sessions.js +4 -7
- package/dist/commands/auth/sessions.js.map +1 -0
- package/dist/commands/auth/status.js +12 -33
- package/dist/commands/auth/status.js.map +1 -0
- package/dist/commands/credits/index.js +3 -2
- package/dist/commands/credits/index.js.map +1 -0
- package/dist/commands/mcp/index.js +14 -81
- package/dist/commands/mcp/index.js.map +1 -0
- package/dist/commands/open/index.d.ts +8 -0
- package/dist/commands/open/index.js +11 -0
- package/dist/commands/open/index.js.map +1 -0
- package/dist/commands/scan/index.js +8 -3
- package/dist/commands/scan/index.js.map +1 -0
- package/dist/commands/target/index.js +3 -0
- package/dist/commands/target/index.js.map +1 -0
- package/dist/commands/tm/index.js +10 -3
- package/dist/commands/tm/index.js.map +1 -0
- package/dist/index.js +1 -13
- package/dist/index.js.map +1 -0
- package/dist/internal/extractor/adapters/go/index.d.ts +4 -0
- package/dist/internal/extractor/adapters/go/index.js +6 -0
- package/dist/internal/extractor/adapters/go/index.js.map +1 -0
- package/dist/internal/extractor/adapters/go/manifest.d.ts +17 -0
- package/dist/internal/extractor/adapters/go/manifest.js +25 -19
- package/dist/internal/extractor/adapters/go/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/go/parser.d.ts +4 -0
- package/dist/internal/extractor/adapters/go/parser.js +5 -0
- package/dist/internal/extractor/adapters/go/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/go/scanner.d.ts +20 -0
- package/dist/internal/extractor/adapters/go/scanner.js +43 -0
- package/dist/internal/extractor/adapters/go/scanner.js.map +1 -0
- package/dist/internal/extractor/adapters/python/index.d.ts +3 -0
- package/dist/internal/extractor/adapters/python/index.js +4 -0
- package/dist/internal/extractor/adapters/python/index.js.map +1 -0
- package/dist/internal/extractor/adapters/python/manifest.d.ts +8 -0
- package/dist/internal/extractor/adapters/python/manifest.js +18 -21
- package/dist/internal/extractor/adapters/python/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/python/parser.d.ts +3 -0
- package/dist/internal/extractor/adapters/python/parser.js +4 -0
- package/dist/internal/extractor/adapters/python/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/python/scanner.d.ts +18 -0
- package/dist/internal/extractor/adapters/python/scanner.js +54 -1
- package/dist/internal/extractor/adapters/python/scanner.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/index.d.ts +7 -0
- package/dist/internal/extractor/adapters/typescript/index.js +21 -1
- package/dist/internal/extractor/adapters/typescript/index.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/manifest.d.ts +14 -0
- package/dist/internal/extractor/adapters/typescript/manifest.js +17 -26
- package/dist/internal/extractor/adapters/typescript/manifest.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/parser.d.ts +8 -0
- package/dist/internal/extractor/adapters/typescript/parser.js +9 -0
- package/dist/internal/extractor/adapters/typescript/parser.js.map +1 -0
- package/dist/internal/extractor/adapters/typescript/scanner.d.ts +24 -0
- package/dist/internal/extractor/adapters/typescript/scanner.js +43 -0
- package/dist/internal/extractor/adapters/typescript/scanner.js.map +1 -0
- package/dist/internal/extractor/index.d.ts +14 -0
- package/dist/internal/extractor/index.js +13 -0
- package/dist/internal/extractor/index.js.map +1 -0
- package/dist/internal/extractor/types.d.ts +45 -0
- package/dist/internal/extractor/types.js +27 -0
- package/dist/internal/extractor/types.js.map +1 -0
- package/dist/internal/extractor/walker.d.ts +18 -0
- package/dist/internal/extractor/walker.js +18 -0
- package/dist/internal/extractor/walker.js.map +1 -0
- package/dist/internal/ide-setup.d.ts +7 -16
- package/dist/internal/ide-setup.js +46 -320
- package/dist/internal/ide-setup.js.map +1 -0
- package/dist/internal/orgs.js +1 -0
- package/dist/internal/orgs.js.map +1 -0
- package/dist/internal/project-binding.d.ts +0 -1
- package/dist/internal/project-binding.js +9 -14
- package/dist/internal/project-binding.js.map +1 -0
- package/dist/internal/target-auth/api-config.d.ts +17 -0
- package/dist/internal/target-auth/api-config.js +18 -0
- package/dist/internal/target-auth/api-config.js.map +1 -0
- package/dist/internal/target-auth/config.d.ts +12 -0
- package/dist/internal/target-auth/config.js +13 -0
- package/dist/internal/target-auth/config.js.map +1 -0
- package/dist/internal/target-auth/index.d.ts +18 -0
- package/dist/internal/target-auth/index.js +19 -0
- package/dist/internal/target-auth/index.js.map +1 -0
- package/dist/internal/target-auth/keychain.d.ts +18 -0
- package/dist/internal/target-auth/keychain.js +23 -3
- package/dist/internal/target-auth/keychain.js.map +1 -0
- package/dist/internal/target-auth/types.d.ts +26 -0
- package/dist/internal/target-auth/types.js +10 -0
- package/dist/internal/target-auth/types.js.map +1 -0
- package/dist/internal/target-auth/workos.d.ts +15 -0
- package/dist/internal/target-auth/workos.js +18 -9
- package/dist/internal/target-auth/workos.js.map +1 -0
- package/package.json +5 -19
- package/LICENSE +0 -201
- package/README.md +0 -31
- package/dist/commands/auth/bind.d.ts +0 -4
- package/dist/commands/auth/bind.js +0 -97
- package/dist/commands/auth/token.d.ts +0 -4
- package/dist/commands/auth/token.js +0 -73
- package/dist/commands/check/index.d.ts +0 -2
- package/dist/commands/check/index.js +0 -463
- package/dist/commands/inspect/index.d.ts +0 -2
- package/dist/commands/inspect/index.js +0 -136
- package/dist/internal/binding-token-mint.d.ts +0 -33
- package/dist/internal/binding-token-mint.js +0 -174
- package/dist/internal/extractor/graph-builder.d.ts +0 -10
- package/dist/internal/extractor/graph-builder.js +0 -245
- package/dist/internal/extractor/graph-types.d.ts +0 -89
- package/dist/internal/extractor/graph-types.js +0 -1
- package/dist/internal/github-linkage-prompt.d.ts +0 -7
- package/dist/internal/github-linkage-prompt.js +0 -95
- package/dist/internal/org-picker.d.ts +0 -11
- package/dist/internal/org-picker.js +0 -34
|
@@ -1,161 +1,60 @@
|
|
|
1
|
-
import * as readline from "node:readline/promises";
|
|
2
1
|
import { login } from "@zivis/mcp/auth";
|
|
3
2
|
import { getStorageName } from "@zivis/mcp/auth";
|
|
4
3
|
import { saveSessionEntry } from "@zivis/mcp/auth";
|
|
5
|
-
import { detectProjectBinding
|
|
6
|
-
import {
|
|
4
|
+
import { detectProjectBinding } from "@zivis/mcp/project-binding";
|
|
5
|
+
import { DEFAULT_CONFIG } from "@zivis/mcp/types";
|
|
7
6
|
import { extractEmail } from "../../internal/orgs.js";
|
|
8
|
-
import { pickOrg } from "../../internal/org-picker.js";
|
|
9
7
|
import { ensureProjectBinding } from "../../internal/project-binding.js";
|
|
10
|
-
import {
|
|
11
|
-
import { setupCursorWorkspace, setupVsCodeClaude, setupVsCodeCopilot, setupClaudeCodeCli, } from "../../internal/ide-setup.js";
|
|
12
|
-
import { buildLinkagePrompt } from "../../internal/github-linkage-prompt.js";
|
|
13
|
-
async function confirm(question) {
|
|
14
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
|
|
15
|
-
try {
|
|
16
|
-
const answer = (await rl.question(question)).trim().toLowerCase();
|
|
17
|
-
return answer !== "n" && answer !== "no";
|
|
18
|
-
}
|
|
19
|
-
finally {
|
|
20
|
-
rl.close();
|
|
21
|
-
}
|
|
22
|
-
}
|
|
8
|
+
import { setupVsCodeClaude, setupVsCodeCopilot, setupClaudeCodeCli, } from "../../internal/ide-setup.js";
|
|
23
9
|
export async function loginCommand(opts) {
|
|
24
|
-
const config =
|
|
25
|
-
...DEFAULT_CONFIG,
|
|
26
|
-
...resolveConfigFromBinding(process.cwd()),
|
|
27
|
-
};
|
|
10
|
+
const config = DEFAULT_CONFIG;
|
|
28
11
|
const detected = detectProjectBinding(process.cwd());
|
|
29
12
|
const session = opts.session || detected?.binding.session || config.session;
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
let orgName;
|
|
33
|
-
let writeMode = "no-write";
|
|
34
|
-
if (opts.org) {
|
|
35
|
-
organizationId = opts.org;
|
|
36
|
-
orgName = detected?.binding.orgName && detected.binding.workosOrgId === opts.org
|
|
37
|
-
? detected.binding.orgName
|
|
38
|
-
: undefined;
|
|
39
|
-
if (opts.rebind) {
|
|
40
|
-
writeMode = "replace";
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
else if (opts.rebind) {
|
|
44
|
-
const picked = await runIdentityThenPicker(config, sessionName, {
|
|
45
|
-
currentOrgId: detected?.binding.workosOrgId ?? undefined,
|
|
46
|
-
header: detected?.binding.workosOrgId
|
|
47
|
-
? "Switch this project to which org?"
|
|
48
|
-
: "Your organizations:",
|
|
49
|
-
});
|
|
50
|
-
if (detected?.binding.workosOrgId && detected.binding.workosOrgId === picked.workosOrgId) {
|
|
51
|
-
console.log(`Project is already bound to ${picked.name}. Nothing to change.`);
|
|
52
|
-
process.exit(0);
|
|
53
|
-
}
|
|
54
|
-
if (detected?.binding.workosOrgId) {
|
|
55
|
-
const fromLabel = detected.binding.orgName
|
|
56
|
-
? `${detected.binding.orgName} (${detected.binding.workosOrgId})`
|
|
57
|
-
: detected.binding.workosOrgId;
|
|
58
|
-
const toLabel = `${picked.name} (${picked.workosOrgId})`;
|
|
59
|
-
if (!opts.yes) {
|
|
60
|
-
const ok = await confirm(`Change project binding from "${fromLabel}" to "${toLabel}"? [Y/n] `);
|
|
61
|
-
if (!ok) {
|
|
62
|
-
console.log("Aborted.");
|
|
63
|
-
process.exit(0);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
writeMode = "replace";
|
|
67
|
-
}
|
|
68
|
-
else {
|
|
69
|
-
writeMode = "create";
|
|
70
|
-
}
|
|
71
|
-
organizationId = picked.workosOrgId;
|
|
72
|
-
orgName = picked.name;
|
|
73
|
-
}
|
|
74
|
-
else if (detected?.binding.workosOrgId) {
|
|
13
|
+
let organizationId = opts.org;
|
|
14
|
+
if (!organizationId && detected?.binding.workosOrgId) {
|
|
75
15
|
organizationId = detected.binding.workosOrgId;
|
|
76
|
-
orgName
|
|
77
|
-
console.log(`Using org from project binding: ${organizationId}${orgName ? ` (${orgName})` : ""}`);
|
|
78
|
-
}
|
|
79
|
-
else {
|
|
80
|
-
const picked = await runIdentityThenPicker(config, sessionName, {
|
|
81
|
-
header: "Your organizations:",
|
|
82
|
-
});
|
|
83
|
-
organizationId = picked.workosOrgId;
|
|
84
|
-
orgName = picked.name;
|
|
85
|
-
writeMode = "create";
|
|
86
|
-
}
|
|
87
|
-
if (!organizationId) {
|
|
88
|
-
console.error("Internal error: no organization resolved for login.");
|
|
89
|
-
process.exit(1);
|
|
16
|
+
console.log(`Using org from project binding: ${organizationId}${detected.binding.orgName ? ` (${detected.binding.orgName})` : ""}`);
|
|
90
17
|
}
|
|
91
18
|
if (detected?.binding.session && !opts.session) {
|
|
92
19
|
console.log(`Using session from project binding: ${session}`);
|
|
93
20
|
}
|
|
94
21
|
try {
|
|
95
22
|
const tokens = await login(config, session, organizationId, {
|
|
96
|
-
orgName,
|
|
97
|
-
skipConfirm: opts.yes === true
|
|
23
|
+
orgName: detected?.binding.orgName,
|
|
24
|
+
skipConfirm: opts.yes === true,
|
|
98
25
|
});
|
|
99
26
|
const storageName = getStorageName();
|
|
100
27
|
const email = extractEmail(tokens.id_token);
|
|
101
|
-
|
|
28
|
+
const sessionName = session || "default";
|
|
29
|
+
await saveSessionEntry(sessionName, email);
|
|
102
30
|
const sessionLabel = session ? ` (session: ${session})` : "";
|
|
103
31
|
console.log(`✓ Logged in as ${email}${sessionLabel}`);
|
|
104
32
|
console.log(`✓ Credentials stored in ${storageName}`);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
await setupCursorWorkspace();
|
|
108
|
-
}
|
|
109
|
-
catch (err) {
|
|
110
|
-
console.log(` WARNING: Failed to update .cursor/mcp.json: ${err instanceof Error ? err.message : err}`);
|
|
33
|
+
if (organizationId) {
|
|
34
|
+
console.log(`✓ JWT scoped to organization: ${organizationId}`);
|
|
111
35
|
}
|
|
112
36
|
try {
|
|
113
|
-
await setupVsCodeClaude();
|
|
114
|
-
await setupVsCodeCopilot();
|
|
37
|
+
await setupVsCodeClaude(session);
|
|
38
|
+
await setupVsCodeCopilot(session);
|
|
115
39
|
}
|
|
116
40
|
catch (err) {
|
|
117
41
|
console.log(` WARNING: Failed to update .vscode/mcp.json: ${err instanceof Error ? err.message : err}`);
|
|
118
42
|
}
|
|
119
43
|
try {
|
|
120
|
-
await setupClaudeCodeCli();
|
|
44
|
+
await setupClaudeCodeCli(session);
|
|
121
45
|
}
|
|
122
46
|
catch (err) {
|
|
123
47
|
console.log(` WARNING: Failed to update Claude Code CLI config: ${err instanceof Error ? err.message : err}`);
|
|
124
48
|
}
|
|
125
|
-
if (writeMode === "create" && !opts.yes && !opts.noBind) {
|
|
126
|
-
const orgLabel = orgName ? `${orgName} (${organizationId})` : organizationId;
|
|
127
|
-
const ok = await confirm(`Bind this project to ${orgLabel}? [Y/n] `);
|
|
128
|
-
if (!ok) {
|
|
129
|
-
console.log("Login succeeded but project was not bound.");
|
|
130
|
-
await discardOauthAfterLogin({ session, config });
|
|
131
|
-
process.exit(0);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
49
|
await ensureProjectBinding({
|
|
135
50
|
config,
|
|
136
51
|
session: sessionName,
|
|
137
52
|
accessToken: tokens.access_token,
|
|
138
53
|
organizationId,
|
|
139
54
|
cwd: process.cwd(),
|
|
140
|
-
autoBind: opts.bind === true
|
|
55
|
+
autoBind: opts.bind === true,
|
|
141
56
|
skipBind: opts.noBind === true,
|
|
142
|
-
force: writeMode === "replace",
|
|
143
57
|
});
|
|
144
|
-
await tryAutoMintBindingTokenAfterLogin({
|
|
145
|
-
cwd: process.cwd(),
|
|
146
|
-
sessionName,
|
|
147
|
-
accessToken: tokens.access_token,
|
|
148
|
-
skip: opts.skipMintKey === true,
|
|
149
|
-
warnOnFailure: true,
|
|
150
|
-
});
|
|
151
|
-
await discardOauthAfterLogin({ session, config });
|
|
152
|
-
try {
|
|
153
|
-
const linkagePrompt = await buildLinkagePrompt({ config });
|
|
154
|
-
if (linkagePrompt)
|
|
155
|
-
console.log(linkagePrompt);
|
|
156
|
-
}
|
|
157
|
-
catch {
|
|
158
|
-
}
|
|
159
58
|
process.exit(0);
|
|
160
59
|
}
|
|
161
60
|
catch (err) {
|
|
@@ -163,21 +62,4 @@ export async function loginCommand(opts) {
|
|
|
163
62
|
process.exit(1);
|
|
164
63
|
}
|
|
165
64
|
}
|
|
166
|
-
|
|
167
|
-
console.log("Opening browser to identify your account (no org scope yet)...");
|
|
168
|
-
let identity;
|
|
169
|
-
try {
|
|
170
|
-
identity = await login(config, session, undefined, { skipConfirm: true });
|
|
171
|
-
}
|
|
172
|
-
catch (err) {
|
|
173
|
-
console.error("Login failed:", err instanceof Error ? err.message : err);
|
|
174
|
-
process.exit(1);
|
|
175
|
-
}
|
|
176
|
-
try {
|
|
177
|
-
return await pickOrg(config, identity.access_token, pickOpts);
|
|
178
|
-
}
|
|
179
|
-
catch (err) {
|
|
180
|
-
console.error(err instanceof Error ? err.message : err);
|
|
181
|
-
process.exit(1);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
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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"}
|
|
@@ -1,26 +1,14 @@
|
|
|
1
|
-
import { keychainClearAll, keychainClearSession
|
|
1
|
+
import { keychainClearAll, keychainClearSession } from "@zivis/mcp/auth";
|
|
2
2
|
import { removeSessionEntry } from "@zivis/mcp/auth";
|
|
3
|
-
import { detectProjectBinding, resolveConfigFromBinding } from "@zivis/mcp/project-binding";
|
|
4
|
-
import { credentialStorageFromConfig } from "@zivis/mcp/types";
|
|
5
3
|
export async function logoutCommand(opts) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (sessionName) {
|
|
11
|
-
await keychainClearSession(sessionName, st);
|
|
12
|
-
const apiKeyAccount = `apikey.${sessionName}`;
|
|
13
|
-
const hadApiKey = !!(await keychainRead(apiKeyAccount, st).catch(() => null));
|
|
14
|
-
if (hadApiKey) {
|
|
15
|
-
await keychainDelete(apiKeyAccount, st);
|
|
16
|
-
console.log(`✓ Local Project Binding Token cleared for session "${sessionName}"`);
|
|
17
|
-
console.log(` Note: To revoke the key server-side, visit Settings → API Tokens in the ZIVIS UI.`);
|
|
18
|
-
}
|
|
19
|
-
await removeSessionEntry(sessionName, st);
|
|
20
|
-
console.log(`✓ Session "${sessionName}" credentials cleared`);
|
|
4
|
+
if (opts.session) {
|
|
5
|
+
await keychainClearSession(opts.session);
|
|
6
|
+
await removeSessionEntry(opts.session);
|
|
7
|
+
console.log(`✓ Session "${opts.session}" credentials cleared`);
|
|
21
8
|
return;
|
|
22
9
|
}
|
|
23
|
-
await keychainClearAll(
|
|
10
|
+
await keychainClearAll();
|
|
24
11
|
console.log("✓ Default credentials cleared");
|
|
25
12
|
console.log(" Note: Named sessions are not affected. Use 'zivis auth sessions' to list them.");
|
|
26
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,iBAAiB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAOrD,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"}
|
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
import { listSessions, removeSessionEntry, keychainClearSession } from "@zivis/mcp/auth";
|
|
2
|
-
import { resolveConfigFromBinding } from "@zivis/mcp/project-binding";
|
|
3
|
-
import { credentialStorageFromConfig } from "@zivis/mcp/types";
|
|
4
2
|
export async function sessionsCommand(opts) {
|
|
5
|
-
const config = resolveConfigFromBinding(process.cwd());
|
|
6
|
-
const st = credentialStorageFromConfig(config);
|
|
7
3
|
if (opts.remove) {
|
|
8
|
-
await keychainClearSession(opts.remove
|
|
9
|
-
await removeSessionEntry(opts.remove
|
|
4
|
+
await keychainClearSession(opts.remove);
|
|
5
|
+
await removeSessionEntry(opts.remove);
|
|
10
6
|
console.log(`✓ Session "${opts.remove}" removed`);
|
|
11
7
|
return;
|
|
12
8
|
}
|
|
13
|
-
const sessions = await listSessions(
|
|
9
|
+
const sessions = await listSessions();
|
|
14
10
|
const activeSession = process.env.ZIVIS_SESSION;
|
|
15
11
|
if (sessions.length === 0) {
|
|
16
12
|
console.log("No sessions stored.");
|
|
@@ -31,3 +27,4 @@ export async function sessionsCommand(opts) {
|
|
|
31
27
|
console.log("To use a session in a project, add to .mcp.json:");
|
|
32
28
|
console.log(' "env": { "ZIVIS_SESSION": "<session-name>" }');
|
|
33
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,iBAAiB,CAAC;AAMzF,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"}
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import { resolveAuth, loadTokens, keychainRead } from "@zivis/mcp/auth";
|
|
2
|
-
import { detectProjectBinding
|
|
3
|
-
import { DEFAULT_CONFIG
|
|
1
|
+
import { resolveAuth, loadTokens, getStorageName, keychainRead } from "@zivis/mcp/auth";
|
|
2
|
+
import { detectProjectBinding } from "@zivis/mcp/project-binding";
|
|
3
|
+
import { DEFAULT_CONFIG } from "@zivis/mcp/types";
|
|
4
4
|
import { extractEmail } from "../../internal/orgs.js";
|
|
5
5
|
export async function statusCommand(opts) {
|
|
6
|
-
const config =
|
|
6
|
+
const config = DEFAULT_CONFIG;
|
|
7
7
|
const detected = detectProjectBinding(process.cwd());
|
|
8
8
|
const session = opts.session || config.session || detected?.binding.session;
|
|
9
9
|
const resolveConfig = session ? { ...config, session } : config;
|
|
10
|
-
const st = credentialStorageFromConfig(resolveConfig);
|
|
11
10
|
if (session) {
|
|
12
11
|
const source = opts.session
|
|
13
12
|
? "flag"
|
|
@@ -19,7 +18,7 @@ export async function statusCommand(opts) {
|
|
|
19
18
|
const creds = await resolveAuth(resolveConfig);
|
|
20
19
|
switch (creds.method) {
|
|
21
20
|
case "oauth": {
|
|
22
|
-
const tokens = await loadTokens(session
|
|
21
|
+
const tokens = await loadTokens(session);
|
|
23
22
|
const email = extractEmail(tokens?.id_token);
|
|
24
23
|
console.log(`Auth: OAuth (${email})`);
|
|
25
24
|
if (tokens) {
|
|
@@ -29,30 +28,11 @@ export async function statusCommand(opts) {
|
|
|
29
28
|
break;
|
|
30
29
|
}
|
|
31
30
|
case "apikey": {
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
? `${key.slice(0, 10)}...${key.slice(-4)}`
|
|
31
|
+
const masked = creds.apiKey?.startsWith("sk_")
|
|
32
|
+
? `sk_...${creds.apiKey.slice(-4)}`
|
|
35
33
|
: "***";
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
? !!(await keychainRead(sessionApiKeyAccount, st))
|
|
39
|
-
: false;
|
|
40
|
-
const isEnvKey = key === process.env.ZIVIS_API_KEY;
|
|
41
|
-
const isGlobalKey = !isSessionKey && !isEnvKey && !!(await keychainRead("apikey", st));
|
|
42
|
-
if (isSessionKey && key.startsWith("sk_")) {
|
|
43
|
-
console.log(`Auth: Local Project Binding Token (${masked})`);
|
|
44
|
-
console.log(` Minted by \`zivis auth bind\` — org-scoped, no refresh needed`);
|
|
45
|
-
}
|
|
46
|
-
else if (isEnvKey) {
|
|
47
|
-
console.log(`Auth: API Key from ZIVIS_API_KEY env var (${masked})`);
|
|
48
|
-
}
|
|
49
|
-
else if (isGlobalKey) {
|
|
50
|
-
console.log(`Auth: API Key from keychain (${masked})`);
|
|
51
|
-
console.log(` Run \`zivis auth bind\` in this repo for project-scoped credentials`);
|
|
52
|
-
}
|
|
53
|
-
else {
|
|
54
|
-
console.log(`Auth: API Key (${masked})`);
|
|
55
|
-
}
|
|
34
|
+
const source = (await keychainRead("apikey")) ? getStorageName() : "environment variable";
|
|
35
|
+
console.log(`Auth: API Key (${masked}) from ${source}`);
|
|
56
36
|
break;
|
|
57
37
|
}
|
|
58
38
|
case "none":
|
|
@@ -60,15 +40,14 @@ export async function statusCommand(opts) {
|
|
|
60
40
|
console.log("");
|
|
61
41
|
if (session) {
|
|
62
42
|
console.log(`Session "${session}" has no credentials.`);
|
|
63
|
-
console.log(`
|
|
64
|
-
console.log(` Or manually: zivis auth login --session ${session}`);
|
|
43
|
+
console.log(`Run: zivis auth login --session ${session}`);
|
|
65
44
|
}
|
|
66
45
|
else {
|
|
67
46
|
console.log("To authenticate:");
|
|
68
|
-
console.log(" zivis auth
|
|
69
|
-
console.log(" zivis auth login (interactive OAuth for web access)");
|
|
47
|
+
console.log(" zivis auth login");
|
|
70
48
|
}
|
|
71
49
|
break;
|
|
72
50
|
}
|
|
73
51
|
console.log(`API: ${resolveConfig.apiBaseUrl}`);
|
|
74
52
|
}
|
|
53
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/auth/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAMtD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAmB;IACrD,MAAM,MAAM,GAAG,cAAc,CAAC;IAC9B,MAAM,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,IAAI,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC;IAC5E,MAAM,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;IAEhE,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO;YACzB,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,MAAM,CAAC,OAAO;gBAChB,CAAC,CAAC,eAAe;gBACjB,CAAC,CAAC,iBAAiB,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,UAAU,MAAM,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,CAAC;IAE/C,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC;YACzC,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,GAAG,CAAC,CAAC;YACxC,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,GAAG,EAAE,CAAC,CAAC;gBAC3E,OAAO,CAAC,GAAG,CACT,WAAW,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,SAAS,MAAM,CAAC,CAAC,CAAC,wBAAwB,EAAE,CACtF,CAAC;YACJ,CAAC;YACD,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,KAAK,CAAC;gBAC5C,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;gBACnC,CAAC,CAAC,KAAK,CAAC;YACV,MAAM,MAAM,GAAG,CAAC,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,sBAAsB,CAAC;YAC1F,OAAO,CAAC,GAAG,CAAC,oBAAoB,MAAM,UAAU,MAAM,EAAE,CAAC,CAAC;YAC1D,MAAM;QACR,CAAC;QACD,KAAK,MAAM;YACT,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,uBAAuB,CAAC,CAAC;gBACxD,OAAO,CAAC,GAAG,CAAC,mCAAmC,OAAO,EAAE,CAAC,CAAC;YAC5D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YACpC,CAAC;YACD,MAAM;IACV,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,aAAa,CAAC,UAAU,EAAE,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ApiClient } from "@zivis/mcp/api-client";
|
|
2
|
-
import {
|
|
2
|
+
import { DEFAULT_CONFIG } from "@zivis/mcp/types";
|
|
3
3
|
function buildClient(opts) {
|
|
4
|
-
const config = opts.session ? { ...
|
|
4
|
+
const config = opts.session ? { ...DEFAULT_CONFIG, session: opts.session } : DEFAULT_CONFIG;
|
|
5
5
|
return new ApiClient(config);
|
|
6
6
|
}
|
|
7
7
|
export function registerCreditsCommands(program) {
|
|
@@ -48,3 +48,4 @@ export function registerCreditsCommands(program) {
|
|
|
48
48
|
}
|
|
49
49
|
});
|
|
50
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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"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import * as path from "node:path";
|
|
2
|
-
import * as readline from "node:readline/promises";
|
|
3
1
|
import { startServer } from "@zivis/mcp/server";
|
|
4
2
|
import { DEFAULT_CONFIG } from "@zivis/mcp/types";
|
|
5
|
-
import {
|
|
3
|
+
import { setupCursor, setupVsCodeCopilot, setupVsCodeClaude, setupClaudeCodeCli, setupCline, setupWindsurf, printClaudeCodeManual, } from "../../internal/ide-setup.js";
|
|
6
4
|
const KNOWN_CLIENTS = [
|
|
7
5
|
"cursor",
|
|
8
6
|
"claude-code",
|
|
@@ -12,84 +10,50 @@ const KNOWN_CLIENTS = [
|
|
|
12
10
|
"vscode-copilot",
|
|
13
11
|
"vscode-claude",
|
|
14
12
|
];
|
|
15
|
-
function toGuidanceClient(client) {
|
|
16
|
-
switch (client) {
|
|
17
|
-
case "cursor": return "cursor";
|
|
18
|
-
case "claude-code-cli": return "claude-code-cli";
|
|
19
|
-
case "vscode-copilot": return "vscode-copilot";
|
|
20
|
-
case "vscode-claude": return "vscode-claude";
|
|
21
|
-
case "cline": return "cline";
|
|
22
|
-
case "windsurf": return "windsurf";
|
|
23
|
-
default: return null;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
async function promptYesNo(question) {
|
|
27
|
-
const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
|
|
28
|
-
try {
|
|
29
|
-
const answer = (await rl.question(question)).trim().toLowerCase();
|
|
30
|
-
return answer !== "n" && answer !== "no";
|
|
31
|
-
}
|
|
32
|
-
finally {
|
|
33
|
-
rl.close();
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
13
|
export function registerMcpCommands(program) {
|
|
37
14
|
const mcp = program.command("mcp").description("MCP server for IDE integration");
|
|
38
15
|
mcp
|
|
39
16
|
.command("serve")
|
|
40
17
|
.description("start the stdio MCP server (called by your IDE, not directly)")
|
|
41
|
-
.
|
|
42
|
-
|
|
43
|
-
const config = { ...DEFAULT_CONFIG };
|
|
44
|
-
if (opts.workspace) {
|
|
45
|
-
config.workspacePath = path.resolve(opts.workspace);
|
|
46
|
-
}
|
|
47
|
-
await startServer(config);
|
|
18
|
+
.action(async () => {
|
|
19
|
+
await startServer(DEFAULT_CONFIG);
|
|
48
20
|
});
|
|
49
21
|
mcp
|
|
50
22
|
.command("install")
|
|
51
|
-
.description("write MCP config for a supported IDE client
|
|
23
|
+
.description("write MCP config for a supported IDE client")
|
|
52
24
|
.option("--client <name>", `target client (${KNOWN_CLIENTS.join(" | ")})`)
|
|
53
|
-
.option("--
|
|
54
|
-
.option("--with-guidance", "also write IDE guidance files so the AI knows when to suggest security checks (no prompt). Only applies to the appsec package; builder ships its own cadence block via zivis_setup.")
|
|
55
|
-
.option("--no-guidance", "skip writing IDE guidance files (no prompt)")
|
|
25
|
+
.option("-s, --session <name>", "include ZIVIS_SESSION env var")
|
|
56
26
|
.action(async (opts) => {
|
|
57
27
|
const client = opts.client?.toLowerCase();
|
|
58
|
-
const
|
|
28
|
+
const session = opts.session;
|
|
59
29
|
if (!client) {
|
|
60
30
|
console.error("Specify a client with --client <name>:");
|
|
61
31
|
for (const c of KNOWN_CLIENTS)
|
|
62
32
|
console.error(` zivis mcp install --client ${c}`);
|
|
63
33
|
process.exit(1);
|
|
64
34
|
}
|
|
65
|
-
if (pkgArg !== "appsec" && pkgArg !== "builder") {
|
|
66
|
-
console.error(`Unknown --package value: ${pkgArg}`);
|
|
67
|
-
console.error("Supported: appsec, builder");
|
|
68
|
-
process.exit(1);
|
|
69
|
-
}
|
|
70
|
-
const pkg = pkgArg;
|
|
71
35
|
try {
|
|
72
36
|
switch (client) {
|
|
73
37
|
case "cursor":
|
|
74
|
-
await
|
|
38
|
+
await setupCursor(session);
|
|
75
39
|
break;
|
|
76
40
|
case "claude-code":
|
|
77
|
-
printClaudeCodeManual(
|
|
41
|
+
printClaudeCodeManual(session);
|
|
78
42
|
break;
|
|
79
43
|
case "claude-code-cli":
|
|
80
|
-
await setupClaudeCodeCli(
|
|
44
|
+
await setupClaudeCodeCli(session);
|
|
81
45
|
break;
|
|
82
46
|
case "cline":
|
|
83
|
-
await setupCline(
|
|
47
|
+
await setupCline(session);
|
|
84
48
|
break;
|
|
85
49
|
case "windsurf":
|
|
86
|
-
await setupWindsurf(
|
|
50
|
+
await setupWindsurf(session);
|
|
87
51
|
break;
|
|
88
52
|
case "vscode-copilot":
|
|
89
|
-
await setupVsCodeCopilot(
|
|
53
|
+
await setupVsCodeCopilot(session);
|
|
90
54
|
break;
|
|
91
55
|
case "vscode-claude":
|
|
92
|
-
await setupVsCodeClaude(
|
|
56
|
+
await setupVsCodeClaude(session);
|
|
93
57
|
break;
|
|
94
58
|
default:
|
|
95
59
|
console.error(`Unknown client: ${client}`);
|
|
@@ -101,37 +65,6 @@ export function registerMcpCommands(program) {
|
|
|
101
65
|
console.error("Install failed:", err instanceof Error ? err.message : err);
|
|
102
66
|
process.exit(1);
|
|
103
67
|
}
|
|
104
|
-
if (client === "claude-code")
|
|
105
|
-
return;
|
|
106
|
-
if (pkg === "builder")
|
|
107
|
-
return;
|
|
108
|
-
const guidanceClient = toGuidanceClient(client);
|
|
109
|
-
if (!guidanceClient)
|
|
110
|
-
return;
|
|
111
|
-
let shouldWrite;
|
|
112
|
-
if (opts.withGuidance) {
|
|
113
|
-
shouldWrite = true;
|
|
114
|
-
}
|
|
115
|
-
else if (opts.guidance === false) {
|
|
116
|
-
shouldWrite = false;
|
|
117
|
-
}
|
|
118
|
-
else {
|
|
119
|
-
console.log("");
|
|
120
|
-
shouldWrite = await promptYesNo("Write ZIVIS guidance files so your IDE knows when to suggest security checks?\n" +
|
|
121
|
-
"(Adds a rule/instruction file to the project. You can edit or remove it anytime.) [Y/n] ");
|
|
122
|
-
}
|
|
123
|
-
if (shouldWrite) {
|
|
124
|
-
try {
|
|
125
|
-
const files = writeGuidance({ cwd: process.cwd(), client: guidanceClient });
|
|
126
|
-
if (files.length > 0) {
|
|
127
|
-
console.log(`✓ Wrote guidance files:`);
|
|
128
|
-
for (const f of files)
|
|
129
|
-
console.log(` ${f}`);
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
catch (err) {
|
|
133
|
-
console.warn(` Warning: Could not write guidance files: ${err instanceof Error ? err.message : err}`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
68
|
});
|
|
137
69
|
}
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/mcp/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `zivis open` — Build and (by default) launch a vscode:// or cursor:// deep link
|
|
3
|
+
* that opens a ZIVIS artifact in the ZIVIS Code IDE extension. Use `--ide cursor`
|
|
4
|
+
* for Cursor. With --print, emit the URI to stdout for piping/sharing.
|
|
5
|
+
*
|
|
6
|
+
* Mirrors the URI shape emitted by the `zivis_open_in_ide` MCP tool and the
|
|
7
|
+
* web app's buildIdeLink() helper. See docs/platform/integrations/IDE-DEEP-LINKS.md.
|
|
8
|
+
*/
|
|
1
9
|
import type { Command } from "commander";
|
|
2
10
|
export declare function registerOpenCommands(program: Command): void;
|
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `zivis open` — Build and (by default) launch a vscode:// or cursor:// deep link
|
|
3
|
+
* that opens a ZIVIS artifact in the ZIVIS Code IDE extension. Use `--ide cursor`
|
|
4
|
+
* for Cursor. With --print, emit the URI to stdout for piping/sharing.
|
|
5
|
+
*
|
|
6
|
+
* Mirrors the URI shape emitted by the `zivis_open_in_ide` MCP tool and the
|
|
7
|
+
* web app's buildIdeLink() helper. See docs/platform/integrations/IDE-DEEP-LINKS.md.
|
|
8
|
+
*/
|
|
1
9
|
const KINDS = ["diagram", "document", "threat-model"];
|
|
2
10
|
export function registerOpenCommands(program) {
|
|
3
11
|
program
|
|
@@ -39,8 +47,11 @@ export function registerOpenCommands(program) {
|
|
|
39
47
|
console.log(uri);
|
|
40
48
|
return;
|
|
41
49
|
}
|
|
50
|
+
// Lazy-import `open` so --print stays dependency-free in environments
|
|
51
|
+
// (e.g. headless CI) where launching a URL handler would fail or hang.
|
|
42
52
|
const { default: open } = await import("open");
|
|
43
53
|
await open(uri);
|
|
44
54
|
console.log(uri);
|
|
45
55
|
});
|
|
46
56
|
}
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/open/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ApiClient } from "@zivis/mcp/api-client";
|
|
2
|
-
import {
|
|
2
|
+
import { DEFAULT_CONFIG } from "@zivis/mcp/types";
|
|
3
3
|
const VALID_TARGET_TYPES = ["ai_chat", "web_app", "api"];
|
|
4
4
|
function buildClient(opts) {
|
|
5
|
-
const config = opts.session ? { ...
|
|
5
|
+
const config = opts.session ? { ...DEFAULT_CONFIG, session: opts.session } : DEFAULT_CONFIG;
|
|
6
6
|
return new ApiClient(config);
|
|
7
7
|
}
|
|
8
8
|
export function registerScanCommands(program) {
|
|
@@ -118,6 +118,11 @@ export function registerScanCommands(program) {
|
|
|
118
118
|
}
|
|
119
119
|
});
|
|
120
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* Map customer-facing ApplicationType to the RT scan's targetType enum.
|
|
123
|
+
* The two enums differ historically: ApplicationType is product-shape,
|
|
124
|
+
* targetType is what the RT runner needs to know about the wire format.
|
|
125
|
+
*/
|
|
121
126
|
function appTypeToTargetType(appType) {
|
|
122
127
|
switch (appType) {
|
|
123
128
|
case "agent":
|
|
@@ -126,10 +131,10 @@ function appTypeToTargetType(appType) {
|
|
|
126
131
|
return "ai_chat";
|
|
127
132
|
case "rest_api":
|
|
128
133
|
return "api";
|
|
129
|
-
case "application":
|
|
130
134
|
case "ad_hoc_url":
|
|
131
135
|
return "web_app";
|
|
132
136
|
default:
|
|
133
137
|
return undefined;
|
|
134
138
|
}
|
|
135
139
|
}
|
|
140
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/scan/index.ts"],"names":[],"mappings":"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"}
|