popeye-cli 1.0.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 (209) hide show
  1. package/.env.example +25 -0
  2. package/.prettierrc +8 -0
  3. package/README.md +320 -0
  4. package/dist/adapters/claude.d.ts +82 -0
  5. package/dist/adapters/claude.d.ts.map +1 -0
  6. package/dist/adapters/claude.js +230 -0
  7. package/dist/adapters/claude.js.map +1 -0
  8. package/dist/adapters/openai.d.ts +48 -0
  9. package/dist/adapters/openai.d.ts.map +1 -0
  10. package/dist/adapters/openai.js +257 -0
  11. package/dist/adapters/openai.js.map +1 -0
  12. package/dist/auth/claude.d.ts +44 -0
  13. package/dist/auth/claude.d.ts.map +1 -0
  14. package/dist/auth/claude.js +139 -0
  15. package/dist/auth/claude.js.map +1 -0
  16. package/dist/auth/index.d.ts +61 -0
  17. package/dist/auth/index.d.ts.map +1 -0
  18. package/dist/auth/index.js +141 -0
  19. package/dist/auth/index.js.map +1 -0
  20. package/dist/auth/keychain.d.ts +66 -0
  21. package/dist/auth/keychain.d.ts.map +1 -0
  22. package/dist/auth/keychain.js +125 -0
  23. package/dist/auth/keychain.js.map +1 -0
  24. package/dist/auth/openai-entry.d.ts +9 -0
  25. package/dist/auth/openai-entry.d.ts.map +1 -0
  26. package/dist/auth/openai-entry.js +410 -0
  27. package/dist/auth/openai-entry.js.map +1 -0
  28. package/dist/auth/openai.d.ts +71 -0
  29. package/dist/auth/openai.d.ts.map +1 -0
  30. package/dist/auth/openai.js +212 -0
  31. package/dist/auth/openai.js.map +1 -0
  32. package/dist/auth/server.d.ts +32 -0
  33. package/dist/auth/server.d.ts.map +1 -0
  34. package/dist/auth/server.js +213 -0
  35. package/dist/auth/server.js.map +1 -0
  36. package/dist/cli/commands/auth.d.ts +10 -0
  37. package/dist/cli/commands/auth.d.ts.map +1 -0
  38. package/dist/cli/commands/auth.js +162 -0
  39. package/dist/cli/commands/auth.js.map +1 -0
  40. package/dist/cli/commands/config.d.ts +10 -0
  41. package/dist/cli/commands/config.d.ts.map +1 -0
  42. package/dist/cli/commands/config.js +215 -0
  43. package/dist/cli/commands/config.js.map +1 -0
  44. package/dist/cli/commands/create.d.ts +10 -0
  45. package/dist/cli/commands/create.d.ts.map +1 -0
  46. package/dist/cli/commands/create.js +240 -0
  47. package/dist/cli/commands/create.js.map +1 -0
  48. package/dist/cli/commands/index.d.ts +10 -0
  49. package/dist/cli/commands/index.d.ts.map +1 -0
  50. package/dist/cli/commands/index.js +10 -0
  51. package/dist/cli/commands/index.js.map +1 -0
  52. package/dist/cli/commands/resume.d.ts +18 -0
  53. package/dist/cli/commands/resume.d.ts.map +1 -0
  54. package/dist/cli/commands/resume.js +241 -0
  55. package/dist/cli/commands/resume.js.map +1 -0
  56. package/dist/cli/commands/status.d.ts +18 -0
  57. package/dist/cli/commands/status.d.ts.map +1 -0
  58. package/dist/cli/commands/status.js +154 -0
  59. package/dist/cli/commands/status.js.map +1 -0
  60. package/dist/cli/index.d.ts +17 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +71 -0
  63. package/dist/cli/index.js.map +1 -0
  64. package/dist/cli/interactive.d.ts +9 -0
  65. package/dist/cli/interactive.d.ts.map +1 -0
  66. package/dist/cli/interactive.js +330 -0
  67. package/dist/cli/interactive.js.map +1 -0
  68. package/dist/cli/output.d.ts +182 -0
  69. package/dist/cli/output.d.ts.map +1 -0
  70. package/dist/cli/output.js +355 -0
  71. package/dist/cli/output.js.map +1 -0
  72. package/dist/config/defaults.d.ts +57 -0
  73. package/dist/config/defaults.d.ts.map +1 -0
  74. package/dist/config/defaults.js +103 -0
  75. package/dist/config/defaults.js.map +1 -0
  76. package/dist/config/index.d.ts +138 -0
  77. package/dist/config/index.d.ts.map +1 -0
  78. package/dist/config/index.js +244 -0
  79. package/dist/config/index.js.map +1 -0
  80. package/dist/config/schema.d.ts +220 -0
  81. package/dist/config/schema.d.ts.map +1 -0
  82. package/dist/config/schema.js +141 -0
  83. package/dist/config/schema.js.map +1 -0
  84. package/dist/generators/index.d.ts +101 -0
  85. package/dist/generators/index.d.ts.map +1 -0
  86. package/dist/generators/index.js +200 -0
  87. package/dist/generators/index.js.map +1 -0
  88. package/dist/generators/python.d.ts +48 -0
  89. package/dist/generators/python.d.ts.map +1 -0
  90. package/dist/generators/python.js +262 -0
  91. package/dist/generators/python.js.map +1 -0
  92. package/dist/generators/templates/index.d.ts +6 -0
  93. package/dist/generators/templates/index.d.ts.map +1 -0
  94. package/dist/generators/templates/index.js +6 -0
  95. package/dist/generators/templates/index.js.map +1 -0
  96. package/dist/generators/templates/python.d.ts +53 -0
  97. package/dist/generators/templates/python.d.ts.map +1 -0
  98. package/dist/generators/templates/python.js +454 -0
  99. package/dist/generators/templates/python.js.map +1 -0
  100. package/dist/generators/templates/typescript.d.ts +53 -0
  101. package/dist/generators/templates/typescript.d.ts.map +1 -0
  102. package/dist/generators/templates/typescript.js +394 -0
  103. package/dist/generators/templates/typescript.js.map +1 -0
  104. package/dist/generators/typescript.d.ts +64 -0
  105. package/dist/generators/typescript.d.ts.map +1 -0
  106. package/dist/generators/typescript.js +271 -0
  107. package/dist/generators/typescript.js.map +1 -0
  108. package/dist/index.d.ts +7 -0
  109. package/dist/index.d.ts.map +1 -0
  110. package/dist/index.js +12 -0
  111. package/dist/index.js.map +1 -0
  112. package/dist/state/index.d.ts +168 -0
  113. package/dist/state/index.d.ts.map +1 -0
  114. package/dist/state/index.js +338 -0
  115. package/dist/state/index.js.map +1 -0
  116. package/dist/state/persistence.d.ts +91 -0
  117. package/dist/state/persistence.d.ts.map +1 -0
  118. package/dist/state/persistence.js +201 -0
  119. package/dist/state/persistence.js.map +1 -0
  120. package/dist/types/cli.d.ts +132 -0
  121. package/dist/types/cli.d.ts.map +1 -0
  122. package/dist/types/cli.js +17 -0
  123. package/dist/types/cli.js.map +1 -0
  124. package/dist/types/consensus.d.ts +111 -0
  125. package/dist/types/consensus.d.ts.map +1 -0
  126. package/dist/types/consensus.js +29 -0
  127. package/dist/types/consensus.js.map +1 -0
  128. package/dist/types/index.d.ts +9 -0
  129. package/dist/types/index.d.ts.map +1 -0
  130. package/dist/types/index.js +13 -0
  131. package/dist/types/index.js.map +1 -0
  132. package/dist/types/project.d.ts +73 -0
  133. package/dist/types/project.d.ts.map +1 -0
  134. package/dist/types/project.js +55 -0
  135. package/dist/types/project.js.map +1 -0
  136. package/dist/types/workflow.d.ts +236 -0
  137. package/dist/types/workflow.d.ts.map +1 -0
  138. package/dist/types/workflow.js +74 -0
  139. package/dist/types/workflow.js.map +1 -0
  140. package/dist/workflow/consensus.d.ts +89 -0
  141. package/dist/workflow/consensus.d.ts.map +1 -0
  142. package/dist/workflow/consensus.js +220 -0
  143. package/dist/workflow/consensus.js.map +1 -0
  144. package/dist/workflow/execution-mode.d.ts +82 -0
  145. package/dist/workflow/execution-mode.d.ts.map +1 -0
  146. package/dist/workflow/execution-mode.js +346 -0
  147. package/dist/workflow/execution-mode.js.map +1 -0
  148. package/dist/workflow/index.d.ts +110 -0
  149. package/dist/workflow/index.d.ts.map +1 -0
  150. package/dist/workflow/index.js +283 -0
  151. package/dist/workflow/index.js.map +1 -0
  152. package/dist/workflow/plan-mode.d.ts +83 -0
  153. package/dist/workflow/plan-mode.d.ts.map +1 -0
  154. package/dist/workflow/plan-mode.js +241 -0
  155. package/dist/workflow/plan-mode.js.map +1 -0
  156. package/dist/workflow/test-runner.d.ts +87 -0
  157. package/dist/workflow/test-runner.d.ts.map +1 -0
  158. package/dist/workflow/test-runner.js +273 -0
  159. package/dist/workflow/test-runner.js.map +1 -0
  160. package/eslint.config.js +25 -0
  161. package/package.json +66 -0
  162. package/src/adapters/claude.ts +298 -0
  163. package/src/adapters/openai.ts +300 -0
  164. package/src/auth/claude.ts +166 -0
  165. package/src/auth/index.ts +171 -0
  166. package/src/auth/keychain.ts +138 -0
  167. package/src/auth/openai-entry.ts +410 -0
  168. package/src/auth/openai.ts +260 -0
  169. package/src/auth/server.ts +252 -0
  170. package/src/cli/commands/auth.ts +194 -0
  171. package/src/cli/commands/config.ts +241 -0
  172. package/src/cli/commands/create.ts +308 -0
  173. package/src/cli/commands/index.ts +10 -0
  174. package/src/cli/commands/resume.ts +304 -0
  175. package/src/cli/commands/status.ts +189 -0
  176. package/src/cli/index.ts +90 -0
  177. package/src/cli/interactive.ts +418 -0
  178. package/src/cli/output.ts +410 -0
  179. package/src/config/defaults.ts +114 -0
  180. package/src/config/index.ts +315 -0
  181. package/src/config/schema.ts +164 -0
  182. package/src/generators/index.ts +251 -0
  183. package/src/generators/python.ts +318 -0
  184. package/src/generators/templates/index.ts +6 -0
  185. package/src/generators/templates/python.ts +465 -0
  186. package/src/generators/templates/typescript.ts +417 -0
  187. package/src/generators/typescript.ts +340 -0
  188. package/src/index.ts +13 -0
  189. package/src/state/index.ts +454 -0
  190. package/src/state/persistence.ts +230 -0
  191. package/src/types/cli.ts +146 -0
  192. package/src/types/consensus.ts +116 -0
  193. package/src/types/index.ts +64 -0
  194. package/src/types/project.ts +85 -0
  195. package/src/types/workflow.ts +149 -0
  196. package/src/workflow/consensus.ts +299 -0
  197. package/src/workflow/execution-mode.ts +517 -0
  198. package/src/workflow/index.ts +396 -0
  199. package/src/workflow/plan-mode.ts +356 -0
  200. package/src/workflow/test-runner.ts +345 -0
  201. package/tests/adapters/openai.test.ts +145 -0
  202. package/tests/config/config.test.ts +208 -0
  203. package/tests/generators/generators.test.ts +185 -0
  204. package/tests/types/consensus.test.ts +152 -0
  205. package/tests/types/project.test.ts +134 -0
  206. package/tests/workflow/consensus.test.ts +221 -0
  207. package/tests/workflow/test-runner.test.ts +214 -0
  208. package/tsconfig.json +25 -0
  209. package/vitest.config.ts +22 -0
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Local OAuth callback server for authentication flows
3
+ * Handles browser-based OAuth redirects and token entry
4
+ */
5
+ /**
6
+ * Find an available port in the specified range
7
+ */
8
+ export declare function findAvailablePort(start: number, end: number): Promise<number>;
9
+ /**
10
+ * Result from the auth callback server
11
+ */
12
+ export interface AuthCallbackResult {
13
+ success: boolean;
14
+ token?: string;
15
+ error?: string;
16
+ }
17
+ /**
18
+ * Create and start an OAuth callback server
19
+ *
20
+ * @param options - Server options
21
+ * @returns Promise that resolves when a token is received
22
+ */
23
+ export declare function startAuthCallbackServer(options: {
24
+ port?: number;
25
+ timeout?: number;
26
+ type: 'claude' | 'openai';
27
+ }): Promise<AuthCallbackResult>;
28
+ /**
29
+ * Get the callback URL for OAuth flows
30
+ */
31
+ export declare function getCallbackUrl(port: number, type: 'claude' | 'openai'): string;
32
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/auth/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBnF;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE;IACrD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC3B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA4L9B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAK9E"}
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Local OAuth callback server for authentication flows
3
+ * Handles browser-based OAuth redirects and token entry
4
+ */
5
+ import express from 'express';
6
+ import { createServer } from 'http';
7
+ import { getOpenAIEntryHTML } from './openai-entry.js';
8
+ /**
9
+ * Find an available port in the specified range
10
+ */
11
+ export async function findAvailablePort(start, end) {
12
+ const net = await import('net');
13
+ for (let port = start; port <= end; port++) {
14
+ const isAvailable = await new Promise((resolve) => {
15
+ const server = net.createServer();
16
+ server.once('error', () => resolve(false));
17
+ server.once('listening', () => {
18
+ server.close();
19
+ resolve(true);
20
+ });
21
+ server.listen(port, '127.0.0.1');
22
+ });
23
+ if (isAvailable) {
24
+ return port;
25
+ }
26
+ }
27
+ throw new Error(`No available ports found in range ${start}-${end}`);
28
+ }
29
+ /**
30
+ * Create and start an OAuth callback server
31
+ *
32
+ * @param options - Server options
33
+ * @returns Promise that resolves when a token is received
34
+ */
35
+ export async function startAuthCallbackServer(options) {
36
+ const { type, timeout = 300000 } = options; // 5 minute default timeout
37
+ const port = options.port || (await findAvailablePort(3000, 3100));
38
+ return new Promise((resolve) => {
39
+ const app = express();
40
+ // eslint-disable-next-line prefer-const
41
+ let server;
42
+ // Parse JSON bodies
43
+ app.use(express.json());
44
+ app.use(express.urlencoded({ extended: true }));
45
+ // Serve the token entry page for OpenAI
46
+ if (type === 'openai') {
47
+ app.get('/', (_req, res) => {
48
+ res.setHeader('Content-Type', 'text/html');
49
+ res.send(getOpenAIEntryHTML(port));
50
+ });
51
+ // Handle token submission
52
+ app.get('/submit', (req, res) => {
53
+ const token = req.query.token;
54
+ if (!token) {
55
+ res.status(400).send('<html><body><h1>Error: No token provided</h1></body></html>');
56
+ return;
57
+ }
58
+ res.send(`
59
+ <html>
60
+ <head>
61
+ <style>
62
+ body {
63
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
64
+ display: flex;
65
+ justify-content: center;
66
+ align-items: center;
67
+ height: 100vh;
68
+ margin: 0;
69
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
70
+ color: white;
71
+ }
72
+ .container {
73
+ text-align: center;
74
+ padding: 40px;
75
+ background: rgba(255, 255, 255, 0.1);
76
+ border-radius: 16px;
77
+ backdrop-filter: blur(10px);
78
+ }
79
+ h1 { margin-bottom: 16px; }
80
+ p { opacity: 0.9; }
81
+ </style>
82
+ </head>
83
+ <body>
84
+ <div class="container">
85
+ <h1>Token Received!</h1>
86
+ <p>You can close this window and return to the terminal.</p>
87
+ </div>
88
+ </body>
89
+ </html>
90
+ `);
91
+ // Close server after sending response
92
+ setTimeout(() => {
93
+ server.close();
94
+ resolve({ success: true, token });
95
+ }, 100);
96
+ });
97
+ // Handle POST submission as well
98
+ app.post('/submit', (req, res) => {
99
+ const token = req.body.token;
100
+ if (!token) {
101
+ res.status(400).json({ error: 'No token provided' });
102
+ return;
103
+ }
104
+ res.json({ success: true });
105
+ setTimeout(() => {
106
+ server.close();
107
+ resolve({ success: true, token });
108
+ }, 100);
109
+ });
110
+ }
111
+ // Handle Claude OAuth callback
112
+ if (type === 'claude') {
113
+ app.get('/callback', (req, res) => {
114
+ const code = req.query.code;
115
+ const error = req.query.error;
116
+ if (error) {
117
+ res.send(`
118
+ <html>
119
+ <body>
120
+ <h1>Authentication Failed</h1>
121
+ <p>Error: ${error}</p>
122
+ <p>You can close this window.</p>
123
+ </body>
124
+ </html>
125
+ `);
126
+ setTimeout(() => {
127
+ server.close();
128
+ resolve({ success: false, error });
129
+ }, 100);
130
+ return;
131
+ }
132
+ if (!code) {
133
+ res.status(400).send('<html><body><h1>Error: No authorization code</h1></body></html>');
134
+ return;
135
+ }
136
+ res.send(`
137
+ <html>
138
+ <head>
139
+ <style>
140
+ body {
141
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
142
+ display: flex;
143
+ justify-content: center;
144
+ align-items: center;
145
+ height: 100vh;
146
+ margin: 0;
147
+ background: linear-gradient(135deg, #da7756 0%, #c35f3b 100%);
148
+ color: white;
149
+ }
150
+ .container {
151
+ text-align: center;
152
+ padding: 40px;
153
+ background: rgba(255, 255, 255, 0.1);
154
+ border-radius: 16px;
155
+ backdrop-filter: blur(10px);
156
+ }
157
+ </style>
158
+ </head>
159
+ <body>
160
+ <div class="container">
161
+ <h1>Authentication Successful!</h1>
162
+ <p>You can close this window and return to the terminal.</p>
163
+ </div>
164
+ </body>
165
+ </html>
166
+ `);
167
+ setTimeout(() => {
168
+ server.close();
169
+ resolve({ success: true, token: code });
170
+ }, 100);
171
+ });
172
+ }
173
+ // Handle cancel
174
+ app.get('/cancel', (_req, res) => {
175
+ res.send(`
176
+ <html>
177
+ <body>
178
+ <h1>Authentication Cancelled</h1>
179
+ <p>You can close this window.</p>
180
+ </body>
181
+ </html>
182
+ `);
183
+ setTimeout(() => {
184
+ server.close();
185
+ resolve({ success: false, error: 'User cancelled authentication' });
186
+ }, 100);
187
+ });
188
+ // Start server
189
+ server = createServer(app);
190
+ server.listen(port, '127.0.0.1', () => {
191
+ console.log(`Auth server listening on http://127.0.0.1:${port}`);
192
+ });
193
+ // Set timeout
194
+ const timeoutId = setTimeout(() => {
195
+ server.close();
196
+ resolve({ success: false, error: 'Authentication timed out' });
197
+ }, timeout);
198
+ // Clear timeout when server closes
199
+ server.on('close', () => {
200
+ clearTimeout(timeoutId);
201
+ });
202
+ });
203
+ }
204
+ /**
205
+ * Get the callback URL for OAuth flows
206
+ */
207
+ export function getCallbackUrl(port, type) {
208
+ if (type === 'claude') {
209
+ return `http://127.0.0.1:${port}/callback`;
210
+ }
211
+ return `http://127.0.0.1:${port}`;
212
+ }
213
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/auth/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,OAAsD,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,YAAY,EAAe,MAAM,MAAM,CAAC;AACjD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAa,EAAE,GAAW;IAChE,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;IAEhC,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC;QAC3C,MAAM,WAAW,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACzD,MAAM,MAAM,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC;YAClC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC3C,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE;gBAC5B,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,qCAAqC,KAAK,IAAI,GAAG,EAAE,CAAC,CAAC;AACvE,CAAC;AAWD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAI7C;IACC,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,2BAA2B;IACvE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAEnE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,GAAG,GAAY,OAAO,EAAE,CAAC;QAC/B,wCAAwC;QACxC,IAAI,MAAc,CAAC;QAEnB,oBAAoB;QACpB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACxB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAEhD,wCAAwC;QACxC,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;gBAC5C,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;gBAC3C,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;YAEH,0BAA0B;YAC1B,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;gBACjD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAe,CAAC;gBAExC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;oBACpF,OAAO;gBACT,CAAC;gBAED,GAAG,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAgCR,CAAC,CAAC;gBAEH,sCAAsC;gBACtC,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpC,CAAC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC,CAAC,CAAC;YAEH,iCAAiC;YACjC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;gBAClD,MAAM,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,KAAe,CAAC;gBAEvC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;oBACrD,OAAO;gBACT,CAAC;gBAED,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAE5B,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACpC,CAAC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC,CAAC,CAAC;QACL,CAAC;QAED,+BAA+B;QAC/B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;gBACnD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,IAAc,CAAC;gBACtC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,KAAe,CAAC;gBAExC,IAAI,KAAK,EAAE,CAAC;oBACV,GAAG,CAAC,IAAI,CAAC;;;;4BAIS,KAAK;;;;WAItB,CAAC,CAAC;oBACH,UAAU,CAAC,GAAG,EAAE;wBACd,MAAM,CAAC,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;oBACrC,CAAC,EAAE,GAAG,CAAC,CAAC;oBACR,OAAO;gBACT,CAAC;gBAED,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;oBACxF,OAAO;gBACT,CAAC;gBAED,GAAG,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA8BR,CAAC,CAAC;gBAEH,UAAU,CAAC,GAAG,EAAE;oBACd,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1C,CAAC,EAAE,GAAG,CAAC,CAAC;YACV,CAAC,CAAC,CAAC;QACL,CAAC;QAED,gBAAgB;QAChB,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,IAAa,EAAE,GAAa,EAAE,EAAE;YAClD,GAAG,CAAC,IAAI,CAAC;;;;;;;OAOR,CAAC,CAAC;YACH,UAAU,CAAC,GAAG,EAAE;gBACd,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;YACtE,CAAC,EAAE,GAAG,CAAC,CAAC;QACV,CAAC,CAAC,CAAC;QAEH,eAAe;QACf,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE;YACpC,OAAO,CAAC,GAAG,CAAC,6CAA6C,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEH,cAAc;QACd,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;QACjE,CAAC,EAAE,OAAO,CAAC,CAAC;QAEZ,mCAAmC;QACnC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;YACtB,YAAY,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,IAAyB;IACpE,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,oBAAoB,IAAI,WAAW,CAAC;IAC7C,CAAC;IACD,OAAO,oBAAoB,IAAI,EAAE,CAAC;AACpC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Authentication commands
3
+ * Handles login, logout, and status for Claude and OpenAI
4
+ */
5
+ import { Command } from 'commander';
6
+ /**
7
+ * Create the auth command
8
+ */
9
+ export declare function createAuthCommand(): Command;
10
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBpC;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,OAAO,CAsK3C"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * Authentication commands
3
+ * Handles login, logout, and status for Claude and OpenAI
4
+ */
5
+ import { Command } from 'commander';
6
+ import { getAuthStatusForDisplay, authenticateService, logout, isAuthenticated, } from '../../auth/index.js';
7
+ import { authenticateOpenAIWithKey } from '../../auth/openai.js';
8
+ import { printHeader, printAuthStatus, printSuccess, printError, printInfo, startSpinner, succeedSpinner, failSpinner, } from '../output.js';
9
+ /**
10
+ * Create the auth command
11
+ */
12
+ export function createAuthCommand() {
13
+ const auth = new Command('auth')
14
+ .description('Manage authentication for Claude CLI and OpenAI API');
15
+ // Status subcommand
16
+ auth
17
+ .command('status')
18
+ .description('Show authentication status')
19
+ .action(async () => {
20
+ startSpinner('Checking authentication status...');
21
+ try {
22
+ const status = await getAuthStatusForDisplay();
23
+ succeedSpinner('Status retrieved');
24
+ printAuthStatus(status);
25
+ if (!status.claude.authenticated || !status.openai.authenticated) {
26
+ console.log();
27
+ printInfo('Run "popeye-cli auth login" to authenticate missing services.');
28
+ }
29
+ }
30
+ catch (error) {
31
+ failSpinner('Failed to check status');
32
+ printError(error instanceof Error ? error.message : 'Unknown error');
33
+ process.exit(1);
34
+ }
35
+ });
36
+ // Login subcommand
37
+ auth
38
+ .command('login')
39
+ .description('Authenticate with services')
40
+ .argument('[service]', 'Service to authenticate (claude, openai, all)', 'all')
41
+ .option('--api-key <key>', 'OpenAI API key (for openai service)')
42
+ .action(async (service, options) => {
43
+ // Validate service
44
+ if (!['claude', 'openai', 'all'].includes(service)) {
45
+ printError(`Invalid service: ${service}. Use 'claude', 'openai', or 'all'.`);
46
+ process.exit(1);
47
+ }
48
+ printHeader('Authentication');
49
+ try {
50
+ // Handle API key for OpenAI
51
+ if ((service === 'openai' || service === 'all') && options.apiKey) {
52
+ startSpinner('Validating OpenAI API key...');
53
+ const success = await authenticateOpenAIWithKey(options.apiKey);
54
+ if (success) {
55
+ succeedSpinner('OpenAI API authenticated');
56
+ }
57
+ else {
58
+ failSpinner('OpenAI API authentication failed');
59
+ if (service === 'openai') {
60
+ process.exit(1);
61
+ }
62
+ }
63
+ // If only OpenAI was requested, we're done
64
+ if (service === 'openai') {
65
+ return;
66
+ }
67
+ // Continue with Claude if 'all'
68
+ if (service === 'all') {
69
+ service = 'claude';
70
+ }
71
+ }
72
+ // Interactive authentication
73
+ const success = await authenticateService(service);
74
+ if (success) {
75
+ printSuccess('Authentication complete!');
76
+ }
77
+ else {
78
+ printError('Authentication failed');
79
+ process.exit(1);
80
+ }
81
+ }
82
+ catch (error) {
83
+ printError(error instanceof Error ? error.message : 'Unknown error');
84
+ process.exit(1);
85
+ }
86
+ });
87
+ // Logout subcommand
88
+ auth
89
+ .command('logout')
90
+ .description('Remove stored credentials')
91
+ .argument('[service]', 'Service to logout from (claude, openai, all)', 'all')
92
+ .action(async (service) => {
93
+ // Validate service
94
+ if (!['claude', 'openai', 'all'].includes(service)) {
95
+ printError(`Invalid service: ${service}. Use 'claude', 'openai', or 'all'.`);
96
+ process.exit(1);
97
+ }
98
+ try {
99
+ await logout(service);
100
+ printSuccess(`Logged out from ${service === 'all' ? 'all services' : service}`);
101
+ }
102
+ catch (error) {
103
+ printError(error instanceof Error ? error.message : 'Unknown error');
104
+ process.exit(1);
105
+ }
106
+ });
107
+ // Claude-specific subcommand
108
+ auth
109
+ .command('claude')
110
+ .description('Authenticate with Claude CLI')
111
+ .action(async () => {
112
+ printHeader('Claude CLI Authentication');
113
+ const alreadyAuth = await isAuthenticated('claude');
114
+ if (alreadyAuth) {
115
+ printInfo('Already authenticated with Claude CLI');
116
+ return;
117
+ }
118
+ const success = await authenticateService('claude');
119
+ if (success) {
120
+ printSuccess('Claude CLI authenticated!');
121
+ }
122
+ else {
123
+ printError('Claude CLI authentication failed');
124
+ process.exit(1);
125
+ }
126
+ });
127
+ // OpenAI-specific subcommand
128
+ auth
129
+ .command('openai')
130
+ .description('Authenticate with OpenAI API')
131
+ .option('--api-key <key>', 'OpenAI API key')
132
+ .action(async (options) => {
133
+ printHeader('OpenAI API Authentication');
134
+ if (options.apiKey) {
135
+ startSpinner('Validating API key...');
136
+ const success = await authenticateOpenAIWithKey(options.apiKey);
137
+ if (success) {
138
+ succeedSpinner('OpenAI API authenticated!');
139
+ }
140
+ else {
141
+ failSpinner('Invalid API key');
142
+ process.exit(1);
143
+ }
144
+ return;
145
+ }
146
+ const alreadyAuth = await isAuthenticated('openai');
147
+ if (alreadyAuth) {
148
+ printInfo('Already authenticated with OpenAI API');
149
+ return;
150
+ }
151
+ const success = await authenticateService('openai');
152
+ if (success) {
153
+ printSuccess('OpenAI API authenticated!');
154
+ }
155
+ else {
156
+ printError('OpenAI API authentication failed');
157
+ process.exit(1);
158
+ }
159
+ });
160
+ return auth;
161
+ }
162
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/cli/commands/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,MAAM,EACN,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EACL,WAAW,EACX,eAAe,EACf,YAAY,EACZ,UAAU,EACV,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,GACZ,MAAM,cAAc,CAAC;AAEtB;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;SAC7B,WAAW,CAAC,qDAAqD,CAAC,CAAC;IAEtE,oBAAoB;IACpB,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,4BAA4B,CAAC;SACzC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,YAAY,CAAC,mCAAmC,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,uBAAuB,EAAE,CAAC;YAC/C,cAAc,CAAC,kBAAkB,CAAC,CAAC;YAEnC,eAAe,CAAC,MAAM,CAAC,CAAC;YAExB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;gBACjE,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,SAAS,CAAC,+DAA+D,CAAC,CAAC;YAC7E,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,WAAW,CAAC,wBAAwB,CAAC,CAAC;YACtC,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,mBAAmB;IACnB,IAAI;SACD,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,4BAA4B,CAAC;SACzC,QAAQ,CAAC,WAAW,EAAE,+CAA+C,EAAE,KAAK,CAAC;SAC7E,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,KAAK,EAAE,OAAoC,EAAE,OAAO,EAAE,EAAE;QAC9D,mBAAmB;QACnB,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,UAAU,CAAC,oBAAoB,OAAO,qCAAqC,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,WAAW,CAAC,gBAAgB,CAAC,CAAC;QAE9B,IAAI,CAAC;YACH,4BAA4B;YAC5B,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAClE,YAAY,CAAC,8BAA8B,CAAC,CAAC;gBAC7C,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAEhE,IAAI,OAAO,EAAE,CAAC;oBACZ,cAAc,CAAC,0BAA0B,CAAC,CAAC;gBAC7C,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,kCAAkC,CAAC,CAAC;oBAChD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;wBACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;gBAED,2CAA2C;gBAC3C,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;oBACzB,OAAO;gBACT,CAAC;gBAED,gCAAgC;gBAChC,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;oBACtB,OAAO,GAAG,QAAQ,CAAC;gBACrB,CAAC;YACH,CAAC;YAED,6BAA6B;YAC7B,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,OAAO,CAAC,CAAC;YAEnD,IAAI,OAAO,EAAE,CAAC;gBACZ,YAAY,CAAC,0BAA0B,CAAC,CAAC;YAC3C,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,uBAAuB,CAAC,CAAC;gBACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,oBAAoB;IACpB,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,2BAA2B,CAAC;SACxC,QAAQ,CAAC,WAAW,EAAE,8CAA8C,EAAE,KAAK,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,OAAoC,EAAE,EAAE;QACrD,mBAAmB;QACnB,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,UAAU,CAAC,oBAAoB,OAAO,qCAAqC,CAAC,CAAC;YAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;YACtB,YAAY,CAAC,mBAAmB,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAClF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,6BAA6B;IAC7B,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,WAAW,CAAC,2BAA2B,CAAC,CAAC;QAEzC,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS,CAAC,uCAAuC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAEpD,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,2BAA2B,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,kCAAkC,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,6BAA6B;IAC7B,IAAI;SACD,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,8BAA8B,CAAC;SAC3C,MAAM,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,WAAW,CAAC,2BAA2B,CAAC,CAAC;QAEzC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,YAAY,CAAC,uBAAuB,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,yBAAyB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEhE,IAAI,OAAO,EAAE,CAAC;gBACZ,cAAc,CAAC,2BAA2B,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,WAAW,CAAC,iBAAiB,CAAC,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS,CAAC,uCAAuC,CAAC,CAAC;YACnD,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,CAAC;QAEpD,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,2BAA2B,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,kCAAkC,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Config command
3
+ * Manage CLI configuration
4
+ */
5
+ import { Command } from 'commander';
6
+ /**
7
+ * Create the config command
8
+ */
9
+ export declare function createConfigCommand(): Command;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CA6I7C"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Config command
3
+ * Manage CLI configuration
4
+ */
5
+ import { Command } from 'commander';
6
+ import path from 'node:path';
7
+ import { loadConfig, getConfigPath } from '../../config/index.js';
8
+ import { DEFAULT_CONFIG } from '../../config/defaults.js';
9
+ import { printHeader, printSection, printSuccess, printError, printInfo, printKeyValue, } from '../output.js';
10
+ /**
11
+ * Create the config command
12
+ */
13
+ export function createConfigCommand() {
14
+ const config = new Command('config')
15
+ .description('Manage CLI configuration');
16
+ // Show current config
17
+ config
18
+ .command('show')
19
+ .description('Show current configuration')
20
+ .option('--json', 'Output as JSON')
21
+ .action(async (options) => {
22
+ try {
23
+ const loadedConfig = await loadConfig();
24
+ const configPath = getConfigPath();
25
+ if (options.json) {
26
+ console.log(JSON.stringify(loadedConfig, null, 2));
27
+ return;
28
+ }
29
+ printHeader('Current Configuration');
30
+ if (configPath) {
31
+ printInfo(`Config file: ${configPath}`);
32
+ }
33
+ else {
34
+ printInfo('Using default configuration');
35
+ }
36
+ console.log();
37
+ printConfigSection('Consensus', loadedConfig.consensus);
38
+ printConfigSection('APIs', loadedConfig.apis);
39
+ printConfigSection('Project', loadedConfig.project);
40
+ printConfigSection('Directories', loadedConfig.directories);
41
+ printConfigSection('Output', loadedConfig.output);
42
+ }
43
+ catch (error) {
44
+ printError(error instanceof Error ? error.message : 'Unknown error');
45
+ process.exit(1);
46
+ }
47
+ });
48
+ // Show defaults
49
+ config
50
+ .command('defaults')
51
+ .description('Show default configuration values')
52
+ .option('--json', 'Output as JSON')
53
+ .action((options) => {
54
+ if (options.json) {
55
+ console.log(JSON.stringify(DEFAULT_CONFIG, null, 2));
56
+ return;
57
+ }
58
+ printHeader('Default Configuration');
59
+ printConfigSection('Consensus', DEFAULT_CONFIG.consensus);
60
+ printConfigSection('APIs', DEFAULT_CONFIG.apis);
61
+ printConfigSection('Project', DEFAULT_CONFIG.project);
62
+ printConfigSection('Directories', DEFAULT_CONFIG.directories);
63
+ printConfigSection('Output', DEFAULT_CONFIG.output);
64
+ });
65
+ // Get a specific config value
66
+ config
67
+ .command('get')
68
+ .description('Get a specific configuration value')
69
+ .argument('<key>', 'Configuration key (e.g., consensus.threshold)')
70
+ .action(async (key) => {
71
+ try {
72
+ const loadedConfig = await loadConfig();
73
+ const value = getNestedValue(loadedConfig, key);
74
+ if (value === undefined) {
75
+ printError(`Configuration key not found: ${key}`);
76
+ process.exit(1);
77
+ }
78
+ if (typeof value === 'object') {
79
+ console.log(JSON.stringify(value, null, 2));
80
+ }
81
+ else {
82
+ console.log(value);
83
+ }
84
+ }
85
+ catch (error) {
86
+ printError(error instanceof Error ? error.message : 'Unknown error');
87
+ process.exit(1);
88
+ }
89
+ });
90
+ // Show config file path
91
+ config
92
+ .command('path')
93
+ .description('Show configuration file path')
94
+ .action(() => {
95
+ const configPath = getConfigPath();
96
+ if (configPath) {
97
+ console.log(configPath);
98
+ }
99
+ else {
100
+ printInfo('No configuration file found');
101
+ printInfo('Create one at: .popeyerc, .popeyerc.json, .popeyerc.yaml, or popeye.config.js');
102
+ }
103
+ });
104
+ // Init config file
105
+ config
106
+ .command('init')
107
+ .description('Create a configuration file')
108
+ .option('-f, --format <format>', 'Config format (json, yaml)', 'json')
109
+ .action(async (options) => {
110
+ const { promises: fs } = await import('node:fs');
111
+ const format = options.format;
112
+ let filename;
113
+ let content;
114
+ if (format === 'yaml') {
115
+ filename = '.popeyerc.yaml';
116
+ content = generateYamlConfig();
117
+ }
118
+ else {
119
+ filename = '.popeyerc.json';
120
+ content = JSON.stringify(DEFAULT_CONFIG, null, 2);
121
+ }
122
+ const filepath = path.join(process.cwd(), filename);
123
+ try {
124
+ // Check if file exists
125
+ try {
126
+ await fs.access(filepath);
127
+ printError(`Configuration file already exists: ${filepath}`);
128
+ process.exit(1);
129
+ }
130
+ catch {
131
+ // File doesn't exist, good to create
132
+ }
133
+ await fs.writeFile(filepath, content, 'utf-8');
134
+ printSuccess(`Created configuration file: ${filepath}`);
135
+ }
136
+ catch (error) {
137
+ printError(error instanceof Error ? error.message : 'Failed to create config file');
138
+ process.exit(1);
139
+ }
140
+ });
141
+ return config;
142
+ }
143
+ /**
144
+ * Print a configuration section
145
+ */
146
+ function printConfigSection(name, section) {
147
+ printSection(name);
148
+ for (const [key, value] of Object.entries(section)) {
149
+ if (typeof value === 'object' && value !== null) {
150
+ console.log(` ${key}:`);
151
+ for (const [subKey, subValue] of Object.entries(value)) {
152
+ printKeyValue(` ${subKey}`, String(subValue));
153
+ }
154
+ }
155
+ else {
156
+ printKeyValue(` ${key}`, String(value));
157
+ }
158
+ }
159
+ console.log();
160
+ }
161
+ /**
162
+ * Get a nested value from an object using dot notation
163
+ */
164
+ function getNestedValue(obj, path) {
165
+ const keys = path.split('.');
166
+ let current = obj;
167
+ for (const key of keys) {
168
+ if (current === null || current === undefined) {
169
+ return undefined;
170
+ }
171
+ if (typeof current !== 'object') {
172
+ return undefined;
173
+ }
174
+ current = current[key];
175
+ }
176
+ return current;
177
+ }
178
+ /**
179
+ * Generate YAML configuration content
180
+ */
181
+ function generateYamlConfig() {
182
+ return `# Popeye CLI Configuration
183
+ # See documentation for all available options
184
+
185
+ # Consensus settings
186
+ consensus:
187
+ threshold: 95
188
+ maxIterations: 5
189
+ temperature: 0.3
190
+ maxTokens: 4096
191
+
192
+ # API settings
193
+ apis:
194
+ openai:
195
+ model: gpt-4o
196
+ timeout: 120000
197
+
198
+ # Project defaults
199
+ project:
200
+ defaultLanguage: python
201
+ defaultName: my-project
202
+
203
+ # Directory settings
204
+ directories:
205
+ output: ./output
206
+ state: .popeye
207
+
208
+ # Output settings
209
+ output:
210
+ verbose: false
211
+ colors: true
212
+ progress: true
213
+ `;
214
+ }
215
+ //# sourceMappingURL=config.js.map