popeye-cli 1.0.1 → 1.2.0

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 (216) hide show
  1. package/.env.example +24 -1
  2. package/CONTRIBUTING.md +275 -0
  3. package/OPEN_SOURCE_MANIFESTO.md +172 -0
  4. package/README.md +832 -123
  5. package/dist/adapters/claude.d.ts +19 -4
  6. package/dist/adapters/claude.d.ts.map +1 -1
  7. package/dist/adapters/claude.js +908 -42
  8. package/dist/adapters/claude.js.map +1 -1
  9. package/dist/adapters/gemini.d.ts +55 -0
  10. package/dist/adapters/gemini.d.ts.map +1 -0
  11. package/dist/adapters/gemini.js +318 -0
  12. package/dist/adapters/gemini.js.map +1 -0
  13. package/dist/adapters/grok.d.ts +73 -0
  14. package/dist/adapters/grok.d.ts.map +1 -0
  15. package/dist/adapters/grok.js +430 -0
  16. package/dist/adapters/grok.js.map +1 -0
  17. package/dist/adapters/openai.d.ts +1 -1
  18. package/dist/adapters/openai.d.ts.map +1 -1
  19. package/dist/adapters/openai.js +47 -8
  20. package/dist/adapters/openai.js.map +1 -1
  21. package/dist/auth/claude.d.ts +11 -9
  22. package/dist/auth/claude.d.ts.map +1 -1
  23. package/dist/auth/claude.js +107 -71
  24. package/dist/auth/claude.js.map +1 -1
  25. package/dist/auth/gemini.d.ts +58 -0
  26. package/dist/auth/gemini.d.ts.map +1 -0
  27. package/dist/auth/gemini.js +172 -0
  28. package/dist/auth/gemini.js.map +1 -0
  29. package/dist/auth/grok.d.ts +73 -0
  30. package/dist/auth/grok.d.ts.map +1 -0
  31. package/dist/auth/grok.js +211 -0
  32. package/dist/auth/grok.js.map +1 -0
  33. package/dist/auth/index.d.ts +14 -7
  34. package/dist/auth/index.d.ts.map +1 -1
  35. package/dist/auth/index.js +41 -6
  36. package/dist/auth/index.js.map +1 -1
  37. package/dist/auth/keychain.d.ts +20 -7
  38. package/dist/auth/keychain.d.ts.map +1 -1
  39. package/dist/auth/keychain.js +85 -29
  40. package/dist/auth/keychain.js.map +1 -1
  41. package/dist/auth/openai.d.ts +2 -2
  42. package/dist/auth/openai.d.ts.map +1 -1
  43. package/dist/auth/openai.js +30 -32
  44. package/dist/auth/openai.js.map +1 -1
  45. package/dist/cli/commands/auth.d.ts +1 -1
  46. package/dist/cli/commands/auth.d.ts.map +1 -1
  47. package/dist/cli/commands/auth.js +79 -8
  48. package/dist/cli/commands/auth.js.map +1 -1
  49. package/dist/cli/commands/create.d.ts.map +1 -1
  50. package/dist/cli/commands/create.js +15 -4
  51. package/dist/cli/commands/create.js.map +1 -1
  52. package/dist/cli/interactive.d.ts.map +1 -1
  53. package/dist/cli/interactive.js +1494 -114
  54. package/dist/cli/interactive.js.map +1 -1
  55. package/dist/config/defaults.d.ts +9 -1
  56. package/dist/config/defaults.d.ts.map +1 -1
  57. package/dist/config/defaults.js +19 -2
  58. package/dist/config/defaults.js.map +1 -1
  59. package/dist/config/index.d.ts +19 -0
  60. package/dist/config/index.d.ts.map +1 -1
  61. package/dist/config/index.js +33 -1
  62. package/dist/config/index.js.map +1 -1
  63. package/dist/config/schema.d.ts +47 -0
  64. package/dist/config/schema.d.ts.map +1 -1
  65. package/dist/config/schema.js +29 -1
  66. package/dist/config/schema.js.map +1 -1
  67. package/dist/generators/fullstack.d.ts +32 -0
  68. package/dist/generators/fullstack.d.ts.map +1 -0
  69. package/dist/generators/fullstack.js +497 -0
  70. package/dist/generators/fullstack.js.map +1 -0
  71. package/dist/generators/index.d.ts +4 -3
  72. package/dist/generators/index.d.ts.map +1 -1
  73. package/dist/generators/index.js +15 -1
  74. package/dist/generators/index.js.map +1 -1
  75. package/dist/generators/python.d.ts +17 -1
  76. package/dist/generators/python.d.ts.map +1 -1
  77. package/dist/generators/python.js +34 -20
  78. package/dist/generators/python.js.map +1 -1
  79. package/dist/generators/templates/fullstack.d.ts +113 -0
  80. package/dist/generators/templates/fullstack.d.ts.map +1 -0
  81. package/dist/generators/templates/fullstack.js +1004 -0
  82. package/dist/generators/templates/fullstack.js.map +1 -0
  83. package/dist/generators/typescript.d.ts +19 -1
  84. package/dist/generators/typescript.d.ts.map +1 -1
  85. package/dist/generators/typescript.js +37 -20
  86. package/dist/generators/typescript.js.map +1 -1
  87. package/dist/state/index.d.ts +108 -0
  88. package/dist/state/index.d.ts.map +1 -1
  89. package/dist/state/index.js +551 -4
  90. package/dist/state/index.js.map +1 -1
  91. package/dist/state/registry.d.ts +52 -0
  92. package/dist/state/registry.d.ts.map +1 -0
  93. package/dist/state/registry.js +215 -0
  94. package/dist/state/registry.js.map +1 -0
  95. package/dist/types/cli.d.ts +8 -0
  96. package/dist/types/cli.d.ts.map +1 -1
  97. package/dist/types/cli.js.map +1 -1
  98. package/dist/types/consensus.d.ts +186 -4
  99. package/dist/types/consensus.d.ts.map +1 -1
  100. package/dist/types/consensus.js +35 -3
  101. package/dist/types/consensus.js.map +1 -1
  102. package/dist/types/project.d.ts +76 -0
  103. package/dist/types/project.d.ts.map +1 -1
  104. package/dist/types/project.js +1 -1
  105. package/dist/types/project.js.map +1 -1
  106. package/dist/types/workflow.d.ts +217 -16
  107. package/dist/types/workflow.d.ts.map +1 -1
  108. package/dist/types/workflow.js +40 -1
  109. package/dist/types/workflow.js.map +1 -1
  110. package/dist/workflow/auto-fix.d.ts +45 -0
  111. package/dist/workflow/auto-fix.d.ts.map +1 -0
  112. package/dist/workflow/auto-fix.js +274 -0
  113. package/dist/workflow/auto-fix.js.map +1 -0
  114. package/dist/workflow/consensus.d.ts +70 -2
  115. package/dist/workflow/consensus.d.ts.map +1 -1
  116. package/dist/workflow/consensus.js +872 -17
  117. package/dist/workflow/consensus.js.map +1 -1
  118. package/dist/workflow/execution-mode.d.ts +10 -4
  119. package/dist/workflow/execution-mode.d.ts.map +1 -1
  120. package/dist/workflow/execution-mode.js +547 -58
  121. package/dist/workflow/execution-mode.js.map +1 -1
  122. package/dist/workflow/index.d.ts +14 -2
  123. package/dist/workflow/index.d.ts.map +1 -1
  124. package/dist/workflow/index.js +69 -6
  125. package/dist/workflow/index.js.map +1 -1
  126. package/dist/workflow/milestone-workflow.d.ts +34 -0
  127. package/dist/workflow/milestone-workflow.d.ts.map +1 -0
  128. package/dist/workflow/milestone-workflow.js +414 -0
  129. package/dist/workflow/milestone-workflow.js.map +1 -0
  130. package/dist/workflow/plan-mode.d.ts +80 -3
  131. package/dist/workflow/plan-mode.d.ts.map +1 -1
  132. package/dist/workflow/plan-mode.js +767 -49
  133. package/dist/workflow/plan-mode.js.map +1 -1
  134. package/dist/workflow/plan-storage.d.ts +386 -0
  135. package/dist/workflow/plan-storage.d.ts.map +1 -0
  136. package/dist/workflow/plan-storage.js +878 -0
  137. package/dist/workflow/plan-storage.js.map +1 -0
  138. package/dist/workflow/project-verification.d.ts +37 -0
  139. package/dist/workflow/project-verification.d.ts.map +1 -0
  140. package/dist/workflow/project-verification.js +381 -0
  141. package/dist/workflow/project-verification.js.map +1 -0
  142. package/dist/workflow/task-workflow.d.ts +37 -0
  143. package/dist/workflow/task-workflow.d.ts.map +1 -0
  144. package/dist/workflow/task-workflow.js +386 -0
  145. package/dist/workflow/task-workflow.js.map +1 -0
  146. package/dist/workflow/test-runner.d.ts +9 -0
  147. package/dist/workflow/test-runner.d.ts.map +1 -1
  148. package/dist/workflow/test-runner.js +101 -5
  149. package/dist/workflow/test-runner.js.map +1 -1
  150. package/dist/workflow/ui-designer.d.ts +82 -0
  151. package/dist/workflow/ui-designer.d.ts.map +1 -0
  152. package/dist/workflow/ui-designer.js +234 -0
  153. package/dist/workflow/ui-designer.js.map +1 -0
  154. package/dist/workflow/ui-setup.d.ts +58 -0
  155. package/dist/workflow/ui-setup.d.ts.map +1 -0
  156. package/dist/workflow/ui-setup.js +685 -0
  157. package/dist/workflow/ui-setup.js.map +1 -0
  158. package/dist/workflow/ui-verification.d.ts +114 -0
  159. package/dist/workflow/ui-verification.d.ts.map +1 -0
  160. package/dist/workflow/ui-verification.js +258 -0
  161. package/dist/workflow/ui-verification.js.map +1 -0
  162. package/dist/workflow/workflow-logger.d.ts +110 -0
  163. package/dist/workflow/workflow-logger.d.ts.map +1 -0
  164. package/dist/workflow/workflow-logger.js +267 -0
  165. package/dist/workflow/workflow-logger.js.map +1 -0
  166. package/dist/workflow/workspace-manager.d.ts +342 -0
  167. package/dist/workflow/workspace-manager.d.ts.map +1 -0
  168. package/dist/workflow/workspace-manager.js +733 -0
  169. package/dist/workflow/workspace-manager.js.map +1 -0
  170. package/package.json +2 -2
  171. package/src/adapters/claude.ts +1067 -47
  172. package/src/adapters/gemini.ts +373 -0
  173. package/src/adapters/grok.ts +492 -0
  174. package/src/adapters/openai.ts +48 -9
  175. package/src/auth/claude.ts +120 -78
  176. package/src/auth/gemini.ts +207 -0
  177. package/src/auth/grok.ts +255 -0
  178. package/src/auth/index.ts +47 -9
  179. package/src/auth/keychain.ts +95 -28
  180. package/src/auth/openai.ts +29 -36
  181. package/src/cli/commands/auth.ts +89 -10
  182. package/src/cli/commands/create.ts +13 -4
  183. package/src/cli/interactive.ts +1774 -142
  184. package/src/config/defaults.ts +19 -2
  185. package/src/config/index.ts +36 -1
  186. package/src/config/schema.ts +30 -1
  187. package/src/generators/fullstack.ts +551 -0
  188. package/src/generators/index.ts +25 -1
  189. package/src/generators/python.ts +65 -20
  190. package/src/generators/templates/fullstack.ts +1047 -0
  191. package/src/generators/typescript.ts +69 -20
  192. package/src/state/index.ts +713 -4
  193. package/src/state/registry.ts +278 -0
  194. package/src/types/cli.ts +8 -0
  195. package/src/types/consensus.ts +197 -6
  196. package/src/types/project.ts +82 -1
  197. package/src/types/workflow.ts +90 -1
  198. package/src/workflow/auto-fix.ts +340 -0
  199. package/src/workflow/consensus.ts +1180 -16
  200. package/src/workflow/execution-mode.ts +673 -74
  201. package/src/workflow/index.ts +95 -6
  202. package/src/workflow/milestone-workflow.ts +576 -0
  203. package/src/workflow/plan-mode.ts +924 -50
  204. package/src/workflow/plan-storage.ts +1282 -0
  205. package/src/workflow/project-verification.ts +471 -0
  206. package/src/workflow/task-workflow.ts +528 -0
  207. package/src/workflow/test-runner.ts +120 -5
  208. package/src/workflow/ui-designer.ts +337 -0
  209. package/src/workflow/ui-setup.ts +797 -0
  210. package/src/workflow/ui-verification.ts +357 -0
  211. package/src/workflow/workflow-logger.ts +353 -0
  212. package/src/workflow/workspace-manager.ts +912 -0
  213. package/tests/config/config.test.ts +1 -1
  214. package/tests/types/consensus.test.ts +3 -3
  215. package/tests/workflow/plan-mode.test.ts +213 -0
  216. package/tests/workflow/test-runner.test.ts +5 -3
