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
@@ -11,8 +11,11 @@ import type { Config } from './schema.js';
11
11
  export const DEFAULT_CONFIG: Config = {
12
12
  consensus: {
13
13
  threshold: 95,
14
- max_disagreements: 5,
14
+ max_disagreements: 10,
15
15
  escalation_action: 'pause',
16
+ reviewer: 'openai',
17
+ arbitrator: 'off',
18
+ enable_arbitration: false,
16
19
  },
17
20
  apis: {
18
21
  openai: {
@@ -24,6 +27,12 @@ export const DEFAULT_CONFIG: Config = {
24
27
  claude: {
25
28
  model: 'claude-sonnet-4-20250514',
26
29
  },
30
+ grok: {
31
+ model: 'grok-3',
32
+ temperature: 0.3,
33
+ max_tokens: 4096,
34
+ api_url: 'https://api.x.ai/v1',
35
+ },
27
36
  },
28
37
  project: {
29
38
  default_language: 'python',
@@ -88,6 +97,8 @@ export const SERVICE_NAME = 'popeye-cli';
88
97
  export const KEYCHAIN_ACCOUNTS = {
89
98
  CLAUDE: 'claude-cli',
90
99
  OPENAI: 'openai-api',
100
+ GEMINI: 'gemini-api',
101
+ GROK: 'grok-api',
91
102
  } as const;
92
103
 
93
104
  /**
@@ -96,8 +107,14 @@ export const KEYCHAIN_ACCOUNTS = {
96
107
  export const ENV_VARS = {
97
108
  OPENAI_KEY: 'POPEYE_OPENAI_KEY',
98
109
  ANTHROPIC_KEY: 'POPEYE_ANTHROPIC_KEY',
110
+ GEMINI_KEY: 'POPEYE_GEMINI_KEY',
111
+ GROK_KEY: 'POPEYE_GROK_KEY',
99
112
  DEFAULT_LANGUAGE: 'POPEYE_DEFAULT_LANGUAGE',
100
113
  OPENAI_MODEL: 'POPEYE_OPENAI_MODEL',
114
+ GEMINI_MODEL: 'POPEYE_GEMINI_MODEL',
115
+ GROK_MODEL: 'POPEYE_GROK_MODEL',
116
+ CONSENSUS_REVIEWER: 'POPEYE_CONSENSUS_REVIEWER',
117
+ CONSENSUS_ARBITRATOR: 'POPEYE_CONSENSUS_ARBITRATOR',
101
118
  CONSENSUS_THRESHOLD: 'POPEYE_CONSENSUS_THRESHOLD',
102
119
  MAX_DISAGREEMENTS: 'POPEYE_MAX_DISAGREEMENTS',
103
120
  LOG_LEVEL: 'POPEYE_LOG_LEVEL',
@@ -106,7 +123,7 @@ export const ENV_VARS = {
106
123
  /**
107
124
  * CLI version
108
125
  */
109
- export const CLI_VERSION = '1.0.0';
126
+ export const CLI_VERSION = '1.0.2';
110
127
 
111
128
  /**
112
129
  * State file version
@@ -86,12 +86,26 @@ function loadEnvConfig(): Partial<Config> {
86
86
  model: openaiModel as Config['apis']['openai']['model'],
87
87
  },
88
88
  claude: DEFAULT_CONFIG.apis.claude,
89
+ grok: DEFAULT_CONFIG.apis.grok,
90
+ };
91
+ }
92
+
93
+ // Grok model
94
+ const grokModel = process.env[ENV_VARS.GROK_MODEL];
95
+ if (grokModel) {
96
+ config.apis = {
97
+ ...DEFAULT_CONFIG.apis,
98
+ ...(config.apis || {}),
99
+ grok: {
100
+ ...DEFAULT_CONFIG.apis.grok,
101
+ model: grokModel,
102
+ },
89
103
  };
90
104
  }
91
105
 
92
106
  // Default language
93
107
  const defaultLanguage = process.env[ENV_VARS.DEFAULT_LANGUAGE];
94
- if (defaultLanguage && (defaultLanguage === 'python' || defaultLanguage === 'typescript')) {
108
+ if (defaultLanguage && (defaultLanguage === 'python' || defaultLanguage === 'typescript' || defaultLanguage === 'fullstack')) {
95
109
  config.project = {
96
110
  ...DEFAULT_CONFIG.project,
97
111
  default_language: defaultLanguage,
@@ -124,6 +138,27 @@ function loadEnvConfig(): Partial<Config> {
124
138
  }
125
139
  }
126
140
 
141
+ // Reviewer
142
+ const reviewer = process.env[ENV_VARS.CONSENSUS_REVIEWER];
143
+ if (reviewer && (reviewer === 'openai' || reviewer === 'gemini' || reviewer === 'grok')) {
144
+ config.consensus = {
145
+ ...DEFAULT_CONFIG.consensus,
146
+ ...(config.consensus || {}),
147
+ reviewer,
148
+ };
149
+ }
150
+
151
+ // Arbitrator
152
+ const arbitrator = process.env[ENV_VARS.CONSENSUS_ARBITRATOR];
153
+ if (arbitrator && (arbitrator === 'openai' || arbitrator === 'gemini' || arbitrator === 'grok' || arbitrator === 'off')) {
154
+ config.consensus = {
155
+ ...DEFAULT_CONFIG.consensus,
156
+ ...(config.consensus || {}),
157
+ arbitrator,
158
+ enable_arbitration: arbitrator !== 'off',
159
+ };
160
+ }
161
+
127
162
  // Verbose/log level
128
163
  const logLevel = process.env[ENV_VARS.LOG_LEVEL];
129
164
  if (logLevel === 'debug') {
@@ -12,6 +12,10 @@ export const ConsensusSettingsSchema = z.object({
12
12
  threshold: z.number().min(0).max(100).default(95),
13
13
  max_disagreements: z.number().min(1).max(10).default(5),
14
14
  escalation_action: z.enum(['pause', 'continue', 'abort']).default('pause'),
15
+ // Reviewer and arbitrator settings (persisted across sessions)
16
+ reviewer: z.enum(['openai', 'gemini', 'grok']).default('openai'),
17
+ arbitrator: z.enum(['openai', 'gemini', 'grok', 'off']).default('off'),
18
+ enable_arbitration: z.boolean().default(false),
15
19
  });
16
20
 
17
21
  /**
@@ -35,6 +39,16 @@ export const ClaudeSettingsSchema = z.object({
35
39
  model: z.string().default('claude-sonnet-4-20250514'),
36
40
  });
37
41
 
42
+ /**
43
+ * Grok API settings schema
44
+ */
45
+ export const GrokSettingsSchema = z.object({
46
+ model: z.string().default('grok-3'),
47
+ temperature: z.number().min(0).max(2).default(0.3),
48
+ max_tokens: z.number().min(100).max(32000).default(4096),
49
+ api_url: z.string().default('https://api.x.ai/v1'),
50
+ });
51
+
38
52
  /**
39
53
  * API configuration schema
40
54
  */
@@ -48,6 +62,12 @@ export const APISettingsSchema = z.object({
48
62
  claude: ClaudeSettingsSchema.default({
49
63
  model: 'claude-sonnet-4-20250514',
50
64
  }),
65
+ grok: GrokSettingsSchema.default({
66
+ model: 'grok-3',
67
+ temperature: 0.3,
68
+ max_tokens: 4096,
69
+ api_url: 'https://api.x.ai/v1',
70
+ }),
51
71
  });
52
72
 
53
73
  /**
@@ -72,7 +92,7 @@ export const TypeScriptSettingsSchema = z.object({
72
92
  * Project defaults schema
73
93
  */
74
94
  export const ProjectSettingsSchema = z.object({
75
- default_language: z.enum(['python', 'typescript']).default('python'),
95
+ default_language: z.enum(['python', 'typescript', 'fullstack']).default('python'),
76
96
  python: PythonSettingsSchema.default({
77
97
  package_manager: 'pip',
78
98
  test_framework: 'pytest',
@@ -112,6 +132,9 @@ export const ConfigSchema = z.object({
112
132
  threshold: 95,
113
133
  max_disagreements: 5,
114
134
  escalation_action: 'pause',
135
+ reviewer: 'openai',
136
+ arbitrator: 'off',
137
+ enable_arbitration: false,
115
138
  }),
116
139
  apis: APISettingsSchema.default({
117
140
  openai: {
@@ -123,6 +146,12 @@ export const ConfigSchema = z.object({
123
146
  claude: {
124
147
  model: 'claude-sonnet-4-20250514',
125
148
  },
149
+ grok: {
150
+ model: 'grok-3',
151
+ temperature: 0.3,
152
+ max_tokens: 4096,
153
+ api_url: 'https://api.x.ai/v1',
154
+ },
126
155
  }),
127
156
  project: ProjectSettingsSchema.default({
128
157
  default_language: 'python',