@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,70 @@
|
|
|
1
|
+
import { startServer } from "@zivis-ai/mcp-security/server";
|
|
2
|
+
import { DEFAULT_CONFIG } from "@zivis-ai/mcp-security/types";
|
|
3
|
+
import { setupCursor, setupVsCodeCopilot, setupVsCodeClaude, setupClaudeCodeCli, setupCline, setupWindsurf, printClaudeCodeManual, } from "../../internal/ide-setup.js";
|
|
4
|
+
const KNOWN_CLIENTS = [
|
|
5
|
+
"cursor",
|
|
6
|
+
"claude-code",
|
|
7
|
+
"claude-code-cli",
|
|
8
|
+
"cline",
|
|
9
|
+
"windsurf",
|
|
10
|
+
"vscode-copilot",
|
|
11
|
+
"vscode-claude",
|
|
12
|
+
];
|
|
13
|
+
export function registerMcpCommands(program) {
|
|
14
|
+
const mcp = program.command("mcp").description("MCP server for IDE integration");
|
|
15
|
+
mcp
|
|
16
|
+
.command("serve")
|
|
17
|
+
.description("start the stdio MCP server (called by your IDE, not directly)")
|
|
18
|
+
.action(async () => {
|
|
19
|
+
await startServer(DEFAULT_CONFIG);
|
|
20
|
+
});
|
|
21
|
+
mcp
|
|
22
|
+
.command("install")
|
|
23
|
+
.description("write MCP config for a supported IDE client")
|
|
24
|
+
.option("--client <name>", `target client (${KNOWN_CLIENTS.join(" | ")})`)
|
|
25
|
+
.option("-s, --session <name>", "include ZIVIS_SESSION env var")
|
|
26
|
+
.action(async (opts) => {
|
|
27
|
+
const client = opts.client?.toLowerCase();
|
|
28
|
+
const session = opts.session;
|
|
29
|
+
if (!client) {
|
|
30
|
+
console.error("Specify a client with --client <name>:");
|
|
31
|
+
for (const c of KNOWN_CLIENTS)
|
|
32
|
+
console.error(` zivis mcp install --client ${c}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
try {
|
|
36
|
+
switch (client) {
|
|
37
|
+
case "cursor":
|
|
38
|
+
await setupCursor(session);
|
|
39
|
+
break;
|
|
40
|
+
case "claude-code":
|
|
41
|
+
printClaudeCodeManual(session);
|
|
42
|
+
break;
|
|
43
|
+
case "claude-code-cli":
|
|
44
|
+
await setupClaudeCodeCli(session);
|
|
45
|
+
break;
|
|
46
|
+
case "cline":
|
|
47
|
+
await setupCline(session);
|
|
48
|
+
break;
|
|
49
|
+
case "windsurf":
|
|
50
|
+
await setupWindsurf(session);
|
|
51
|
+
break;
|
|
52
|
+
case "vscode-copilot":
|
|
53
|
+
await setupVsCodeCopilot(session);
|
|
54
|
+
break;
|
|
55
|
+
case "vscode-claude":
|
|
56
|
+
await setupVsCodeClaude(session);
|
|
57
|
+
break;
|
|
58
|
+
default:
|
|
59
|
+
console.error(`Unknown client: ${client}`);
|
|
60
|
+
console.error(`Supported: ${KNOWN_CLIENTS.join(", ")}`);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
console.error("Install failed:", err instanceof Error ? err.message : err);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
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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"}
|
|
@@ -0,0 +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
|
+
*/
|
|
9
|
+
import type { Command } from "commander";
|
|
10
|
+
export declare function registerOpenCommands(program: Command): void;
|
|
@@ -0,0 +1,57 @@
|
|
|
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
|
+
*/
|
|
9
|
+
const KINDS = ["diagram", "document", "threat-model"];
|
|
10
|
+
export function registerOpenCommands(program) {
|
|
11
|
+
program
|
|
12
|
+
.command("open")
|
|
13
|
+
.description("open a ZIVIS artifact in the ZIVIS Code IDE extension")
|
|
14
|
+
.option("--diagram <id>", "open a diagram by UUID")
|
|
15
|
+
.option("--document <id>", "open a document by UUID")
|
|
16
|
+
.option("--threat-model <id>", "reveal a threat model in the IDE sidebar tree")
|
|
17
|
+
.option("--label <text>", "optional human-readable label for the panel title")
|
|
18
|
+
.option("--print", "print the IDE URI instead of launching it")
|
|
19
|
+
.option("--ide <client>", "target desktop app for the deep link: vscode (default) or cursor", "vscode")
|
|
20
|
+
.action(async (opts) => {
|
|
21
|
+
const matches = [];
|
|
22
|
+
if (opts.diagram)
|
|
23
|
+
matches.push({ kind: "diagram", id: String(opts.diagram) });
|
|
24
|
+
if (opts.document)
|
|
25
|
+
matches.push({ kind: "document", id: String(opts.document) });
|
|
26
|
+
if (opts.threatModel)
|
|
27
|
+
matches.push({ kind: "threat-model", id: String(opts.threatModel) });
|
|
28
|
+
if (matches.length === 0) {
|
|
29
|
+
console.error("Specify one of --diagram <id>, --document <id>, --threat-model <id>.");
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
if (matches.length > 1) {
|
|
33
|
+
console.error("Specify exactly one of --diagram, --document, --threat-model.");
|
|
34
|
+
process.exit(1);
|
|
35
|
+
}
|
|
36
|
+
const { kind, id } = matches[0];
|
|
37
|
+
const label = opts.label;
|
|
38
|
+
const qs = new URLSearchParams();
|
|
39
|
+
qs.set("id", id);
|
|
40
|
+
if (label) {
|
|
41
|
+
qs.set(kind === "document" ? "title" : "name", label);
|
|
42
|
+
}
|
|
43
|
+
const ide = String(opts.ide || "vscode").toLowerCase();
|
|
44
|
+
const scheme = ide === "cursor" ? "cursor" : "vscode";
|
|
45
|
+
const uri = `${scheme}://zivisai.zivis-security/${kind}?${qs.toString()}`;
|
|
46
|
+
if (opts.print) {
|
|
47
|
+
console.log(uri);
|
|
48
|
+
return;
|
|
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.
|
|
52
|
+
const { default: open } = await import("open");
|
|
53
|
+
await open(uri);
|
|
54
|
+
console.log(uri);
|
|
55
|
+
});
|
|
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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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ApiClient } from "@zivis-ai/mcp-security/api-client";
|
|
2
|
+
import { DEFAULT_CONFIG } from "@zivis-ai/mcp-security/types";
|
|
3
|
+
const VALID_TARGET_TYPES = ["ai_chat", "web_app", "api"];
|
|
4
|
+
function buildClient(opts) {
|
|
5
|
+
const config = opts.session ? { ...DEFAULT_CONFIG, session: opts.session } : DEFAULT_CONFIG;
|
|
6
|
+
return new ApiClient(config);
|
|
7
|
+
}
|
|
8
|
+
export function registerScanCommands(program) {
|
|
9
|
+
const scan = program.command("scan").description("trigger and inspect RT scans");
|
|
10
|
+
scan
|
|
11
|
+
.command("run")
|
|
12
|
+
.description("trigger an RT scan against a target (or via --app for app-derived defaults)")
|
|
13
|
+
.option("-s, --session <name>", "named session")
|
|
14
|
+
.option("--app <applicationId>", "derive target-url + target-type from an Application")
|
|
15
|
+
.option("--url <targetUrl>", "target URL (required if --app not provided)")
|
|
16
|
+
.option("--type <targetType>", `target type (${VALID_TARGET_TYPES.join("|")})`)
|
|
17
|
+
.option("--campaign <list>", "comma-separated campaigns (e.g. recon,pen_test,ai_red_team)")
|
|
18
|
+
.option("--name <name>", "scan name shown in the dashboard")
|
|
19
|
+
.option("--scenario <list>", "comma-separated ThreatScenario ids (required for ai_red_team)")
|
|
20
|
+
.option("--threat-model <id>", "threat model id (required for ai_red_team)")
|
|
21
|
+
.option("--priority <n>", "scan priority", "0")
|
|
22
|
+
.option("--json", "emit raw JSON")
|
|
23
|
+
.action(async (opts) => {
|
|
24
|
+
const client = buildClient(opts);
|
|
25
|
+
let targetUrl = opts.url;
|
|
26
|
+
let targetType = opts.type;
|
|
27
|
+
let appName;
|
|
28
|
+
if (opts.app) {
|
|
29
|
+
const cfg = await client.request("GET", `/api/applications/${encodeURIComponent(opts.app)}/auth-config`);
|
|
30
|
+
appName = cfg.name;
|
|
31
|
+
if (!targetUrl) {
|
|
32
|
+
targetUrl = cfg.baseUrl ?? cfg.oauth?.domain;
|
|
33
|
+
}
|
|
34
|
+
if (!targetType) {
|
|
35
|
+
targetType = appTypeToTargetType(cfg.type);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!targetUrl) {
|
|
39
|
+
console.error("--url is required (or use --app to derive it from the Application)");
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
if (!targetType || !VALID_TARGET_TYPES.includes(targetType)) {
|
|
43
|
+
console.error(`--type must be one of: ${VALID_TARGET_TYPES.join(", ")}`);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
const campaigns = String(opts.campaign ?? "")
|
|
47
|
+
.split(",")
|
|
48
|
+
.map((c) => c.trim())
|
|
49
|
+
.filter(Boolean);
|
|
50
|
+
if (campaigns.length === 0) {
|
|
51
|
+
console.error("--campaign is required (e.g. --campaign recon or --campaign ai_red_team)");
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
54
|
+
const scenarioIds = opts.scenario
|
|
55
|
+
? String(opts.scenario).split(",").map((s) => s.trim()).filter(Boolean)
|
|
56
|
+
: undefined;
|
|
57
|
+
if (campaigns.includes("ai_red_team") && (!scenarioIds || !opts.threatModel)) {
|
|
58
|
+
console.error("ai_red_team scans require --threat-model <id> and --scenario <list>");
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
const body = {
|
|
62
|
+
name: opts.name ?? (appName ? `${appName} scan` : `CLI scan`),
|
|
63
|
+
targetUrl,
|
|
64
|
+
targetType,
|
|
65
|
+
campaigns,
|
|
66
|
+
priority: parseInt(opts.priority, 10) || 0,
|
|
67
|
+
};
|
|
68
|
+
if (scenarioIds)
|
|
69
|
+
body.scenarioIds = scenarioIds;
|
|
70
|
+
if (opts.threatModel)
|
|
71
|
+
body.linkedThreatModelId = opts.threatModel;
|
|
72
|
+
try {
|
|
73
|
+
const result = await client.request("POST", "/api/rt/scans", body);
|
|
74
|
+
if (opts.json) {
|
|
75
|
+
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
console.log(`✓ Scan ${result.scan.id} queued (${result.scan.status})`);
|
|
79
|
+
if (result.scan.name)
|
|
80
|
+
console.log(` ${result.scan.name}`);
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
console.error("Scan trigger failed:", err instanceof Error ? err.message : err);
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
scan
|
|
88
|
+
.command("list")
|
|
89
|
+
.description("list recent RT scans for the active org")
|
|
90
|
+
.option("-s, --session <name>", "named session")
|
|
91
|
+
.option("--app <applicationId>", "filter by application")
|
|
92
|
+
.option("--status <status>", "filter by status (pending|running|completed|failed)")
|
|
93
|
+
.option("--limit <n>", "max rows", "20")
|
|
94
|
+
.option("--json", "emit raw JSON")
|
|
95
|
+
.action(async (opts) => {
|
|
96
|
+
const client = buildClient(opts);
|
|
97
|
+
const params = new URLSearchParams();
|
|
98
|
+
if (opts.app)
|
|
99
|
+
params.set("applicationId", opts.app);
|
|
100
|
+
if (opts.status)
|
|
101
|
+
params.set("status", opts.status);
|
|
102
|
+
params.set("limit", opts.limit);
|
|
103
|
+
const path = `/api/rt/scans?${params.toString()}`;
|
|
104
|
+
const result = await client.request("GET", path);
|
|
105
|
+
if (opts.json) {
|
|
106
|
+
process.stdout.write(JSON.stringify(result, null, 2) + "\n");
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const scans = result.scans ?? [];
|
|
110
|
+
if (!scans.length) {
|
|
111
|
+
console.log("No scans.");
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
for (const s of scans) {
|
|
115
|
+
console.log(`${s.id} ${s.status.padEnd(10)} ${s.name ?? ""}`);
|
|
116
|
+
if (s.targetUrl)
|
|
117
|
+
console.log(` ${s.targetUrl}`);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
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
|
+
*/
|
|
126
|
+
function appTypeToTargetType(appType) {
|
|
127
|
+
switch (appType) {
|
|
128
|
+
case "agent":
|
|
129
|
+
case "llm_endpoint":
|
|
130
|
+
case "mcp_server":
|
|
131
|
+
return "ai_chat";
|
|
132
|
+
case "rest_api":
|
|
133
|
+
return "api";
|
|
134
|
+
case "ad_hoc_url":
|
|
135
|
+
return "web_app";
|
|
136
|
+
default:
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
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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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { saveTargetConfig, listTargetConfigs, getConfigPath } from "../../internal/target-auth/config.js";
|
|
2
|
+
import { loginTarget, logoutTarget, tokenInfo, getValidTargetToken, } from "../../internal/target-auth/index.js";
|
|
3
|
+
import { getStorageName } from "../../internal/target-auth/keychain.js";
|
|
4
|
+
import { decodeJwtPayload } from "../../internal/target-auth/workos.js";
|
|
5
|
+
const DEFAULT_PERSONA = "default";
|
|
6
|
+
function warnDeprecated() {
|
|
7
|
+
// stderr so it doesn't pollute stdout (CLI scripts pipe `zivis target token`
|
|
8
|
+
// straight into curl). One line, no color codes — keeps grep-friendly.
|
|
9
|
+
console.error("[zivis] WARNING: 'zivis target' is deprecated; use 'zivis app' instead.");
|
|
10
|
+
}
|
|
11
|
+
export function registerTargetCommands(program) {
|
|
12
|
+
const target = program
|
|
13
|
+
.command("target")
|
|
14
|
+
.description("[deprecated] use 'zivis app' instead — kept for one release window");
|
|
15
|
+
target
|
|
16
|
+
.command("configure <targetId>")
|
|
17
|
+
.description("save IdP config for a target (domain / client-id / mode). Local-only.")
|
|
18
|
+
.requiredOption("--type <type>", "IdP type: workos")
|
|
19
|
+
.option("--client-id <clientId>", "WorkOS client_id (required for type=workos)")
|
|
20
|
+
.option("--domain <domain>", "WorkOS domain (e.g. api.workos.com or <name>.authkit.app)")
|
|
21
|
+
.option("--mode <mode>", "WorkOS path layout: user_management | authkit | workos", "user_management")
|
|
22
|
+
.option("--callback-port <port>", "localhost callback port", "5174")
|
|
23
|
+
.option("--scopes <list>", "comma-separated extra scopes")
|
|
24
|
+
.action(async (targetId, opts) => {
|
|
25
|
+
warnDeprecated();
|
|
26
|
+
if (opts.type !== "workos") {
|
|
27
|
+
console.error(`Unsupported --type: ${opts.type} (only "workos" in v1)`);
|
|
28
|
+
process.exit(1);
|
|
29
|
+
}
|
|
30
|
+
if (!opts.clientId || !opts.domain) {
|
|
31
|
+
console.error("--client-id and --domain are required for type=workos");
|
|
32
|
+
process.exit(1);
|
|
33
|
+
}
|
|
34
|
+
const cfg = {
|
|
35
|
+
type: "workos",
|
|
36
|
+
clientId: opts.clientId,
|
|
37
|
+
domain: opts.domain,
|
|
38
|
+
mode: opts.mode,
|
|
39
|
+
callbackPort: parseInt(opts.callbackPort, 10),
|
|
40
|
+
extraScopes: opts.scopes ? String(opts.scopes).split(",").map((s) => s.trim()).filter(Boolean) : undefined,
|
|
41
|
+
};
|
|
42
|
+
const path = await saveTargetConfig(targetId, cfg);
|
|
43
|
+
console.log(`✓ Wrote ${path}`);
|
|
44
|
+
console.log(` Run: zivis target auth ${targetId}`);
|
|
45
|
+
});
|
|
46
|
+
target
|
|
47
|
+
.command("list")
|
|
48
|
+
.description("list locally-configured targets")
|
|
49
|
+
.action(async () => {
|
|
50
|
+
warnDeprecated();
|
|
51
|
+
const configs = await listTargetConfigs();
|
|
52
|
+
if (configs.length === 0) {
|
|
53
|
+
console.log("No targets configured locally.");
|
|
54
|
+
console.log("");
|
|
55
|
+
console.log("Configure one with:");
|
|
56
|
+
console.log(" zivis target configure <targetId> --type workos --client-id <id> --domain <host>");
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
for (const c of configs) {
|
|
60
|
+
console.log(`${c.targetId} (${c.type})`);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
target
|
|
64
|
+
.command("auth <targetId>")
|
|
65
|
+
.description("PKCE login against the target's IdP; tokens stay in the OS keychain")
|
|
66
|
+
.option("-p, --persona <name>", "persona for permutation testing", DEFAULT_PERSONA)
|
|
67
|
+
.action(async (targetId, opts) => {
|
|
68
|
+
warnDeprecated();
|
|
69
|
+
try {
|
|
70
|
+
const tokens = await loginTarget(targetId, opts.persona);
|
|
71
|
+
const claims = decodeJwtPayload(tokens.access_token) || {};
|
|
72
|
+
const exp = new Date(tokens.expires_at).toISOString();
|
|
73
|
+
console.log(`✓ Logged in as persona "${opts.persona}"`);
|
|
74
|
+
console.log(` storage: ${getStorageName()}`);
|
|
75
|
+
if (claims.sub)
|
|
76
|
+
console.log(` sub: ${claims.sub}`);
|
|
77
|
+
if (claims.email)
|
|
78
|
+
console.log(` email: ${claims.email}`);
|
|
79
|
+
if (claims.org_id)
|
|
80
|
+
console.log(` org: ${claims.org_id}`);
|
|
81
|
+
console.log(` expires: ${exp}`);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
console.error("Login failed:", err instanceof Error ? err.message : err);
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
target
|
|
89
|
+
.command("token <targetId>")
|
|
90
|
+
.description("print a valid access_token (auto-refreshes); for piping into curl/scripts")
|
|
91
|
+
.option("-p, --persona <name>", "persona", DEFAULT_PERSONA)
|
|
92
|
+
.action(async (targetId, opts) => {
|
|
93
|
+
warnDeprecated();
|
|
94
|
+
try {
|
|
95
|
+
const tokens = await getValidTargetToken(targetId, opts.persona);
|
|
96
|
+
if (!tokens) {
|
|
97
|
+
console.error(`No token for target ${targetId} (persona: ${opts.persona}). Run: zivis target auth ${targetId} -p ${opts.persona}`);
|
|
98
|
+
process.exit(2);
|
|
99
|
+
}
|
|
100
|
+
process.stdout.write(tokens.access_token);
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
console.error("Token fetch failed:", err instanceof Error ? err.message : err);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
target
|
|
108
|
+
.command("whoami <targetId>")
|
|
109
|
+
.description("decode the stored token and print expiry + key claims")
|
|
110
|
+
.option("-p, --persona <name>", "persona", DEFAULT_PERSONA)
|
|
111
|
+
.option("--json", "emit raw JSON")
|
|
112
|
+
.action(async (targetId, opts) => {
|
|
113
|
+
warnDeprecated();
|
|
114
|
+
const info = await tokenInfo(targetId, opts.persona);
|
|
115
|
+
if (!info) {
|
|
116
|
+
console.error(`No tokens stored for target ${targetId} (persona: ${opts.persona}).`);
|
|
117
|
+
process.exit(2);
|
|
118
|
+
}
|
|
119
|
+
const out = {
|
|
120
|
+
targetId,
|
|
121
|
+
persona: opts.persona,
|
|
122
|
+
configPath: getConfigPath(targetId),
|
|
123
|
+
...info,
|
|
124
|
+
};
|
|
125
|
+
if (opts.json) {
|
|
126
|
+
process.stdout.write(JSON.stringify(out, null, 2) + "\n");
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
console.log(`Target: ${targetId}`);
|
|
130
|
+
console.log(`Persona: ${opts.persona}`);
|
|
131
|
+
console.log(`Valid: ${info.valid}`);
|
|
132
|
+
console.log(`Expires: ${info.expiresAt}`);
|
|
133
|
+
console.log(`Remaining: ${info.secondsRemaining}s`);
|
|
134
|
+
console.log(`Refresh: ${info.hasRefresh ? "available" : "none"}`);
|
|
135
|
+
});
|
|
136
|
+
target
|
|
137
|
+
.command("logout <targetId>")
|
|
138
|
+
.description("clear stored tokens for a target persona")
|
|
139
|
+
.option("-p, --persona <name>", "persona", DEFAULT_PERSONA)
|
|
140
|
+
.action(async (targetId, opts) => {
|
|
141
|
+
warnDeprecated();
|
|
142
|
+
await logoutTarget(targetId, opts.persona);
|
|
143
|
+
console.log(`✓ Cleared tokens for target ${targetId} (persona: ${opts.persona})`);
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/target/index.ts"],"names":[],"mappings":"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"}
|