@zivis/cli 0.1.0-alpha.3 → 0.1.0-alpha.30

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 (40) hide show
  1. package/dist/commands/app/index.js +2 -2
  2. package/dist/commands/app/index.js.map +1 -1
  3. package/dist/commands/auth/bind.d.ts +14 -0
  4. package/dist/commands/auth/bind.js +108 -0
  5. package/dist/commands/auth/bind.js.map +1 -0
  6. package/dist/commands/auth/index.js +27 -1
  7. package/dist/commands/auth/index.js.map +1 -1
  8. package/dist/commands/auth/init.d.ts +5 -0
  9. package/dist/commands/auth/init.js +271 -0
  10. package/dist/commands/auth/init.js.map +1 -0
  11. package/dist/commands/auth/login.d.ts +2 -0
  12. package/dist/commands/auth/login.js +28 -8
  13. package/dist/commands/auth/login.js.map +1 -1
  14. package/dist/commands/auth/logout.js +21 -6
  15. package/dist/commands/auth/logout.js.map +1 -1
  16. package/dist/commands/auth/sessions.js +7 -3
  17. package/dist/commands/auth/sessions.js.map +1 -1
  18. package/dist/commands/auth/status.js +34 -11
  19. package/dist/commands/auth/status.js.map +1 -1
  20. package/dist/commands/auth/token.d.ts +17 -0
  21. package/dist/commands/auth/token.js +91 -0
  22. package/dist/commands/auth/token.js.map +1 -0
  23. package/dist/commands/credits/index.js +2 -2
  24. package/dist/commands/credits/index.js.map +1 -1
  25. package/dist/commands/mcp/index.js +79 -13
  26. package/dist/commands/mcp/index.js.map +1 -1
  27. package/dist/commands/scan/index.js +2 -2
  28. package/dist/commands/scan/index.js.map +1 -1
  29. package/dist/commands/tm/index.js +3 -3
  30. package/dist/commands/tm/index.js.map +1 -1
  31. package/dist/internal/binding-token-mint.d.ts +60 -0
  32. package/dist/internal/binding-token-mint.js +185 -0
  33. package/dist/internal/binding-token-mint.js.map +1 -0
  34. package/dist/internal/ide-setup.d.ts +38 -7
  35. package/dist/internal/ide-setup.js +359 -41
  36. package/dist/internal/ide-setup.js.map +1 -1
  37. package/dist/internal/project-binding.d.ts +2 -0
  38. package/dist/internal/project-binding.js +18 -8
  39. package/dist/internal/project-binding.js.map +1 -1
  40. package/package.json +2 -2
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Mint a Local Project Binding Token via POST /api/auth/bind and store it as
3
+ * apikey.<session>. Shared by `zivis auth bind` and post-login auto-mint.
4
+ */
5
+ import { type ZivisConfig } from "@zivis/mcp/types";
6
+ export type MintBindingTokenResult = {
7
+ ok: true;
8
+ keyName: string;
9
+ key: string;
10
+ orgName: string;
11
+ workosOrgId: string;
12
+ } | {
13
+ ok: false;
14
+ error: string;
15
+ };
16
+ /**
17
+ * Calls the bind API with a fresh access JWT and persists the minted WorkOS API key.
18
+ * Does not start OAuth nor update IDE configs.
19
+ */
20
+ export declare function mintLocalProjectBindingToken(params: {
21
+ config: ZivisConfig;
22
+ session: string;
23
+ accessToken: string;
24
+ cwd: string;
25
+ }): Promise<MintBindingTokenResult>;
26
+ export interface TryAutoMintOptions {
27
+ cwd: string;
28
+ sessionName: string;
29
+ accessToken: string;
30
+ /** Caller flag (e.g. `zivis auth login --no-mint-key`). */
31
+ skip?: boolean;
32
+ /**
33
+ * When false (login after ensureProjectBinding): mint failures log a warning and return.
34
+ * When true (`zivis auth bind`): caller should exit 1 if result not ok — not handled here.
35
+ */
36
+ warnOnFailure: boolean;
37
+ }
38
+ /**
39
+ * After OAuth login finishes, mint an MCP-friendly API key if the repo is bound
40
+ * and JWT org matches `.zivis/project.json`.
41
+ * Skips if `apikey.<session>` already exists (avoid spawning keys on every login).
42
+ */
43
+ export declare function tryAutoMintBindingTokenAfterLogin(opts: TryAutoMintOptions): Promise<{
44
+ ran: boolean;
45
+ ok: boolean;
46
+ message?: string;
47
+ }>;
48
+ /**
49
+ * Drop the OAuth tokens stored under `oauth.<session>` (or `oauth` when no
50
+ * session). OAuth exists only to mint the MCP API key — once login finishes,
51
+ * MCP and tenant API calls go through `apikey.<session>`. Keeping the OAuth
52
+ * tokens around adds attack surface and risks org-drift if the refresh token
53
+ * outlives the binding.
54
+ *
55
+ * Best-effort: failures are swallowed so they cannot mask a successful mint.
56
+ */
57
+ export declare function discardOauthAfterLogin(params: {
58
+ session: string | undefined;
59
+ config: ZivisConfig;
60
+ }): Promise<void>;
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Mint a Local Project Binding Token via POST /api/auth/bind and store it as
3
+ * apikey.<session>. Shared by `zivis auth bind` and post-login auto-mint.
4
+ */
5
+ import * as os from "node:os";
6
+ import * as crypto from "node:crypto";
7
+ import * as child_process from "node:child_process";
8
+ import { keychainClearSession, keychainRead, keychainStore } from "@zivis/mcp/auth";
9
+ import { decodeJwtPayload } from "@zivis/mcp/auth/jwt";
10
+ import { DEFAULT_CONFIG, credentialStorageFromConfig } from "@zivis/mcp/types";
11
+ import { detectProjectBinding, resolveConfigFromBinding } from "@zivis/mcp/project-binding";
12
+ /** Same fingerprint strategy as bind command — stable-ish per-repo key name suffix. */
13
+ function getRepoFingerprint(cwd) {
14
+ try {
15
+ const remote = child_process
16
+ .execSync("git remote get-url origin 2>/dev/null", { cwd, encoding: "utf8" })
17
+ .trim();
18
+ if (remote) {
19
+ return crypto.createHash("sha256").update(remote).digest("hex").slice(0, 12);
20
+ }
21
+ }
22
+ catch {
23
+ /* no git or no remote */
24
+ }
25
+ return crypto.createHash("sha256").update(cwd).digest("hex").slice(0, 12);
26
+ }
27
+ /**
28
+ * Calls the bind API with a fresh access JWT and persists the minted WorkOS API key.
29
+ * Does not start OAuth nor update IDE configs.
30
+ */
31
+ export async function mintLocalProjectBindingToken(params) {
32
+ const { config, session, accessToken, cwd } = params;
33
+ const credentialStorage = credentialStorageFromConfig(config);
34
+ const repoFingerprint = getRepoFingerprint(cwd);
35
+ const hostname = os.hostname();
36
+ let bindResult;
37
+ try {
38
+ const response = await fetch(`${config.apiBaseUrl}/api/auth/bind`, {
39
+ method: "POST",
40
+ headers: {
41
+ Authorization: `Bearer ${accessToken}`,
42
+ "Content-Type": "application/json",
43
+ "User-Agent": "@zivis/cli",
44
+ },
45
+ body: JSON.stringify({ repoFingerprint, hostname }),
46
+ });
47
+ if (!response.ok) {
48
+ const body = (await response.json().catch(() => ({})));
49
+ return {
50
+ ok: false,
51
+ error: body.message ?? body.error ?? `HTTP ${response.status}`,
52
+ };
53
+ }
54
+ bindResult = (await response.json());
55
+ }
56
+ catch (err) {
57
+ return {
58
+ ok: false,
59
+ error: err instanceof Error ? err.message : String(err),
60
+ };
61
+ }
62
+ const apiKeyAccount = `apikey.${session}`;
63
+ try {
64
+ await keychainStore(apiKeyAccount, bindResult.key, credentialStorage);
65
+ }
66
+ catch (err) {
67
+ return {
68
+ ok: false,
69
+ error: err instanceof Error ? err.message : "Failed to store key in OS keychain",
70
+ };
71
+ }
72
+ return {
73
+ ok: true,
74
+ keyName: bindResult.keyName,
75
+ key: bindResult.key,
76
+ orgName: bindResult.orgName,
77
+ workosOrgId: bindResult.workosOrgId,
78
+ };
79
+ }
80
+ /**
81
+ * After OAuth login finishes, mint an MCP-friendly API key if the repo is bound
82
+ * and JWT org matches `.zivis/project.json`.
83
+ * Skips if `apikey.<session>` already exists (avoid spawning keys on every login).
84
+ */
85
+ export async function tryAutoMintBindingTokenAfterLogin(opts) {
86
+ if (opts.skip) {
87
+ return { ran: false, ok: true };
88
+ }
89
+ const fullConfig = { ...DEFAULT_CONFIG, ...resolveConfigFromBinding(opts.cwd) };
90
+ const claims = decodeJwtPayload(opts.accessToken);
91
+ const jwtOrgId = claims?.org_id;
92
+ if (!jwtOrgId) {
93
+ return {
94
+ ran: false,
95
+ ok: true,
96
+ message: "JWT has no org_id — skipped MCP binding-key mint.",
97
+ };
98
+ }
99
+ const detected = detectProjectBinding(opts.cwd);
100
+ const bindingOrg = detected?.binding.workosOrgId;
101
+ const bindingSession = detected?.binding.session;
102
+ if (!bindingOrg || !bindingSession) {
103
+ return {
104
+ ran: false,
105
+ ok: true,
106
+ message: "No project binding with workosOrgId — skipped MCP binding-key mint.",
107
+ };
108
+ }
109
+ if (bindingOrg !== jwtOrgId) {
110
+ const msg = `JWT org does not match project binding — skipped MCP binding-key mint.`;
111
+ if (opts.warnOnFailure) {
112
+ console.log("");
113
+ console.log(` WARNING: ${msg}`);
114
+ }
115
+ return { ran: false, ok: false, message: msg };
116
+ }
117
+ if (bindingSession !== opts.sessionName) {
118
+ const msg = `Session "${opts.sessionName}" does not match binding session "${bindingSession}" — skipped MCP binding-key mint.`;
119
+ if (opts.warnOnFailure) {
120
+ console.log("");
121
+ console.log(` WARNING: ${msg}`);
122
+ }
123
+ return { ran: false, ok: false, message: msg };
124
+ }
125
+ const st = credentialStorageFromConfig(fullConfig);
126
+ const existing = await keychainRead(`apikey.${bindingSession}`, st).catch(() => null);
127
+ if (existing) {
128
+ console.log("");
129
+ console.log(`✓ MCP API key already present for session "${bindingSession}" — skipped mint.`);
130
+ return { ran: false, ok: true };
131
+ }
132
+ console.log("");
133
+ console.log("Minting Local Project Binding Token for MCP (one-time per machine/session)…");
134
+ const result = await mintLocalProjectBindingToken({
135
+ config: fullConfig,
136
+ session: bindingSession,
137
+ accessToken: opts.accessToken,
138
+ cwd: opts.cwd,
139
+ });
140
+ if (!result.ok) {
141
+ const msg = result.error;
142
+ if (opts.warnOnFailure) {
143
+ printMintFailureBanner(msg);
144
+ }
145
+ return { ran: true, ok: false, message: msg };
146
+ }
147
+ console.log(`✓ MCP API key stored (${result.keyName}; org: ${result.orgName})`);
148
+ return { ran: true, ok: true };
149
+ }
150
+ /**
151
+ * Drop the OAuth tokens stored under `oauth.<session>` (or `oauth` when no
152
+ * session). OAuth exists only to mint the MCP API key — once login finishes,
153
+ * MCP and tenant API calls go through `apikey.<session>`. Keeping the OAuth
154
+ * tokens around adds attack surface and risks org-drift if the refresh token
155
+ * outlives the binding.
156
+ *
157
+ * Best-effort: failures are swallowed so they cannot mask a successful mint.
158
+ */
159
+ export async function discardOauthAfterLogin(params) {
160
+ const storage = credentialStorageFromConfig(params.config);
161
+ await keychainClearSession(params.session, storage).catch(() => {
162
+ /* OAuth was never written, nothing to clean up. */
163
+ });
164
+ }
165
+ function printMintFailureBanner(message) {
166
+ const bar = "═".repeat(70);
167
+ console.error("");
168
+ console.error(bar);
169
+ console.error(" ACTION REQUIRED — MCP API KEY WAS NOT MINTED");
170
+ console.error(bar);
171
+ console.error("");
172
+ console.error(` Reason: ${message}`);
173
+ console.error("");
174
+ console.error(" Why this matters:");
175
+ console.error(" The MCP server in your IDE authenticates with an org-scoped");
176
+ console.error(" API key. Without it, every zivis_* tool call will fail with");
177
+ console.error(" \"Not authenticated\" until you mint one.");
178
+ console.error("");
179
+ console.error(" To fix, run from this repo:");
180
+ console.error(" zivis auth bind");
181
+ console.error("");
182
+ console.error(bar);
183
+ console.error("");
184
+ }
185
+ //# sourceMappingURL=binding-token-mint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding-token-mint.js","sourceRoot":"","sources":["../../src/internal/binding-token-mint.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,38 @@
1
- export declare function setupCursor(session?: string): Promise<void>;
2
- export declare function setupVsCodeCopilot(session?: string): Promise<void>;
3
- export declare function setupVsCodeClaude(session?: string): Promise<void>;
4
- export declare function setupClaudeCodeCli(session?: string): Promise<void>;
5
- export declare function setupCline(session?: string): Promise<void>;
6
- export declare function setupWindsurf(session?: string): Promise<void>;
7
- export declare function printClaudeCodeManual(session?: string): void;
1
+ export type GuidanceClient = "cursor" | "claude-code-cli" | "vscode-copilot" | "vscode-claude" | "cline" | "windsurf";
2
+ export interface GuidanceOptions {
3
+ /** Workspace root to write guidance files into */
4
+ cwd: string;
5
+ /** Which IDE client to write guidance for */
6
+ client: GuidanceClient;
7
+ }
8
+ /**
9
+ * Write IDE guidance files for the given client.
10
+ *
11
+ * The guidance files teach the host AI (Cursor, Claude Code, etc.)
12
+ * when to suggest ZIVIS tools — no security knowledge required from the user.
13
+ *
14
+ * All writes are idempotent: re-running replaces only the ZIVIS-managed
15
+ * block, never user content.
16
+ *
17
+ * Returns the list of file paths written.
18
+ */
19
+ export declare function writeGuidance(opts: GuidanceOptions): string[];
20
+ /**
21
+ * Detect which IDE configs are present in the given workspace.
22
+ * Returns client identifiers whose config files/dirs were found.
23
+ */
24
+ export declare function detectIdesInRepo(cwd: string): GuidanceClient[];
25
+ export declare function setupCursor(): Promise<void>;
26
+ /**
27
+ * Write a workspace-level .cursor/mcp.json with `--workspace <cwd>` so Cursor
28
+ * starts an isolated MCP process bound to this specific repo.
29
+ * One process = one org = zero cross-tenant risk, regardless of what other
30
+ * repos are open in Cursor.
31
+ */
32
+ export declare function setupCursorWorkspace(): Promise<void>;
33
+ export declare function setupVsCodeCopilot(): Promise<void>;
34
+ export declare function setupVsCodeClaude(): Promise<void>;
35
+ export declare function setupClaudeCodeCli(): Promise<void>;
36
+ export declare function setupCline(): Promise<void>;
37
+ export declare function setupWindsurf(): Promise<void>;
38
+ export declare function printClaudeCodeManual(): void;