@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.
Files changed (124) hide show
  1. package/dist/commands/app/index.d.ts +8 -0
  2. package/dist/commands/app/index.js +16 -4
  3. package/dist/commands/app/index.js.map +1 -0
  4. package/dist/commands/auth/index.js +2 -20
  5. package/dist/commands/auth/index.js.map +1 -0
  6. package/dist/commands/auth/init.d.ts +0 -1
  7. package/dist/commands/auth/init.js +97 -231
  8. package/dist/commands/auth/init.js.map +1 -0
  9. package/dist/commands/auth/login.d.ts +0 -2
  10. package/dist/commands/auth/login.js +18 -136
  11. package/dist/commands/auth/login.js.map +1 -0
  12. package/dist/commands/auth/logout.js +7 -19
  13. package/dist/commands/auth/logout.js.map +1 -0
  14. package/dist/commands/auth/sessions.js +4 -7
  15. package/dist/commands/auth/sessions.js.map +1 -0
  16. package/dist/commands/auth/status.js +12 -33
  17. package/dist/commands/auth/status.js.map +1 -0
  18. package/dist/commands/credits/index.js +3 -2
  19. package/dist/commands/credits/index.js.map +1 -0
  20. package/dist/commands/mcp/index.js +14 -81
  21. package/dist/commands/mcp/index.js.map +1 -0
  22. package/dist/commands/open/index.d.ts +8 -0
  23. package/dist/commands/open/index.js +11 -0
  24. package/dist/commands/open/index.js.map +1 -0
  25. package/dist/commands/scan/index.js +8 -3
  26. package/dist/commands/scan/index.js.map +1 -0
  27. package/dist/commands/target/index.js +3 -0
  28. package/dist/commands/target/index.js.map +1 -0
  29. package/dist/commands/tm/index.js +10 -3
  30. package/dist/commands/tm/index.js.map +1 -0
  31. package/dist/index.js +1 -13
  32. package/dist/index.js.map +1 -0
  33. package/dist/internal/extractor/adapters/go/index.d.ts +4 -0
  34. package/dist/internal/extractor/adapters/go/index.js +6 -0
  35. package/dist/internal/extractor/adapters/go/index.js.map +1 -0
  36. package/dist/internal/extractor/adapters/go/manifest.d.ts +17 -0
  37. package/dist/internal/extractor/adapters/go/manifest.js +25 -19
  38. package/dist/internal/extractor/adapters/go/manifest.js.map +1 -0
  39. package/dist/internal/extractor/adapters/go/parser.d.ts +4 -0
  40. package/dist/internal/extractor/adapters/go/parser.js +5 -0
  41. package/dist/internal/extractor/adapters/go/parser.js.map +1 -0
  42. package/dist/internal/extractor/adapters/go/scanner.d.ts +20 -0
  43. package/dist/internal/extractor/adapters/go/scanner.js +43 -0
  44. package/dist/internal/extractor/adapters/go/scanner.js.map +1 -0
  45. package/dist/internal/extractor/adapters/python/index.d.ts +3 -0
  46. package/dist/internal/extractor/adapters/python/index.js +4 -0
  47. package/dist/internal/extractor/adapters/python/index.js.map +1 -0
  48. package/dist/internal/extractor/adapters/python/manifest.d.ts +8 -0
  49. package/dist/internal/extractor/adapters/python/manifest.js +18 -21
  50. package/dist/internal/extractor/adapters/python/manifest.js.map +1 -0
  51. package/dist/internal/extractor/adapters/python/parser.d.ts +3 -0
  52. package/dist/internal/extractor/adapters/python/parser.js +4 -0
  53. package/dist/internal/extractor/adapters/python/parser.js.map +1 -0
  54. package/dist/internal/extractor/adapters/python/scanner.d.ts +18 -0
  55. package/dist/internal/extractor/adapters/python/scanner.js +54 -1
  56. package/dist/internal/extractor/adapters/python/scanner.js.map +1 -0
  57. package/dist/internal/extractor/adapters/typescript/index.d.ts +7 -0
  58. package/dist/internal/extractor/adapters/typescript/index.js +21 -1
  59. package/dist/internal/extractor/adapters/typescript/index.js.map +1 -0
  60. package/dist/internal/extractor/adapters/typescript/manifest.d.ts +14 -0
  61. package/dist/internal/extractor/adapters/typescript/manifest.js +17 -26
  62. package/dist/internal/extractor/adapters/typescript/manifest.js.map +1 -0
  63. package/dist/internal/extractor/adapters/typescript/parser.d.ts +8 -0
  64. package/dist/internal/extractor/adapters/typescript/parser.js +9 -0
  65. package/dist/internal/extractor/adapters/typescript/parser.js.map +1 -0
  66. package/dist/internal/extractor/adapters/typescript/scanner.d.ts +24 -0
  67. package/dist/internal/extractor/adapters/typescript/scanner.js +43 -0
  68. package/dist/internal/extractor/adapters/typescript/scanner.js.map +1 -0
  69. package/dist/internal/extractor/index.d.ts +14 -0
  70. package/dist/internal/extractor/index.js +13 -0
  71. package/dist/internal/extractor/index.js.map +1 -0
  72. package/dist/internal/extractor/types.d.ts +45 -0
  73. package/dist/internal/extractor/types.js +27 -0
  74. package/dist/internal/extractor/types.js.map +1 -0
  75. package/dist/internal/extractor/walker.d.ts +18 -0
  76. package/dist/internal/extractor/walker.js +18 -0
  77. package/dist/internal/extractor/walker.js.map +1 -0
  78. package/dist/internal/ide-setup.d.ts +7 -16
  79. package/dist/internal/ide-setup.js +46 -320
  80. package/dist/internal/ide-setup.js.map +1 -0
  81. package/dist/internal/orgs.js +1 -0
  82. package/dist/internal/orgs.js.map +1 -0
  83. package/dist/internal/project-binding.d.ts +0 -1
  84. package/dist/internal/project-binding.js +9 -14
  85. package/dist/internal/project-binding.js.map +1 -0
  86. package/dist/internal/target-auth/api-config.d.ts +17 -0
  87. package/dist/internal/target-auth/api-config.js +18 -0
  88. package/dist/internal/target-auth/api-config.js.map +1 -0
  89. package/dist/internal/target-auth/config.d.ts +12 -0
  90. package/dist/internal/target-auth/config.js +13 -0
  91. package/dist/internal/target-auth/config.js.map +1 -0
  92. package/dist/internal/target-auth/index.d.ts +18 -0
  93. package/dist/internal/target-auth/index.js +19 -0
  94. package/dist/internal/target-auth/index.js.map +1 -0
  95. package/dist/internal/target-auth/keychain.d.ts +18 -0
  96. package/dist/internal/target-auth/keychain.js +23 -3
  97. package/dist/internal/target-auth/keychain.js.map +1 -0
  98. package/dist/internal/target-auth/types.d.ts +26 -0
  99. package/dist/internal/target-auth/types.js +10 -0
  100. package/dist/internal/target-auth/types.js.map +1 -0
  101. package/dist/internal/target-auth/workos.d.ts +15 -0
  102. package/dist/internal/target-auth/workos.js +18 -9
  103. package/dist/internal/target-auth/workos.js.map +1 -0
  104. package/package.json +5 -19
  105. package/LICENSE +0 -201
  106. package/README.md +0 -31
  107. package/dist/commands/auth/bind.d.ts +0 -4
  108. package/dist/commands/auth/bind.js +0 -97
  109. package/dist/commands/auth/token.d.ts +0 -4
  110. package/dist/commands/auth/token.js +0 -73
  111. package/dist/commands/check/index.d.ts +0 -2
  112. package/dist/commands/check/index.js +0 -463
  113. package/dist/commands/inspect/index.d.ts +0 -2
  114. package/dist/commands/inspect/index.js +0 -136
  115. package/dist/internal/binding-token-mint.d.ts +0 -33
  116. package/dist/internal/binding-token-mint.js +0 -174
  117. package/dist/internal/extractor/graph-builder.d.ts +0 -10
  118. package/dist/internal/extractor/graph-builder.js +0 -245
  119. package/dist/internal/extractor/graph-types.d.ts +0 -89
  120. package/dist/internal/extractor/graph-types.js +0 -1
  121. package/dist/internal/github-linkage-prompt.d.ts +0 -7
  122. package/dist/internal/github-linkage-prompt.js +0 -95
  123. package/dist/internal/org-picker.d.ts +0 -11
  124. package/dist/internal/org-picker.js +0 -34
