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,87 @@
1
+ /**
2
+ * Test runner module
3
+ * Handles running tests for Python and TypeScript projects
4
+ */
5
+ import type { OutputLanguage } from '../types/project.js';
6
+ /**
7
+ * Test result from running tests
8
+ */
9
+ export interface TestResult {
10
+ success: boolean;
11
+ passed: number;
12
+ failed: number;
13
+ total: number;
14
+ output: string;
15
+ failedTests?: string[];
16
+ error?: string;
17
+ }
18
+ /**
19
+ * Test configuration
20
+ */
21
+ export interface TestConfig {
22
+ language: OutputLanguage;
23
+ testDir?: string;
24
+ coverage?: boolean;
25
+ verbose?: boolean;
26
+ timeout?: number;
27
+ }
28
+ /**
29
+ * Default test commands by language
30
+ */
31
+ export declare const DEFAULT_TEST_COMMANDS: Record<OutputLanguage, string>;
32
+ /**
33
+ * Build the test command for a language
34
+ *
35
+ * @param config - Test configuration
36
+ * @returns The test command to run
37
+ */
38
+ export declare function buildTestCommand(config: TestConfig): string;
39
+ /**
40
+ * Parse test output to extract results
41
+ *
42
+ * @param output - The test command output
43
+ * @param language - The project language
44
+ * @returns Parsed test result
45
+ */
46
+ export declare function parseTestOutput(output: string, language: OutputLanguage): TestResult;
47
+ /**
48
+ * Run Python tests
49
+ *
50
+ * @param cwd - Working directory
51
+ * @param config - Test configuration
52
+ * @returns Test result
53
+ */
54
+ export declare function runPythonTests(cwd: string, config?: Partial<TestConfig>): Promise<TestResult>;
55
+ /**
56
+ * Run TypeScript tests
57
+ *
58
+ * @param cwd - Working directory
59
+ * @param config - Test configuration
60
+ * @returns Test result
61
+ */
62
+ export declare function runTypeScriptTests(cwd: string, config?: Partial<TestConfig>): Promise<TestResult>;
63
+ /**
64
+ * Run tests for a project
65
+ *
66
+ * @param cwd - Working directory
67
+ * @param language - Project language
68
+ * @param config - Test configuration
69
+ * @returns Test result
70
+ */
71
+ export declare function runTests(cwd: string, language: OutputLanguage, config?: Partial<TestConfig>): Promise<TestResult>;
72
+ /**
73
+ * Check if tests exist in a project
74
+ *
75
+ * @param cwd - Working directory
76
+ * @param language - Project language
77
+ * @returns True if tests exist
78
+ */
79
+ export declare function testsExist(cwd: string, language: OutputLanguage): Promise<boolean>;
80
+ /**
81
+ * Get test summary string
82
+ *
83
+ * @param result - Test result
84
+ * @returns Human-readable summary
85
+ */
86
+ export declare function getTestSummary(result: TestResult): string;
87
+ //# sourceMappingURL=test-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-runner.d.ts","sourceRoot":"","sources":["../../src/workflow/test-runner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAGhE,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAkC3D;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,UAAU,CA6DpF;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B,OAAO,CAAC,UAAU,CAAC,CA+BrB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,EACX,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B,OAAO,CAAC,UAAU,CAAC,CA+BrB;AAED;;;;;;;GAOG;AACH,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,cAAc,EACxB,MAAM,GAAE,OAAO,CAAC,UAAU,CAAM,GAC/B,OAAO,CAAC,UAAU,CAAC,CAOrB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,cAAc,GACvB,OAAO,CAAC,OAAO,CAAC,CAkDlB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAiBzD"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Test runner module
3
+ * Handles running tests for Python and TypeScript projects
4
+ */
5
+ import { runTests as claudeRunTests } from '../adapters/claude.js';
6
+ /**
7
+ * Default test commands by language
8
+ */
9
+ export const DEFAULT_TEST_COMMANDS = {
10
+ python: 'python -m pytest tests/ -v',
11
+ typescript: 'npm test',
12
+ };
13
+ /**
14
+ * Build the test command for a language
15
+ *
16
+ * @param config - Test configuration
17
+ * @returns The test command to run
18
+ */
19
+ export function buildTestCommand(config) {
20
+ const { language, testDir, coverage, verbose } = config;
21
+ switch (language) {
22
+ case 'python': {
23
+ const parts = ['python', '-m', 'pytest'];
24
+ if (testDir) {
25
+ parts.push(testDir);
26
+ }
27
+ else {
28
+ parts.push('tests/');
29
+ }
30
+ if (verbose) {
31
+ parts.push('-v');
32
+ }
33
+ if (coverage) {
34
+ parts.push('--cov=src', '--cov-report=term-missing');
35
+ }
36
+ return parts.join(' ');
37
+ }
38
+ case 'typescript': {
39
+ const parts = ['npm', 'test'];
40
+ if (coverage) {
41
+ parts.push('--', '--coverage');
42
+ }
43
+ return parts.join(' ');
44
+ }
45
+ }
46
+ }
47
+ /**
48
+ * Parse test output to extract results
49
+ *
50
+ * @param output - The test command output
51
+ * @param language - The project language
52
+ * @returns Parsed test result
53
+ */
54
+ export function parseTestOutput(output, language) {
55
+ let passed = 0;
56
+ let failed = 0;
57
+ let total = 0;
58
+ const failedTests = [];
59
+ switch (language) {
60
+ case 'python': {
61
+ // Parse pytest output
62
+ // Example: "5 passed, 2 failed, 1 skipped in 2.34s"
63
+ const summaryMatch = output.match(/(\d+)\s+passed/);
64
+ const failedMatch = output.match(/(\d+)\s+failed/);
65
+ if (summaryMatch) {
66
+ passed = parseInt(summaryMatch[1], 10);
67
+ }
68
+ if (failedMatch) {
69
+ failed = parseInt(failedMatch[1], 10);
70
+ }
71
+ total = passed + failed;
72
+ // Extract failed test names
73
+ const failedTestMatches = output.matchAll(/FAILED\s+([^\s]+)/g);
74
+ for (const match of failedTestMatches) {
75
+ failedTests.push(match[1]);
76
+ }
77
+ break;
78
+ }
79
+ case 'typescript': {
80
+ // Parse Jest/Vitest output
81
+ // Example: "Tests: 2 failed, 5 passed, 7 total"
82
+ const summaryMatch = output.match(/Tests:\s*(?:(\d+)\s+failed,\s*)?(\d+)\s+passed,\s*(\d+)\s+total/);
83
+ if (summaryMatch) {
84
+ failed = summaryMatch[1] ? parseInt(summaryMatch[1], 10) : 0;
85
+ passed = parseInt(summaryMatch[2], 10);
86
+ total = parseInt(summaryMatch[3], 10);
87
+ }
88
+ // Extract failed test names
89
+ const failedTestMatches = output.matchAll(/✕\s+(.+)/g);
90
+ for (const match of failedTestMatches) {
91
+ failedTests.push(match[1].trim());
92
+ }
93
+ break;
94
+ }
95
+ }
96
+ const success = failed === 0 && total > 0;
97
+ return {
98
+ success,
99
+ passed,
100
+ failed,
101
+ total,
102
+ output,
103
+ failedTests: failedTests.length > 0 ? failedTests : undefined,
104
+ };
105
+ }
106
+ /**
107
+ * Run Python tests
108
+ *
109
+ * @param cwd - Working directory
110
+ * @param config - Test configuration
111
+ * @returns Test result
112
+ */
113
+ export async function runPythonTests(cwd, config = {}) {
114
+ const testCommand = buildTestCommand({
115
+ language: 'python',
116
+ ...config,
117
+ });
118
+ try {
119
+ const result = await claudeRunTests(testCommand, cwd);
120
+ if (!result.success && result.error) {
121
+ return {
122
+ success: false,
123
+ passed: 0,
124
+ failed: 0,
125
+ total: 0,
126
+ output: result.response,
127
+ error: result.error,
128
+ };
129
+ }
130
+ return parseTestOutput(result.response, 'python');
131
+ }
132
+ catch (error) {
133
+ return {
134
+ success: false,
135
+ passed: 0,
136
+ failed: 0,
137
+ total: 0,
138
+ output: '',
139
+ error: error instanceof Error ? error.message : 'Unknown error running tests',
140
+ };
141
+ }
142
+ }
143
+ /**
144
+ * Run TypeScript tests
145
+ *
146
+ * @param cwd - Working directory
147
+ * @param config - Test configuration
148
+ * @returns Test result
149
+ */
150
+ export async function runTypeScriptTests(cwd, config = {}) {
151
+ const testCommand = buildTestCommand({
152
+ language: 'typescript',
153
+ ...config,
154
+ });
155
+ try {
156
+ const result = await claudeRunTests(testCommand, cwd);
157
+ if (!result.success && result.error) {
158
+ return {
159
+ success: false,
160
+ passed: 0,
161
+ failed: 0,
162
+ total: 0,
163
+ output: result.response,
164
+ error: result.error,
165
+ };
166
+ }
167
+ return parseTestOutput(result.response, 'typescript');
168
+ }
169
+ catch (error) {
170
+ return {
171
+ success: false,
172
+ passed: 0,
173
+ failed: 0,
174
+ total: 0,
175
+ output: '',
176
+ error: error instanceof Error ? error.message : 'Unknown error running tests',
177
+ };
178
+ }
179
+ }
180
+ /**
181
+ * Run tests for a project
182
+ *
183
+ * @param cwd - Working directory
184
+ * @param language - Project language
185
+ * @param config - Test configuration
186
+ * @returns Test result
187
+ */
188
+ export async function runTests(cwd, language, config = {}) {
189
+ switch (language) {
190
+ case 'python':
191
+ return runPythonTests(cwd, config);
192
+ case 'typescript':
193
+ return runTypeScriptTests(cwd, config);
194
+ }
195
+ }
196
+ /**
197
+ * Check if tests exist in a project
198
+ *
199
+ * @param cwd - Working directory
200
+ * @param language - Project language
201
+ * @returns True if tests exist
202
+ */
203
+ export async function testsExist(cwd, language) {
204
+ const { promises: fs } = await import('node:fs');
205
+ const path = await import('node:path');
206
+ try {
207
+ switch (language) {
208
+ case 'python': {
209
+ // Check for tests/ directory or test_*.py files
210
+ const testsDir = path.join(cwd, 'tests');
211
+ try {
212
+ await fs.access(testsDir);
213
+ return true;
214
+ }
215
+ catch {
216
+ // Check for test files in root
217
+ const files = await fs.readdir(cwd);
218
+ return files.some((f) => f.startsWith('test_') && f.endsWith('.py'));
219
+ }
220
+ }
221
+ case 'typescript': {
222
+ // Check for tests/, __tests__, or *.test.ts files
223
+ const testsDir = path.join(cwd, 'tests');
224
+ const testsDirAlt = path.join(cwd, '__tests__');
225
+ try {
226
+ await fs.access(testsDir);
227
+ return true;
228
+ }
229
+ catch {
230
+ try {
231
+ await fs.access(testsDirAlt);
232
+ return true;
233
+ }
234
+ catch {
235
+ // Check for test files in src
236
+ const srcDir = path.join(cwd, 'src');
237
+ try {
238
+ const files = await fs.readdir(srcDir, { recursive: true });
239
+ return files.some((f) => (f.toString().endsWith('.test.ts') || f.toString().endsWith('.spec.ts')));
240
+ }
241
+ catch {
242
+ return false;
243
+ }
244
+ }
245
+ }
246
+ }
247
+ }
248
+ }
249
+ catch {
250
+ return false;
251
+ }
252
+ }
253
+ /**
254
+ * Get test summary string
255
+ *
256
+ * @param result - Test result
257
+ * @returns Human-readable summary
258
+ */
259
+ export function getTestSummary(result) {
260
+ if (result.error) {
261
+ return `Tests failed to run: ${result.error}`;
262
+ }
263
+ if (result.total === 0) {
264
+ return 'No tests found';
265
+ }
266
+ const status = result.success ? '✓' : '✗';
267
+ let summary = `${status} ${result.passed}/${result.total} tests passed`;
268
+ if (result.failed > 0) {
269
+ summary += ` (${result.failed} failed)`;
270
+ }
271
+ return summary;
272
+ }
273
+ //# sourceMappingURL=test-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-runner.js","sourceRoot":"","sources":["../../src/workflow/test-runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import eslint from '@eslint/js';
2
+ import tseslint from 'typescript-eslint';
3
+
4
+ export default tseslint.config(
5
+ eslint.configs.recommended,
6
+ ...tseslint.configs.recommended,
7
+ {
8
+ files: ['src/**/*.ts'],
9
+ languageOptions: {
10
+ parserOptions: {
11
+ project: './tsconfig.json',
12
+ },
13
+ },
14
+ rules: {
15
+ '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }],
16
+ '@typescript-eslint/explicit-function-return-type': 'off',
17
+ '@typescript-eslint/no-explicit-any': 'warn',
18
+ '@typescript-eslint/prefer-nullish-coalescing': 'off',
19
+ 'no-console': 'off',
20
+ },
21
+ },
22
+ {
23
+ ignores: ['dist/**', 'node_modules/**', '*.config.js', '*.config.ts'],
24
+ }
25
+ );
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "popeye-cli",
3
+ "version": "1.0.0",
4
+ "description": "Fully autonomous code generation tool powered by Claude CLI and OpenAI consensus",
5
+ "main": "./dist/index.js",
6
+ "bin": {
7
+ "popeye": "./dist/index.js",
8
+ "popeye-cli": "./dist/index.js"
9
+ },
10
+ "type": "module",
11
+ "scripts": {
12
+ "build": "tsc",
13
+ "dev": "tsc --watch",
14
+ "start": "node dist/index.js",
15
+ "test": "vitest run",
16
+ "test:watch": "vitest",
17
+ "test:coverage": "vitest run --coverage",
18
+ "lint": "eslint src --ext .ts",
19
+ "lint:fix": "eslint src --ext .ts --fix",
20
+ "format": "prettier --write \"src/**/*.ts\"",
21
+ "typecheck": "tsc --noEmit",
22
+ "clean": "rm -rf dist",
23
+ "prepublishOnly": "npm run build"
24
+ },
25
+ "keywords": [
26
+ "cli",
27
+ "code-generation",
28
+ "claude",
29
+ "openai",
30
+ "ai",
31
+ "autonomous",
32
+ "typescript"
33
+ ],
34
+ "author": "",
35
+ "license": "MIT",
36
+ "engines": {
37
+ "node": ">=18.0.0"
38
+ },
39
+ "dependencies": {
40
+ "@anthropic-ai/claude-agent-sdk": "^0.2.12",
41
+ "chalk": "^5.3.0",
42
+ "commander": "^12.1.0",
43
+ "cosmiconfig": "^9.0.0",
44
+ "express": "^4.21.0",
45
+ "keytar": "^7.9.0",
46
+ "open": "^10.1.0",
47
+ "openai": "^4.73.0",
48
+ "ora": "^8.1.0",
49
+ "uuid": "^10.0.0",
50
+ "yaml": "^2.6.0",
51
+ "zod": "^4.0.0"
52
+ },
53
+ "devDependencies": {
54
+ "@types/express": "^4.17.21",
55
+ "@types/node": "^20.17.6",
56
+ "@types/uuid": "^10.0.0",
57
+ "@typescript-eslint/eslint-plugin": "^8.14.0",
58
+ "@typescript-eslint/parser": "^8.14.0",
59
+ "@vitest/coverage-v8": "^2.1.4",
60
+ "eslint": "^9.14.0",
61
+ "prettier": "^3.3.3",
62
+ "typescript": "^5.6.3",
63
+ "typescript-eslint": "^8.53.1",
64
+ "vitest": "^2.1.4"
65
+ }
66
+ }