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,6 +1,6 @@
1
1
  /**
2
2
  * Authentication commands
3
- * Handles login, logout, and status for Claude and OpenAI
3
+ * Handles login, logout, and status for Claude, OpenAI, Gemini, and Grok
4
4
  */
5
5
 
6
6
  import { Command } from 'commander';
@@ -11,6 +11,8 @@ import {
11
11
  isAuthenticated,
12
12
  } from '../../auth/index.js';
13
13
  import { authenticateOpenAIWithKey } from '../../auth/openai.js';
14
+ import { authenticateGeminiWithKey } from '../../auth/gemini.js';
15
+ import { authenticateGrokWithKey } from '../../auth/grok.js';
14
16
  import {
15
17
  printHeader,
16
18
  printAuthStatus,
@@ -46,6 +48,9 @@ export function createAuthCommand(): Command {
46
48
  console.log();
47
49
  printInfo('Run "popeye-cli auth login" to authenticate missing services.');
48
50
  }
51
+ if (status.grok && !status.grok.authenticated) {
52
+ printInfo('Run "popeye-cli auth grok" to authenticate Grok (optional).');
53
+ }
49
54
  } catch (error) {
50
55
  failSpinner('Failed to check status');
51
56
  printError(error instanceof Error ? error.message : 'Unknown error');
@@ -57,12 +62,12 @@ export function createAuthCommand(): Command {
57
62
  auth
58
63
  .command('login')
59
64
  .description('Authenticate with services')
60
- .argument('[service]', 'Service to authenticate (claude, openai, all)', 'all')
61
- .option('--api-key <key>', 'OpenAI API key (for openai service)')
62
- .action(async (service: 'claude' | 'openai' | 'all', options) => {
65
+ .argument('[service]', 'Service to authenticate (claude, openai, gemini, grok, all)', 'all')
66
+ .option('--api-key <key>', 'API key (for openai, gemini, or grok service)')
67
+ .action(async (service: 'claude' | 'openai' | 'gemini' | 'grok' | 'all', options) => {
63
68
  // Validate service
64
- if (!['claude', 'openai', 'all'].includes(service)) {
65
- printError(`Invalid service: ${service}. Use 'claude', 'openai', or 'all'.`);
69
+ if (!['claude', 'openai', 'gemini', 'grok', 'all'].includes(service)) {
70
+ printError(`Invalid service: ${service}. Use 'claude', 'openai', 'gemini', 'grok', or 'all'.`);
66
71
  process.exit(1);
67
72
  }
68
73
 
@@ -113,11 +118,11 @@ export function createAuthCommand(): Command {
113
118
  auth
114
119
  .command('logout')
115
120
  .description('Remove stored credentials')
116
- .argument('[service]', 'Service to logout from (claude, openai, all)', 'all')
117
- .action(async (service: 'claude' | 'openai' | 'all') => {
121
+ .argument('[service]', 'Service to logout from (claude, openai, gemini, grok, all)', 'all')
122
+ .action(async (service: 'claude' | 'openai' | 'gemini' | 'grok' | 'all') => {
118
123
  // Validate service
119
- if (!['claude', 'openai', 'all'].includes(service)) {
120
- printError(`Invalid service: ${service}. Use 'claude', 'openai', or 'all'.`);
124
+ if (!['claude', 'openai', 'gemini', 'grok', 'all'].includes(service)) {
125
+ printError(`Invalid service: ${service}. Use 'claude', 'openai', 'gemini', 'grok', or 'all'.`);
121
126
  process.exit(1);
122
127
  }
123
128
 
@@ -190,5 +195,79 @@ export function createAuthCommand(): Command {
190
195
  }
191
196
  });
192
197
 
198
+ // Gemini-specific subcommand
199
+ auth
200
+ .command('gemini')
201
+ .description('Authenticate with Gemini API')
202
+ .option('--api-key <key>', 'Gemini API key')
203
+ .action(async (options) => {
204
+ printHeader('Gemini API Authentication');
205
+
206
+ if (options.apiKey) {
207
+ startSpinner('Validating API key...');
208
+ const success = await authenticateGeminiWithKey(options.apiKey);
209
+
210
+ if (success) {
211
+ succeedSpinner('Gemini API authenticated!');
212
+ } else {
213
+ failSpinner('Invalid API key');
214
+ process.exit(1);
215
+ }
216
+ return;
217
+ }
218
+
219
+ const alreadyAuth = await isAuthenticated('gemini');
220
+ if (alreadyAuth) {
221
+ printInfo('Already authenticated with Gemini API');
222
+ return;
223
+ }
224
+
225
+ const success = await authenticateService('gemini');
226
+
227
+ if (success) {
228
+ printSuccess('Gemini API authenticated!');
229
+ } else {
230
+ printError('Gemini API authentication failed');
231
+ process.exit(1);
232
+ }
233
+ });
234
+
235
+ // Grok-specific subcommand
236
+ auth
237
+ .command('grok')
238
+ .description('Authenticate with xAI Grok API')
239
+ .option('--api-key <key>', 'Grok API key')
240
+ .action(async (options) => {
241
+ printHeader('Grok API Authentication');
242
+
243
+ if (options.apiKey) {
244
+ startSpinner('Validating API key...');
245
+ const success = await authenticateGrokWithKey(options.apiKey);
246
+
247
+ if (success) {
248
+ succeedSpinner('Grok API authenticated!');
249
+ } else {
250
+ failSpinner('Invalid API key');
251
+ process.exit(1);
252
+ }
253
+ return;
254
+ }
255
+
256
+ const alreadyAuth = await isAuthenticated('grok');
257
+ if (alreadyAuth) {
258
+ printInfo('Already authenticated with Grok API');
259
+ return;
260
+ }
261
+
262
+ const success = await authenticateService('grok');
263
+
264
+ if (success) {
265
+ printSuccess('Grok API authenticated!');
266
+ } else {
267
+ printError('Grok API authentication failed');
268
+ process.exit(1);
269
+ }
270
+ });
271
+
193
272
  return auth;
194
273
  }
@@ -35,7 +35,7 @@ export function createCreateCommand(): Command {
35
35
  .option('-n, --name <name>', 'Project name')
36
36
  .option(
37
37
  '-l, --language <lang>',
38
- 'Output language (python, typescript)',
38
+ 'Output language (python, typescript, fullstack)',
39
39
  'python'
40
40
  )
41
41
  .option(
@@ -66,8 +66,8 @@ export function createCreateCommand(): Command {
66
66
  try {
67
67
  // Validate inputs
68
68
  const language = options.language as OutputLanguage;
69
- if (!['python', 'typescript'].includes(language)) {
70
- printError(`Invalid language: ${language}. Use 'python' or 'typescript'.`);
69
+ if (!['python', 'typescript', 'fullstack'].includes(language)) {
70
+ printError(`Invalid language: ${language}. Use 'python', 'typescript', or 'fullstack'.`);
71
71
  process.exit(1);
72
72
  }
73
73
 
@@ -192,7 +192,16 @@ export function createCreateCommand(): Command {
192
192
  printSuccess('Your project is ready!');
193
193
  console.log();
194
194
  printInfo(`cd ${projectDir}`);
195
- printInfo(language === 'python' ? 'python -m pytest tests/' : 'npm test');
195
+ if (language === 'python') {
196
+ printInfo('python -m pytest tests/');
197
+ } else if (language === 'typescript') {
198
+ printInfo('npm test');
199
+ } else if (language === 'fullstack') {
200
+ printInfo('docker-compose up # Run both frontend and backend');
201
+ printInfo('# Or run separately:');
202
+ printInfo('cd apps/frontend && npm install && npm run dev');
203
+ printInfo('cd apps/backend && pip install -e . && uvicorn src.backend.main:app --reload');
204
+ }
196
205
  } else {
197
206
  printHeader('Project Creation Failed');
198
207