@@ -1,101 +1,142 @@
1
1
  /**
2
2
  * Claude CLI authentication module
3
- * Handles OAuth flow and token management for Claude CLI
3
+ * Checks for Claude Code CLI installation and authentication status
4
4
  */
5
- import open from 'open';
5
+ import { spawn } from 'node:child_process';
6
6
  import { getClaudeCredential, setClaudeCredential, deleteClaudeCredential } from './keychain.js';
7
- import { startAuthCallbackServer, findAvailablePort, getCallbackUrl } from './server.js';
8
7
  /**
9
- * Check if Claude CLI is already authenticated
10
- * This checks for existing credentials in the keychain or environment
8
+ * Run a command and capture output
9
+ */
10
+ function runCommand(command, args) {
11
+ return new Promise((resolve) => {
12
+ const proc = spawn(command, args, {
13
+ stdio: ['ignore', 'pipe', 'pipe'],
14
+ shell: true,
15
+ });
16
+ let stdout = '';
17
+ let stderr = '';
18
+ proc.stdout?.on('data', (data) => {
19
+ stdout += data.toString();
20
+ });
21
+ proc.stderr?.on('data', (data) => {
22
+ stderr += data.toString();
23
+ });
24
+ proc.on('close', (code) => {
25
+ resolve({ stdout, stderr, code: code ?? 1 });
26
+ });
27
+ proc.on('error', () => {
28
+ resolve({ stdout, stderr, code: 1 });
29
+ });
30
+ });
31
+ }
32
+ /**
33
+ * Check if Claude Code CLI is installed
34
+ */
35
+ export async function isClaudeCLIInstalled() {
36
+ try {
37
+ const result = await runCommand('claude', ['--version']);
38
+ return result.code === 0;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ /**
45
+ * Check if Claude Code CLI is authenticated
46
+ * Uses 'claude auth status' to check authentication
11
47
  */
12
48
  export async function checkClaudeCLIAuth() {
13
49
  try {
14
- const token = await getClaudeCredential();
15
- if (!token) {
16
- return { authenticated: false };
50
+ // First check if CLI is installed
51
+ const installed = await isClaudeCLIInstalled();
52
+ if (!installed) {
53
+ return {
54
+ authenticated: false,
55
+ cliInstalled: false,
56
+ error: 'Claude Code CLI is not installed',
57
+ };
58
+ }
59
+ // Check auth status by running a simple command
60
+ // The SDK will fail if not authenticated
61
+ const result = await runCommand('claude', ['-p', 'echo "auth check"', '--output-format', 'json']);
62
+ if (result.code === 0) {
63
+ // Also check keychain for cached status
64
+ const cached = await getClaudeCredential();
65
+ return {
66
+ authenticated: true,
67
+ cliInstalled: true,
68
+ user: cached ? 'authenticated' : 'claude-user',
69
+ };
17
70
  }
18
- // For now, we assume if there's a token, it's valid
19
- // In production, you would validate the token with the Claude API
71
+ // Check if the error indicates auth issues
72
+ const output = result.stdout + result.stderr;
73
+ if (output.includes('not logged in') || output.includes('authenticate') || output.includes('login')) {
74
+ return {
75
+ authenticated: false,
76
+ cliInstalled: true,
77
+ error: 'Not logged in to Claude Code',
78
+ };
79
+ }
80
+ // Some other error - assume authenticated if CLI is installed
81
+ // The actual auth check will happen when we try to use the SDK
20
82
  return {
21
83
  authenticated: true,
22
- user: 'claude-user', // Would be extracted from token in production
84
+ cliInstalled: true,
23
85
  };
24
86
  }
25
87
  catch (error) {
26
88
  return {
27
89
  authenticated: false,
90
+ cliInstalled: false,
28
91
  error: error instanceof Error ? error.message : 'Unknown error',
29
92
  };
30
93
  }
31
94
  }
32
95
  /**
33
- * Authenticate with Claude CLI using browser-based OAuth flow
34
- *
35
- * @returns Promise that resolves to true if authentication was successful
96
+ * Authenticate with Claude Code CLI
97
+ * Opens the Claude login flow
36
98
  */
37
99
  export async function authenticateClaude() {
100
+ // Check if CLI is installed
101
+ const installed = await isClaudeCLIInstalled();
102
+ if (!installed) {
103
+ console.log('\nClaude Code CLI is not installed.');
104
+ console.log('\nTo install Claude Code CLI:');
105
+ console.log(' npm install -g @anthropic-ai/claude-code');
106
+ console.log('\nOr visit: https://claude.ai/download\n');
107
+ return false;
108
+ }
38
109
  // Check if already authenticated
39
- const existingAuth = await checkClaudeCLIAuth();
40
- if (existingAuth.authenticated) {
41
- console.log('Already authenticated with Claude CLI');
110
+ const status = await checkClaudeCLIAuth();
111
+ if (status.authenticated) {
112
+ console.log('Already authenticated with Claude Code CLI.');
113
+ await setClaudeCredential('authenticated');
42
114
  return true;
43
115
  }
44
- console.log('Claude CLI authentication required.');
45
- console.log('Opening browser for login...\n');
116
+ console.log('\nClaude Code CLI authentication required.');
117
+ console.log('\nPlease run the following command in your terminal:');
118
+ console.log('\n claude login\n');
119
+ console.log('After logging in, restart Popeye.\n');
120
+ // Try to open the login flow
46
121
  try {
47
- // Find an available port for the callback server
48
- const port = await findAvailablePort(3000, 3100);
49
- const callbackUrl = getCallbackUrl(port, 'claude');
50
- // Start the callback server
51
- const authPromise = startAuthCallbackServer({
52
- port,
53
- type: 'claude',
54
- timeout: 300000, // 5 minutes
55
- });
56
- // Build the login URL
57
- // Note: This is a placeholder URL. The actual Claude OAuth URL would be provided by Anthropic
58
- const loginUrl = buildClaudeLoginUrl(callbackUrl);
59
- console.log(`Waiting for authentication...`);
60
- console.log(`(Browser opened to: ${loginUrl})\n`);
61
- // Open the browser to the login URL
62
- await open(loginUrl);
63
- // Wait for the callback
64
- const result = await authPromise;
65
- if (result.success && result.token) {
66
- // Store the token securely
67
- await setClaudeCredential(result.token);
68
- console.log('Claude CLI authenticated successfully!\n');
122
+ console.log('Attempting to open Claude login...\n');
123
+ const result = await runCommand('claude', ['login']);
124
+ if (result.code === 0) {
125
+ await setClaudeCredential('authenticated');
126
+ console.log('Claude Code CLI authenticated successfully!\n');
69
127
  return true;
70
128
  }
71
129
  else {
72
- console.error(`Authentication failed: ${result.error || 'Unknown error'}`);
130
+ console.log('Login process exited. Please run "claude login" manually if needed.\n');
73
131
  return false;
74
132
  }
75
133
  }
76
- catch (error) {
77
- console.error(`Authentication error: ${error instanceof Error ? error.message : error}`);
134
+ catch {
135
+ console.log('Could not start login automatically.');
136
+ console.log('Please run "claude login" manually.\n');
78
137
  return false;
79
138
  }
80
139
  }
81
- /**
82
- * Build the Claude login URL with the callback redirect
83
- *
84
- * @param callbackUrl - The local callback URL
85
- * @returns The full login URL
86
- */
87
- function buildClaudeLoginUrl(callbackUrl) {
88
- // This is a placeholder implementation
89
- // The actual URL would be provided by Anthropic's OAuth configuration
90
- const baseUrl = 'https://claude.ai/login';
91
- const params = new URLSearchParams({
92
- redirect_uri: callbackUrl,
93
- client_id: 'popeye-cli',
94
- response_type: 'code',
95
- scope: 'cli',
96
- });
97
- return `${baseUrl}?${params.toString()}`;
98
- }
99
140
  /**
100
141
  * Logout from Claude CLI
101
142
  * Removes stored credentials
@@ -103,31 +144,26 @@ function buildClaudeLoginUrl(callbackUrl) {
103
144
  export async function logoutClaude() {
104
145
  const deleted = await deleteClaudeCredential();
105
146
  if (deleted) {
106
- console.log('Claude CLI credentials removed.');
107
- }
108
- else {
109
- console.log('No Claude CLI credentials found.');
147
+ console.log('Claude CLI credentials removed from Popeye.');
110
148
  }
149
+ console.log('\nTo fully logout from Claude Code CLI, run:');
150
+ console.log(' claude logout\n');
111
151
  }
112
152
  /**
113
153
  * Refresh Claude CLI authentication
114
- * Re-authenticates if the current token is expired or invalid
115
154
  */
116
155
  export async function refreshClaudeAuth() {
117
- // Remove existing credentials
118
156
  await deleteClaudeCredential();
119
- // Re-authenticate
120
157
  return authenticateClaude();
121
158
  }
122
159
  /**
123
- * Get the Claude CLI token for API calls
160
+ * Get the Claude CLI token (placeholder for API compatibility)
124
161
  */
125
162
  export async function getClaudeToken() {
126
163
  return getClaudeCredential();
127
164
  }
128
165
  /**
129
166
  * Ensure Claude CLI is authenticated
130
- * Prompts for authentication if not already authenticated
131
167
  */
132
168
  export async function ensureClaudeAuth() {
133
169
  const status = await checkClaudeCLIAuth();
@@ -1 +1 @@
1
- {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/auth/claude.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACjG,OAAO,EAAE,uBAAuB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAYzF;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAE1C,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;QAClC,CAAC;QAED,oDAAoD;QACpD,kEAAkE;QAClE,OAAO;YACL,aAAa,EAAE,IAAI;YACnB,IAAI,EAAE,aAAa,EAAE,8CAA8C;SACpE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,aAAa,EAAE,KAAK;YACpB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;SAChE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,iCAAiC;IACjC,MAAM,YAAY,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAChD,IAAI,YAAY,CAAC,aAAa,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,iDAAiD;QACjD,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAEnD,4BAA4B;QAC5B,MAAM,WAAW,GAAG,uBAAuB,CAAC;YAC1C,IAAI;YACJ,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,MAAM,EAAE,YAAY;SAC9B,CAAC,CAAC;QAEH,sBAAsB;QACtB,8FAA8F;QAC9F,MAAM,QAAQ,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAElD,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,KAAK,CAAC,CAAC;QAElD,oCAAoC;QACpC,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;QAErB,wBAAwB;QACxB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAEjC,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACnC,2BAA2B;YAC3B,MAAM,mBAAmB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,0BAA0B,MAAM,CAAC,KAAK,IAAI,eAAe,EAAE,CAAC,CAAC;YAC3E,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QACzF,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,WAAmB;IAC9C,uCAAuC;IACvC,sEAAsE;IACtE,MAAM,OAAO,GAAG,yBAAyB,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,YAAY,EAAE,WAAW;QACzB,SAAS,EAAE,YAAY;QACvB,aAAa,EAAE,MAAM;QACrB,KAAK,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAC/C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,8BAA8B;IAC9B,MAAM,sBAAsB,EAAE,CAAC;IAE/B,kBAAkB;IAClB,OAAO,kBAAkB,EAAE,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,mBAAmB,EAAE,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAE1C,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,kBAAkB,EAAE,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/auth/claude.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Google Gemini API authentication module
3
+ * Handles API key validation and storage
4
+ */
5
+ /**
6
+ * Gemini authentication status
7
+ */
8
+ export interface GeminiAuthStatus {
9
+ authenticated: boolean;
10
+ keyLastFour?: string;
11
+ error?: string;
12
+ }
13
+ /**
14
+ * Validate a Gemini API key by making a test API call
15
+ *
16
+ * @param apiKey - The API key to validate
17
+ * @returns True if the key is valid
18
+ */
19
+ export declare function validateGeminiToken(apiKey: string): Promise<boolean>;
20
+ /**
21
+ * Check if Gemini is already authenticated
22
+ * Checks keychain first, then environment variable
23
+ */
24
+ export declare function checkGeminiAuth(): Promise<GeminiAuthStatus>;
25
+ /**
26
+ * Prompt for API key in the terminal
27
+ *
28
+ * @returns The entered API key or null if cancelled
29
+ */
30
+ export declare function promptForGeminiAPIKey(): Promise<string | null>;
31
+ /**
32
+ * Authenticate with Gemini API
33
+ *
34
+ * @returns True if authentication was successful
35
+ */
36
+ export declare function authenticateGemini(): Promise<boolean>;
37
+ /**
38
+ * Authenticate with a provided API key (for CLI --api-key option)
39
+ *
40
+ * @param apiKey - The API key to use
41
+ * @returns True if authentication was successful
42
+ */
43
+ export declare function authenticateGeminiWithKey(apiKey: string): Promise<boolean>;
44
+ /**
45
+ * Logout from Gemini API
46
+ * Removes stored credentials
47
+ */
48
+ export declare function logoutGemini(): Promise<void>;
49
+ /**
50
+ * Get the Gemini API key for API calls
51
+ */
52
+ export declare function getGeminiToken(): Promise<string | null>;
53
+ /**
54
+ * Ensure Gemini is authenticated
55
+ * Prompts for authentication if not already authenticated
56
+ */
57
+ export declare function ensureGeminiAuth(): Promise<boolean>;
58
+ //# sourceMappingURL=gemini.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../src/auth/gemini.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAiB1E;AAED;;;GAGG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,gBAAgB,CAAC,CA4BjE;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBpE;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,OAAO,CAAC,CAqC3D;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAchF;AAED;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAOlD;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE7D;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQzD"}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Google Gemini API authentication module
3
+ * Handles API key validation and storage
4
+ */
5
+ import * as readline from 'node:readline';
6
+ import { GoogleGenerativeAI } from '@google/generative-ai';
7
+ import { getGeminiCredential, setGeminiCredential, deleteGeminiCredential, maskCredential, } from './keychain.js';
8
+ /**
9
+ * Validate a Gemini API key by making a test API call
10
+ *
11
+ * @param apiKey - The API key to validate
12
+ * @returns True if the key is valid
13
+ */
14
+ export async function validateGeminiToken(apiKey) {
15
+ try {
16
+ const client = new GoogleGenerativeAI(apiKey);
17
+ const model = client.getGenerativeModel({ model: 'gemini-2.0-flash' });
18
+ // Test the key by making a simple request
19
+ await model.generateContent('Say "OK"');
20
+ return true;
21
+ }
22
+ catch (error) {
23
+ // Check for authentication errors
24
+ const errorMessage = error instanceof Error ? error.message : '';
25
+ if (errorMessage.includes('API_KEY_INVALID') || errorMessage.includes('401')) {
26
+ return false;
27
+ }
28
+ // For other errors, assume the key might be valid
29
+ console.warn('Could not fully validate Gemini key:', error);
30
+ return true;
31
+ }
32
+ }
33
+ /**
34
+ * Check if Gemini is already authenticated
35
+ * Checks keychain first, then environment variable
36
+ */
37
+ export async function checkGeminiAuth() {
38
+ try {
39
+ const apiKey = await getGeminiCredential();
40
+ if (!apiKey) {
41
+ return { authenticated: false };
42
+ }
43
+ // Validate the key
44
+ const isValid = await validateGeminiToken(apiKey);
45
+ if (!isValid) {
46
+ return {
47
+ authenticated: false,
48
+ error: 'Stored API key is invalid',
49
+ };
50
+ }
51
+ return {
52
+ authenticated: true,
53
+ keyLastFour: maskCredential(apiKey),
54
+ };
55
+ }
56
+ catch (error) {
57
+ return {
58
+ authenticated: false,
59
+ error: error instanceof Error ? error.message : 'Unknown error',
60
+ };
61
+ }
62
+ }
63
+ /**
64
+ * Prompt for API key in the terminal
65
+ *
66
+ * @returns The entered API key or null if cancelled
67
+ */
68
+ export async function promptForGeminiAPIKey() {
69
+ return new Promise((resolve) => {
70
+ const rl = readline.createInterface({
71
+ input: process.stdin,
72
+ output: process.stdout,
73
+ });
74
+ console.log('\nGet your API key from: https://aistudio.google.com/app/apikey\n');
75
+ rl.question('Enter your Gemini API key: ', (answer) => {
76
+ rl.close();
77
+ const key = answer.trim();
78
+ if (key) {
79
+ resolve(key);
80
+ }
81
+ else {
82
+ resolve(null);
83
+ }
84
+ });
85
+ });
86
+ }
87
+ /**
88
+ * Authenticate with Gemini API
89
+ *
90
+ * @returns True if authentication was successful
91
+ */
92
+ export async function authenticateGemini() {
93
+ // Check if already authenticated
94
+ const existingAuth = await checkGeminiAuth();
95
+ if (existingAuth.authenticated) {
96
+ console.log('Already authenticated with Gemini API');
97
+ return true;
98
+ }
99
+ console.log('Gemini API key required for arbitration.');
100
+ try {
101
+ // Prompt for the API key
102
+ const apiKey = await promptForGeminiAPIKey();
103
+ if (!apiKey) {
104
+ console.error('\nNo API key provided');
105
+ return false;
106
+ }
107
+ // Validate the token
108
+ console.log('\nValidating API key...');
109
+ const isValid = await validateGeminiToken(apiKey);
110
+ if (!isValid) {
111
+ console.error('Invalid Gemini API key');
112
+ return false;
113
+ }
114
+ // Store the token
115
+ await setGeminiCredential(apiKey);
116
+ console.log('Gemini API authenticated successfully!\n');
117
+ return true;
118
+ }
119
+ catch (error) {
120
+ console.error(`Authentication error: ${error instanceof Error ? error.message : error}`);
121
+ return false;
122
+ }
123
+ }
124
+ /**
125
+ * Authenticate with a provided API key (for CLI --api-key option)
126
+ *
127
+ * @param apiKey - The API key to use
128
+ * @returns True if authentication was successful
129
+ */
130
+ export async function authenticateGeminiWithKey(apiKey) {
131
+ // Validate the token
132
+ const isValid = await validateGeminiToken(apiKey);
133
+ if (!isValid) {
134
+ console.error('Invalid Gemini API key');
135
+ return false;
136
+ }
137
+ // Store the token
138
+ await setGeminiCredential(apiKey);
139
+ console.log('Gemini API authenticated successfully!\n');
140
+ return true;
141
+ }
142
+ /**
143
+ * Logout from Gemini API
144
+ * Removes stored credentials
145
+ */
146
+ export async function logoutGemini() {
147
+ const deleted = await deleteGeminiCredential();
148
+ if (deleted) {
149
+ console.log('Gemini API credentials removed.');
150
+ }
151
+ else {
152
+ console.log('No Gemini API credentials found.');
153
+ }
154
+ }
155
+ /**
156
+ * Get the Gemini API key for API calls
157
+ */
158
+ export async function getGeminiToken() {
159
+ return getGeminiCredential();
160
+ }
161
+ /**
162
+ * Ensure Gemini is authenticated
163
+ * Prompts for authentication if not already authenticated
164
+ */
165
+ export async function ensureGeminiAuth() {
166
+ const status = await checkGeminiAuth();
167
+ if (status.authenticated) {
168
+ return true;
169
+ }
170
+ return authenticateGemini();
171
+ }
172
+ //# sourceMappingURL=gemini.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/auth/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * xAI Grok API authentication module
3
+ * Handles API key validation and storage
4
+ */
5
+ /**
6
+ * Grok API URL (OpenAI-compatible)
7
+ */
8
+ export declare const GROK_API_URL = "https://api.x.ai/v1";
9
+ /**
10
+ * Grok authentication status
11
+ */
12
+ export interface GrokAuthStatus {
13
+ authenticated: boolean;
14
+ keyLastFour?: string;
15
+ error?: string;
16
+ }
17
+ /**
18
+ * Validate a Grok API key by making a test API call
19
+ *
20
+ * @param apiKey - The API key to validate
21
+ * @returns True if the key is valid
22
+ */
23
+ export declare function validateGrokToken(apiKey: string): Promise<boolean>;
24
+ /**
25
+ * Get the Grok API credential
26
+ */
27
+ export declare function getGrokCredential(): Promise<string | null>;
28
+ /**
29
+ * Set the Grok API credential
30
+ */
31
+ export declare function setGrokCredential(apiKey: string): Promise<void>;
32
+ /**
33
+ * Delete the Grok API credential
34
+ */
35
+ export declare function deleteGrokCredential(): Promise<boolean>;
36
+ /**
37
+ * Check if Grok is already authenticated
38
+ */
39
+ export declare function checkGrokAuth(): Promise<GrokAuthStatus>;
40
+ /**
41
+ * Prompt for API key in the terminal
42
+ *
43
+ * @returns The entered API key or null if cancelled
44
+ */
45
+ export declare function promptForGrokAPIKey(): Promise<string | null>;
46
+ /**
47
+ * Authenticate with Grok API
48
+ *
49
+ * @returns True if authentication was successful
50
+ */
51
+ export declare function authenticateGrok(): Promise<boolean>;
52
+ /**
53
+ * Authenticate with a provided API key (for CLI --api-key option)
54
+ *
55
+ * @param apiKey - The API key to use
56
+ * @returns True if authentication was successful
57
+ */
58
+ export declare function authenticateGrokWithKey(apiKey: string): Promise<boolean>;
59
+ /**
60
+ * Logout from Grok API
61
+ * Removes stored credentials
62
+ */
63
+ export declare function logoutGrok(): Promise<void>;
64
+ /**
65
+ * Get the Grok API key for API calls
66
+ */
67
+ export declare function getGrokToken(): Promise<string | null>;
68
+ /**
69
+ * Ensure Grok is authenticated
70
+ * Prompts for authentication if not already authenticated
71
+ */
72
+ export declare function ensureGrokAuth(): Promise<boolean>;
73
+ //# sourceMappingURL=grok.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok.d.ts","sourceRoot":"","sources":["../../src/auth/grok.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH;;GAEG;AACH,eAAO,MAAM,YAAY,wBAAwB,CAAC;AAOlD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BxE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAOhE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAErE;AAED;;GAEG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7D;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,cAAc,CAAC,CA4B7D;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBlE;AAED;;;;GAIG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAqCzD;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAc9E;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAOhD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAE3D;AAED;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAQvD"}