@@ -1,2 +1,10 @@
1
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
+ */
2
10
  export declare function registerAppCommands(program: Command): void;
@@ -1,10 +1,18 @@
1
1
  import { ApiClient } from "@zivis/mcp/api-client";
2
- import { resolveConfigFromBinding } from "@zivis/mcp/project-binding";
2
+ import { DEFAULT_CONFIG } from "@zivis/mcp/types";
3
3
  import { loginApplication, logoutTarget, tokenInfo, getValidTargetToken, } from "../../internal/target-auth/index.js";
4
4
  import { getStorageName } from "../../internal/target-auth/keychain.js";
5
5
  import { decodeJwtPayload } from "../../internal/target-auth/workos.js";
6
6
  import { fetchAuthConfig } from "../../internal/target-auth/api-config.js";
7
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
+ */
8
16
  export function registerAppCommands(program) {
9
17
  const app = program
10
18
  .command("app")
@@ -46,7 +54,7 @@ export function registerAppCommands(program) {
46
54
  .description("create a customer-facing Application configured for ephemeral PKCE auth")
47
55
  .requiredOption("--name <name>", "application display name")
48
56
  .requiredOption("--base-url <url>", "primary base URL (e.g., https://api.acme.io)")
49
- .option("--type <type>", "application | agent | mcp_server | llm_endpoint | rest_api | ad_hoc_url", "agent")
57
+ .option("--type <type>", "agent | mcp_server | llm_endpoint | rest_api | ad_hoc_url", "agent")
50
58
  .option("--description <text>", "optional description")
51
59
  .option("--client-id <id>", "OAuth client_id (PKCE public client)")
52
60
  .option("--oidc-issuer <url>", "OIDC issuer (for discovery)")
@@ -63,6 +71,9 @@ export function registerAppCommands(program) {
63
71
  baseUrl: opts.baseUrl,
64
72
  type: opts.type,
65
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.
66
77
  authType: "oauth_pkce",
67
78
  };
68
79
  if (opts.description)
@@ -105,7 +116,7 @@ export function registerAppCommands(program) {
105
116
  .description("update an application's metadata (name, type, ephemeral-creds toggle, etc.)")
106
117
  .option("--name <name>", "rename the application")
107
118
  .option("--description <text>", "update the description")
108
- .option("--type <type>", "application | agent | mcp_server | llm_endpoint | rest_api | ad_hoc_url")
119
+ .option("--type <type>", "agent | mcp_server | llm_endpoint | rest_api | ad_hoc_url")
109
120
  .option("--use-ephemeral", "opt into ephemeral-creds mode (Phase J)")
110
121
  .option("--no-ephemeral-disable", "opt OUT of ephemeral-creds mode (legacy KV-backed)")
111
122
  .option("--base-url <url>", "update base URL")
@@ -228,6 +239,7 @@ export function registerAppCommands(program) {
228
239
  });
229
240
  }
230
241
  function buildClient(opts) {
231
- const config = opts.session ? { ...resolveConfigFromBinding(process.cwd()), session: opts.session } : resolveConfigFromBinding(process.cwd());
242
+ const config = opts.session ? { ...DEFAULT_CONFIG, session: opts.session } : DEFAULT_CONFIG;
232
243
  return new ApiClient(config);
233
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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"}
@@ -1,37 +1,25 @@
1
- import { bindCommand } from "./bind.js";
2
1
  import { loginCommand } from "./login.js";
3
2
  import { initCommand } from "./init.js";
4
3
  import { statusCommand } from "./status.js";
5
4
  import { logoutCommand } from "./logout.js";
6
5
  import { sessionsCommand } from "./sessions.js";
7
- import { tokenCommand } from "./token.js";
8
6
  export function registerAuthCommands(program) {
9
7
  const auth = program.command("auth").description("authentication");
10
- auth
11
- .command("bind")
12
- .description("mint MCP API key for this repo (OAuth once + stored key). Normally automatic after login — use bind to repair.")
13
- .option("-y, --yes", "skip confirmation prompt")
14
- .action(async (opts) => {
15
- await bindCommand(opts);
16
- });
17
8
  auth
18
9
  .command("init")
19
10
  .description("interactive setup: authenticate, pick org, and bind this repo")
20
11
  .option("-s, --session <name>", "named session for multi-tenant")
21
- .option("--skip-mint-key", "skip MCP API key mint after successful OAuth")
22
12
  .action(async (opts) => {
23
13
  await initCommand(opts);
24
14
  });
25
15
  auth
26
16
  .command("login")
27
- .description("OAuth PKCE login; when this repo has a binding, mints MCP API key automatically")
17
+ .description("OAuth PKCE login (stores tokens in OS keychain)")
28
18
  .option("-s, --session <name>", "named session for multi-tenant")
29
19
  .option("-o, --org <workosOrgId>", "scope JWT to a specific WorkOS org")
30
20
  .option("-y, --yes", "skip interactive confirmation")
31
- .option("--rebind", "switch this project's bound org via interactive picker")
32
21
  .option("--bind", "auto-write .zivis/project.json binding")
33
22
  .option("--no-bind", "skip project binding")
34
- .option("--skip-mint-key", "skip MCP API key mint after successful OAuth")
35
23
  .action(async (opts) => {
36
24
  await loginCommand(opts);
37
25
  });
@@ -57,11 +45,5 @@ export function registerAuthCommands(program) {
57
45
  .action(async (opts) => {
58
46
  await sessionsCommand(opts);
59
47
  });
60
- auth
61
- .command("token <apiKey>")
62
- .description("store a ZIVIS API access token for MCP/CI use (generate at Settings → API Tokens)")
63
- .option("-s, --session <name>", "named session to bind this token to (defaults to project binding if present)")
64
- .action(async (apiKey, opts) => {
65
- await tokenCommand(apiKey, opts);
66
- });
67
48
  }
49
+ //# 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,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,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,MAAM,CAAC;SACf,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,sBAAsB,EAAE,gCAAgC,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,MAAM,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEL,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"}
@@ -1,5 +1,4 @@
1
1
  export interface InitCmdOpts {
2
2
  session?: string;
3
- skipMintKey?: boolean;
4
3
  }
5
4
  export declare function initCommand(opts: InitCmdOpts): Promise<void>;
@@ -1,21 +1,13 @@
1
1
  import * as readline from "node:readline/promises";
2
- import { login, getStorageName, saveSessionEntry } from "@zivis/mcp/auth";
3
- import { credentialStorageFromConfig, DEFAULT_CONFIG } from "@zivis/mcp/types";
4
- import { resolveConfigFromBinding } from "@zivis/mcp/project-binding";
2
+ import { login, getStorageName, saveSessionEntry, loadTokens } from "@zivis/mcp/auth";
3
+ import { getValidAccessToken } from "@zivis/mcp/auth/token-refresh";
4
+ import { DEFAULT_CONFIG } from "@zivis/mcp/types";
5
5
  import { fetchUserOrgs, extractEmail } from "../../internal/orgs.js";
6
6
  import { ensureProjectBinding } from "../../internal/project-binding.js";
7
- import { discardOauthAfterLogin, tryAutoMintBindingTokenAfterLogin, } from "../../internal/binding-token-mint.js";
8
- import { decodeJwtPayload } from "@zivis/mcp/auth/jwt";
9
- import { detectIdesInRepo, writeGuidance } from "../../internal/ide-setup.js";
10
- import { buildLinkagePrompt } from "../../internal/github-linkage-prompt.js";
11
- async function maybePromptGitHubLinkage(config) {
12
- try {
13
- const msg = await buildLinkagePrompt({ config });
14
- if (msg)
15
- console.log(msg);
16
- }
17
- catch {
18
- }
7
+ /** Parse "received org_01XXX" out of the JWT mismatch error message. */
8
+ function parseReceivedOrgId(msg) {
9
+ const m = msg.match(/received (org_\w+)/);
10
+ return m ? m[1] : null;
19
11
  }
20
12
  async function prompt(question) {
21
13
  const rl = readline.createInterface({ input: process.stdin, output: process.stderr });
@@ -26,245 +18,119 @@ async function prompt(question) {
26
18
  rl.close();
27
19
  }
28
20
  }
29
- async function offerGuidanceInstall(cwd) {
30
- const detectedIdes = detectIdesInRepo(cwd);
31
- if (detectedIdes.length === 0)
32
- return;
33
- const ideLabels = {
34
- cursor: "Cursor",
35
- "claude-code-cli": "Claude Code (CLAUDE.md)",
36
- "vscode-copilot": "VS Code (Copilot)",
37
- "vscode-claude": "VS Code (Claude)",
38
- cline: "Cline",
39
- windsurf: "Windsurf",
40
- };
41
- const ideNames = detectedIdes.map((ide) => ideLabels[ide] ?? ide).join(", ");
42
- console.log(`\nDetected IDE configs in this repo: ${ideNames}`);
43
- const ans = await prompt("Add ZIVIS guidance so your AI assistant suggests security checks at the right moments?\n" +
44
- "(Adds a rule/instruction file. You can edit or remove it anytime.) [Y/n] ");
45
- if (ans.toLowerCase() === "n" || ans.toLowerCase() === "no") {
46
- console.log(" Skipped. Run 'zivis mcp install --client <ide> --with-guidance' anytime to add later.");
47
- return;
21
+ export async function initCommand(opts) {
22
+ const config = DEFAULT_CONFIG;
23
+ const session = opts.session || "default";
24
+ // Reuse a valid stored token — avoids an extra browser open.
25
+ // getValidAccessToken handles refresh; falls back to null if expired/revoked.
26
+ let bootstrapToken = await getValidAccessToken({ ...config, session });
27
+ if (bootstrapToken) {
28
+ const stored = await loadTokens(session);
29
+ const email = extractEmail(stored?.id_token);
30
+ console.log(`Using existing session (${email}).`);
31
+ console.log(`To force re-login first: zivis auth logout && zivis auth init\n`);
48
32
  }
49
- const written = [];
50
- for (const ide of detectedIdes) {
33
+ else {
34
+ console.log("Step 1/2: Authenticate (browser will open)...");
51
35
  try {
52
- const files = writeGuidance({ cwd, client: ide });
53
- written.push(...files);
36
+ const tokens = await login(config, session, undefined, { skipConfirm: true });
37
+ bootstrapToken = tokens.access_token;
38
+ const email = extractEmail(tokens.id_token);
39
+ console.log(`✓ Authenticated as ${email}`);
54
40
  }
55
41
  catch (err) {
56
- console.warn(` Warning: Could not write guidance for ${ide}: ${err instanceof Error ? err.message : err}`);
42
+ console.error("Login failed:", err instanceof Error ? err.message : err);
43
+ process.exit(1);
57
44
  }
58
45
  }
59
- if (written.length > 0) {
60
- console.log(`✓ Wrote guidance files:`);
61
- for (const f of written)
62
- console.log(` ${f}`);
63
- }
64
- }
65
- export async function initCommand(opts) {
66
- const config = {
67
- ...DEFAULT_CONFIG,
68
- ...resolveConfigFromBinding(process.cwd()),
69
- };
70
- const session = opts.session || "default";
71
- const envLabel = config.apiBaseUrl.includes("staging") ? "staging" : "production";
72
- console.log(`Environment: ${envLabel} (${config.apiBaseUrl})`);
73
- console.log("");
74
- console.log("Opening browser for authentication...");
75
- console.log("Log into the org you want to bind this project to.\n");
76
- let tokens;
46
+ // Fetch the user's orgs
47
+ let orgs;
77
48
  try {
78
- tokens = await login(config, session, undefined, { skipConfirm: true });
49
+ orgs = await fetchUserOrgs(config, bootstrapToken);
79
50
  }
80
51
  catch (err) {
81
- console.error("Login failed:", err instanceof Error ? err.message : err);
52
+ console.error("Failed to fetch organizations:", err instanceof Error ? err.message : err);
82
53
  process.exit(1);
83
54
  }
84
- const email = extractEmail(tokens.id_token);
85
- const claims = decodeJwtPayload(tokens.access_token);
86
- const jwtOrgId = claims?.org_id;
87
- if (jwtOrgId) {
88
- let orgName;
89
- try {
90
- const orgs = await fetchUserOrgs(config, tokens.access_token);
91
- orgName = orgs.find((o) => o.workosOrgId === jwtOrgId)?.name;
92
- if (!orgName && orgs.length > 0) {
93
- console.log(`\n ⚠ WorkOS org ${jwtOrgId} is not registered in ZIVIS.`);
94
- console.log(` Your ZIVIS orgs: ${orgs.map((o) => `${o.name} (${o.workosOrgId})`).join(", ")}`);
95
- console.log(` Try logging into ${config.apiBaseUrl} in your browser first, then re-run init.\n`);
96
- }
97
- }
98
- catch (e) {
99
- console.error(` (note: org name lookup failed — ${e instanceof Error ? e.message : e})`);
100
- }
101
- const orgLabel = orgName ?? `unknown org (${jwtOrgId})`;
102
- console.log(`\nAuthenticated as: ${email}`);
103
- console.log(`Org: ${orgLabel}`);
104
- console.log(`Environment: ${envLabel} (${config.apiBaseUrl})\n`);
105
- const confirm = await prompt(`Bind this project to "${orgLabel}"? [Y/n] `);
106
- if (confirm.toLowerCase() === "n" || confirm.toLowerCase() === "no") {
107
- console.log("");
108
- const retry = await prompt("Retry login in a private/incognito window? [Y/n] ");
109
- if (retry.toLowerCase() !== "n" && retry.toLowerCase() !== "no") {
110
- console.log("\nOpening a private/incognito window — log into the correct org...\n");
111
- let retryTokens;
112
- try {
113
- retryTokens = await login(config, session, undefined, { skipConfirm: true, incognito: true });
114
- }
115
- catch (err) {
116
- console.error("Login failed:", err instanceof Error ? err.message : err);
117
- process.exit(1);
118
- }
119
- tokens = retryTokens;
120
- const retryClaims = decodeJwtPayload(retryTokens.access_token);
121
- const retryOrgId = retryClaims?.org_id;
122
- if (!retryOrgId) {
123
- console.error("JWT returned no org scope. Try `zivis auth logout` then `zivis auth init` again.");
124
- process.exit(1);
125
- }
126
- let retryOrgName;
127
- try {
128
- const retryOrgs = await fetchUserOrgs(config, retryTokens.access_token);
129
- retryOrgName = retryOrgs.find((o) => o.workosOrgId === retryOrgId)?.name;
130
- }
131
- catch (e) {
132
- console.error(` (note: org name lookup failed — ${e instanceof Error ? e.message : e})`);
133
- }
134
- const retryLabel = retryOrgName ?? retryOrgId;
135
- const retryEmail = extractEmail(retryTokens.id_token);
136
- console.log(`\nAuthenticated as: ${retryEmail}`);
137
- console.log(`Org: ${retryLabel}\n`);
138
- const retryConfirm = await prompt(`Bind this project to "${retryLabel}"? [Y/n] `);
139
- if (retryConfirm.toLowerCase() === "n" || retryConfirm.toLowerCase() === "no") {
140
- console.log("Aborted.");
141
- process.exit(0);
142
- }
143
- const storageName2 = getStorageName();
144
- await saveSessionEntry(session, retryEmail, credentialStorageFromConfig(config));
145
- console.log(`\n✓ Logged in as ${retryEmail} → ${retryLabel}`);
146
- console.log(`✓ Credentials stored in ${storageName2}`);
147
- await ensureProjectBinding({
148
- config, session, accessToken: retryTokens.access_token,
149
- organizationId: retryOrgId, cwd: process.cwd(), autoBind: true, skipBind: false, force: true,
150
- });
151
- await tryAutoMintBindingTokenAfterLogin({
152
- cwd: process.cwd(),
153
- sessionName: session,
154
- accessToken: retryTokens.access_token,
155
- skip: opts.skipMintKey === true,
156
- warnOnFailure: true,
157
- });
158
- await discardOauthAfterLogin({ session, config });
159
- await offerGuidanceInstall(process.cwd());
160
- await maybePromptGitHubLinkage(config);
161
- process.exit(0);
162
- }
163
- console.log("\nAborted. Switch orgs in your browser then run `zivis auth logout && zivis auth init`.");
164
- process.exit(0);
55
+ if (orgs.length === 0) {
56
+ console.error("No organizations found for this account. Contact support.");
57
+ process.exit(1);
58
+ }
59
+ let selectedOrg = orgs[0];
60
+ if (orgs.length > 1) {
61
+ console.log("Your organizations:");
62
+ orgs.forEach((org, i) => console.log(` ${i + 1}. ${org.name}`));
63
+ const answer = await prompt(`\nSelect org [1-${orgs.length}]: `);
64
+ const idx = parseInt(answer, 10) - 1;
65
+ if (isNaN(idx) || idx < 0 || idx >= orgs.length) {
66
+ console.error("Invalid selection.");
67
+ process.exit(1);
165
68
  }
166
- const storageName = getStorageName();
167
- await saveSessionEntry(session, email, credentialStorageFromConfig(config));
168
- console.log(`\n✓ Logged in as ${email} → ${orgLabel}`);
169
- console.log(`✓ Credentials stored in ${storageName}`);
170
- await ensureProjectBinding({
171
- config,
172
- session,
173
- accessToken: tokens.access_token,
174
- organizationId: jwtOrgId,
175
- cwd: process.cwd(),
176
- autoBind: true,
177
- skipBind: false,
178
- force: true,
179
- });
180
- await tryAutoMintBindingTokenAfterLogin({
181
- cwd: process.cwd(),
182
- sessionName: session,
183
- accessToken: tokens.access_token,
184
- skip: opts.skipMintKey === true,
185
- warnOnFailure: true,
186
- });
187
- await discardOauthAfterLogin({ session, config });
188
- await offerGuidanceInstall(process.cwd());
189
- await maybePromptGitHubLinkage(config);
69
+ selectedOrg = orgs[idx];
190
70
  }
191
71
  else {
192
- console.log("\nYour account isn't scoped to a specific org yet.");
193
- console.log("Fetching your organizations...\n");
194
- let orgs;
72
+ console.log(`One org found: ${selectedOrg.name}`);
73
+ }
74
+ if (!selectedOrg.workosOrgId) {
75
+ console.error(`Org "${selectedOrg.name}" has no WorkOS organization ID — cannot scope login.`);
76
+ process.exit(1);
77
+ }
78
+ // Attempt org-scoped login, with graceful handling for browser-session mismatches
79
+ let scopedTokens;
80
+ let finalOrgId = selectedOrg.workosOrgId;
81
+ let finalOrgName = selectedOrg.name;
82
+ for (let attempt = 0; attempt < 2; attempt++) {
83
+ console.log(`\nStep ${orgs.length > 1 ? "2/2" : "1/1"}: Logging in to ${finalOrgName} (browser will open)...`);
195
84
  try {
196
- orgs = await fetchUserOrgs(config, tokens.access_token);
85
+ scopedTokens = await login(config, session, finalOrgId, {
86
+ orgName: finalOrgName,
87
+ skipConfirm: true,
88
+ });
89
+ break; // success
197
90
  }
198
91
  catch (err) {
199
- console.error("Failed to fetch organizations:", err instanceof Error ? err.message : err);
200
- process.exit(1);
201
- }
202
- if (orgs.length === 0) {
203
- console.error("No organizations found. Contact support.");
204
- process.exit(1);
205
- }
206
- if (orgs.length === 1) {
207
- console.log(`One org found: ${orgs[0].name}. Re-authenticating scoped to that org...`);
208
- }
209
- else {
210
- console.log("Your organizations:");
211
- orgs.forEach((org, i) => console.log(` ${i + 1}. ${org.name}`));
212
- const answer = await prompt(`\nSelect org to bind this project to [1-${orgs.length}]: `);
213
- const idx = parseInt(answer, 10) - 1;
214
- if (isNaN(idx) || idx < 0 || idx >= orgs.length) {
215
- console.error("Invalid selection.");
92
+ const msg = err instanceof Error ? err.message : String(err);
93
+ const receivedOrgId = parseReceivedOrgId(msg);
94
+ if (!receivedOrgId) {
95
+ console.error("Login failed:", msg);
216
96
  process.exit(1);
217
97
  }
218
- const selected = orgs[idx];
219
- if (!selected.workosOrgId) {
220
- console.error(`Org "${selected.name}" has no WorkOS org ID.`);
98
+ // Browser authenticated to a different org than selected
99
+ const receivedOrg = orgs.find((o) => o.workosOrgId === receivedOrgId);
100
+ const receivedName = receivedOrg?.name ?? receivedOrgId;
101
+ console.error(`\n⚠ Browser authenticated to "${receivedName}" instead of "${finalOrgName}".`);
102
+ console.error(` This happens when your browser's active session is for a different org.\n`);
103
+ if (attempt >= 1) {
104
+ console.error("Still mismatched after retry. Run `zivis auth init` again after switching orgs in your browser.");
221
105
  process.exit(1);
222
106
  }
223
- console.log(`\nRe-opening browser scoped to ${selected.name}...`);
224
- console.log("(Tip: if your browser logs into the wrong org, use option 2 to get a URL for a private/incognito window)\n");
225
- try {
226
- const scopedTokens = await login(config, session, selected.workosOrgId, {
227
- orgName: selected.name,
228
- skipConfirm: true,
229
- });
230
- const storageName2 = getStorageName();
231
- await saveSessionEntry(session, email, credentialStorageFromConfig(config));
232
- console.log(`\n✓ Logged in as ${email} → ${selected.name}`);
233
- console.log(`✓ Credentials stored in ${storageName2}`);
234
- await ensureProjectBinding({
235
- config,
236
- session,
237
- accessToken: scopedTokens.access_token,
238
- organizationId: selected.workosOrgId,
239
- cwd: process.cwd(),
240
- autoBind: true,
241
- skipBind: false,
242
- force: true,
243
- });
244
- await tryAutoMintBindingTokenAfterLogin({
245
- cwd: process.cwd(),
246
- sessionName: session,
247
- accessToken: scopedTokens.access_token,
248
- skip: opts.skipMintKey === true,
249
- warnOnFailure: true,
250
- });
251
- await discardOauthAfterLogin({ session, config });
252
- await offerGuidanceInstall(process.cwd());
253
- }
254
- catch (err) {
255
- const msg = err instanceof Error ? err.message : String(err);
256
- const m = msg.match(/received (org_\w+)/);
257
- if (m) {
258
- console.error(`\n⚠ Browser authenticated to a different org than selected.`);
259
- console.error(` Your browser has an active session for a different org.\n`);
260
- console.error(` To fix: run \`zivis auth init\` again and paste the URL into a private/incognito window.`);
261
- }
262
- else {
263
- console.error("Login failed:", msg);
264
- }
265
- process.exit(1);
107
+ const choice = await prompt(`Use "${receivedName}" instead? [Y/n] `);
108
+ if (choice.toLowerCase() === "n" || choice.toLowerCase() === "no") {
109
+ console.log("Aborted. Log into the correct org in your browser then run `zivis auth init` again.");
110
+ process.exit(0);
266
111
  }
112
+ // Retry scoped to what the browser actually has
113
+ finalOrgId = receivedOrgId;
114
+ finalOrgName = receivedName;
267
115
  }
268
116
  }
117
+ if (!scopedTokens) {
118
+ process.exit(1);
119
+ }
120
+ const email = extractEmail(scopedTokens.id_token);
121
+ const storageName = getStorageName();
122
+ await saveSessionEntry(session, email);
123
+ console.log(`\n✓ Logged in as ${email} → ${finalOrgName}`);
124
+ console.log(`✓ Credentials stored in ${storageName}`);
125
+ await ensureProjectBinding({
126
+ config,
127
+ session,
128
+ accessToken: scopedTokens.access_token,
129
+ organizationId: finalOrgId,
130
+ cwd: process.cwd(),
131
+ autoBind: true,
132
+ skipBind: false,
133
+ });
269
134
  process.exit(0);
270
135
  }
136
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/auth/init.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,5 @@ export interface LoginCmdOpts {
4
4
  yes?: boolean;
5
5
  bind?: boolean;
6
6
  noBind?: boolean;
7
- rebind?: boolean;
8
- skipMintKey?: boolean;
9
7
  }
10
8
  export declare function loginCommand(opts: LoginCmdOpts): Promise<void>;