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.
- package/.env.example +24 -1
- package/CONTRIBUTING.md +275 -0
- package/OPEN_SOURCE_MANIFESTO.md +172 -0
- package/README.md +832 -123
- package/dist/adapters/claude.d.ts +19 -4
- package/dist/adapters/claude.d.ts.map +1 -1
- package/dist/adapters/claude.js +908 -42
- package/dist/adapters/claude.js.map +1 -1
- package/dist/adapters/gemini.d.ts +55 -0
- package/dist/adapters/gemini.d.ts.map +1 -0
- package/dist/adapters/gemini.js +318 -0
- package/dist/adapters/gemini.js.map +1 -0
- package/dist/adapters/grok.d.ts +73 -0
- package/dist/adapters/grok.d.ts.map +1 -0
- package/dist/adapters/grok.js +430 -0
- package/dist/adapters/grok.js.map +1 -0
- package/dist/adapters/openai.d.ts +1 -1
- package/dist/adapters/openai.d.ts.map +1 -1
- package/dist/adapters/openai.js +47 -8
- package/dist/adapters/openai.js.map +1 -1
- package/dist/auth/claude.d.ts +11 -9
- package/dist/auth/claude.d.ts.map +1 -1
- package/dist/auth/claude.js +107 -71
- package/dist/auth/claude.js.map +1 -1
- package/dist/auth/gemini.d.ts +58 -0
- package/dist/auth/gemini.d.ts.map +1 -0
- package/dist/auth/gemini.js +172 -0
- package/dist/auth/gemini.js.map +1 -0
- package/dist/auth/grok.d.ts +73 -0
- package/dist/auth/grok.d.ts.map +1 -0
- package/dist/auth/grok.js +211 -0
- package/dist/auth/grok.js.map +1 -0
- package/dist/auth/index.d.ts +14 -7
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +41 -6
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/keychain.d.ts +20 -7
- package/dist/auth/keychain.d.ts.map +1 -1
- package/dist/auth/keychain.js +85 -29
- package/dist/auth/keychain.js.map +1 -1
- package/dist/auth/openai.d.ts +2 -2
- package/dist/auth/openai.d.ts.map +1 -1
- package/dist/auth/openai.js +30 -32
- package/dist/auth/openai.js.map +1 -1
- package/dist/cli/commands/auth.d.ts +1 -1
- package/dist/cli/commands/auth.d.ts.map +1 -1
- package/dist/cli/commands/auth.js +79 -8
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +15 -4
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/interactive.d.ts.map +1 -1
- package/dist/cli/interactive.js +1494 -114
- package/dist/cli/interactive.js.map +1 -1
- package/dist/config/defaults.d.ts +9 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +19 -2
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/index.d.ts +19 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +33 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/schema.d.ts +47 -0
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +29 -1
- package/dist/config/schema.js.map +1 -1
- package/dist/generators/fullstack.d.ts +32 -0
- package/dist/generators/fullstack.d.ts.map +1 -0
- package/dist/generators/fullstack.js +497 -0
- package/dist/generators/fullstack.js.map +1 -0
- package/dist/generators/index.d.ts +4 -3
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +15 -1
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/python.d.ts +17 -1
- package/dist/generators/python.d.ts.map +1 -1
- package/dist/generators/python.js +34 -20
- package/dist/generators/python.js.map +1 -1
- package/dist/generators/templates/fullstack.d.ts +113 -0
- package/dist/generators/templates/fullstack.d.ts.map +1 -0
- package/dist/generators/templates/fullstack.js +1004 -0
- package/dist/generators/templates/fullstack.js.map +1 -0
- package/dist/generators/typescript.d.ts +19 -1
- package/dist/generators/typescript.d.ts.map +1 -1
- package/dist/generators/typescript.js +37 -20
- package/dist/generators/typescript.js.map +1 -1
- package/dist/state/index.d.ts +108 -0
- package/dist/state/index.d.ts.map +1 -1
- package/dist/state/index.js +551 -4
- package/dist/state/index.js.map +1 -1
- package/dist/state/registry.d.ts +52 -0
- package/dist/state/registry.d.ts.map +1 -0
- package/dist/state/registry.js +215 -0
- package/dist/state/registry.js.map +1 -0
- package/dist/types/cli.d.ts +8 -0
- package/dist/types/cli.d.ts.map +1 -1
- package/dist/types/cli.js.map +1 -1
- package/dist/types/consensus.d.ts +186 -4
- package/dist/types/consensus.d.ts.map +1 -1
- package/dist/types/consensus.js +35 -3
- package/dist/types/consensus.js.map +1 -1
- package/dist/types/project.d.ts +76 -0
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/project.js +1 -1
- package/dist/types/project.js.map +1 -1
- package/dist/types/workflow.d.ts +217 -16
- package/dist/types/workflow.d.ts.map +1 -1
- package/dist/types/workflow.js +40 -1
- package/dist/types/workflow.js.map +1 -1
- package/dist/workflow/auto-fix.d.ts +45 -0
- package/dist/workflow/auto-fix.d.ts.map +1 -0
- package/dist/workflow/auto-fix.js +274 -0
- package/dist/workflow/auto-fix.js.map +1 -0
- package/dist/workflow/consensus.d.ts +70 -2
- package/dist/workflow/consensus.d.ts.map +1 -1
- package/dist/workflow/consensus.js +872 -17
- package/dist/workflow/consensus.js.map +1 -1
- package/dist/workflow/execution-mode.d.ts +10 -4
- package/dist/workflow/execution-mode.d.ts.map +1 -1
- package/dist/workflow/execution-mode.js +547 -58
- package/dist/workflow/execution-mode.js.map +1 -1
- package/dist/workflow/index.d.ts +14 -2
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +69 -6
- package/dist/workflow/index.js.map +1 -1
- package/dist/workflow/milestone-workflow.d.ts +34 -0
- package/dist/workflow/milestone-workflow.d.ts.map +1 -0
- package/dist/workflow/milestone-workflow.js +414 -0
- package/dist/workflow/milestone-workflow.js.map +1 -0
- package/dist/workflow/plan-mode.d.ts +80 -3
- package/dist/workflow/plan-mode.d.ts.map +1 -1
- package/dist/workflow/plan-mode.js +767 -49
- package/dist/workflow/plan-mode.js.map +1 -1
- package/dist/workflow/plan-storage.d.ts +386 -0
- package/dist/workflow/plan-storage.d.ts.map +1 -0
- package/dist/workflow/plan-storage.js +878 -0
- package/dist/workflow/plan-storage.js.map +1 -0
- package/dist/workflow/project-verification.d.ts +37 -0
- package/dist/workflow/project-verification.d.ts.map +1 -0
- package/dist/workflow/project-verification.js +381 -0
- package/dist/workflow/project-verification.js.map +1 -0
- package/dist/workflow/task-workflow.d.ts +37 -0
- package/dist/workflow/task-workflow.d.ts.map +1 -0
- package/dist/workflow/task-workflow.js +386 -0
- package/dist/workflow/task-workflow.js.map +1 -0
- package/dist/workflow/test-runner.d.ts +9 -0
- package/dist/workflow/test-runner.d.ts.map +1 -1
- package/dist/workflow/test-runner.js +101 -5
- package/dist/workflow/test-runner.js.map +1 -1
- package/dist/workflow/ui-designer.d.ts +82 -0
- package/dist/workflow/ui-designer.d.ts.map +1 -0
- package/dist/workflow/ui-designer.js +234 -0
- package/dist/workflow/ui-designer.js.map +1 -0
- package/dist/workflow/ui-setup.d.ts +58 -0
- package/dist/workflow/ui-setup.d.ts.map +1 -0
- package/dist/workflow/ui-setup.js +685 -0
- package/dist/workflow/ui-setup.js.map +1 -0
- package/dist/workflow/ui-verification.d.ts +114 -0
- package/dist/workflow/ui-verification.d.ts.map +1 -0
- package/dist/workflow/ui-verification.js +258 -0
- package/dist/workflow/ui-verification.js.map +1 -0
- package/dist/workflow/workflow-logger.d.ts +110 -0
- package/dist/workflow/workflow-logger.d.ts.map +1 -0
- package/dist/workflow/workflow-logger.js +267 -0
- package/dist/workflow/workflow-logger.js.map +1 -0
- package/dist/workflow/workspace-manager.d.ts +342 -0
- package/dist/workflow/workspace-manager.d.ts.map +1 -0
- package/dist/workflow/workspace-manager.js +733 -0
- package/dist/workflow/workspace-manager.js.map +1 -0
- package/package.json +2 -2
- package/src/adapters/claude.ts +1067 -47
- package/src/adapters/gemini.ts +373 -0
- package/src/adapters/grok.ts +492 -0
- package/src/adapters/openai.ts +48 -9
- package/src/auth/claude.ts +120 -78
- package/src/auth/gemini.ts +207 -0
- package/src/auth/grok.ts +255 -0
- package/src/auth/index.ts +47 -9
- package/src/auth/keychain.ts +95 -28
- package/src/auth/openai.ts +29 -36
- package/src/cli/commands/auth.ts +89 -10
- package/src/cli/commands/create.ts +13 -4
- package/src/cli/interactive.ts +1774 -142
- package/src/config/defaults.ts +19 -2
- package/src/config/index.ts +36 -1
- package/src/config/schema.ts +30 -1
- package/src/generators/fullstack.ts +551 -0
- package/src/generators/index.ts +25 -1
- package/src/generators/python.ts +65 -20
- package/src/generators/templates/fullstack.ts +1047 -0
- package/src/generators/typescript.ts +69 -20
- package/src/state/index.ts +713 -4
- package/src/state/registry.ts +278 -0
- package/src/types/cli.ts +8 -0
- package/src/types/consensus.ts +197 -6
- package/src/types/project.ts +82 -1
- package/src/types/workflow.ts +90 -1
- package/src/workflow/auto-fix.ts +340 -0
- package/src/workflow/consensus.ts +1180 -16
- package/src/workflow/execution-mode.ts +673 -74
- package/src/workflow/index.ts +95 -6
- package/src/workflow/milestone-workflow.ts +576 -0
- package/src/workflow/plan-mode.ts +924 -50
- package/src/workflow/plan-storage.ts +1282 -0
- package/src/workflow/project-verification.ts +471 -0
- package/src/workflow/task-workflow.ts +528 -0
- package/src/workflow/test-runner.ts +120 -5
- package/src/workflow/ui-designer.ts +337 -0
- package/src/workflow/ui-setup.ts +797 -0
- package/src/workflow/ui-verification.ts +357 -0
- package/src/workflow/workflow-logger.ts +353 -0
- package/src/workflow/workspace-manager.ts +912 -0
- package/tests/config/config.test.ts +1 -1
- package/tests/types/consensus.test.ts +3 -3
- package/tests/workflow/plan-mode.test.ts +213 -0
- package/tests/workflow/test-runner.test.ts +5 -3
package/src/cli/commands/auth.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Authentication commands
|
|
3
|
-
* Handles login, logout, and status for Claude and
|
|
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>', '
|
|
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 '
|
|
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
|
-
|
|
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
|
|