wiggum-cli 0.1.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 (236) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +341 -0
  3. package/bin/ralph.js +8 -0
  4. package/dist/ai/enhancer.d.ts +100 -0
  5. package/dist/ai/enhancer.d.ts.map +1 -0
  6. package/dist/ai/enhancer.js +233 -0
  7. package/dist/ai/enhancer.js.map +1 -0
  8. package/dist/ai/index.d.ts +8 -0
  9. package/dist/ai/index.d.ts.map +1 -0
  10. package/dist/ai/index.js +11 -0
  11. package/dist/ai/index.js.map +1 -0
  12. package/dist/ai/prompts.d.ts +26 -0
  13. package/dist/ai/prompts.d.ts.map +1 -0
  14. package/dist/ai/prompts.js +201 -0
  15. package/dist/ai/prompts.js.map +1 -0
  16. package/dist/ai/providers.d.ts +35 -0
  17. package/dist/ai/providers.d.ts.map +1 -0
  18. package/dist/ai/providers.js +104 -0
  19. package/dist/ai/providers.js.map +1 -0
  20. package/dist/cli.d.ts +6 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +196 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/commands/init.d.ts +16 -0
  25. package/dist/commands/init.d.ts.map +1 -0
  26. package/dist/commands/init.js +124 -0
  27. package/dist/commands/init.js.map +1 -0
  28. package/dist/commands/monitor.d.ts +17 -0
  29. package/dist/commands/monitor.d.ts.map +1 -0
  30. package/dist/commands/monitor.js +342 -0
  31. package/dist/commands/monitor.js.map +1 -0
  32. package/dist/commands/new.d.ts +19 -0
  33. package/dist/commands/new.d.ts.map +1 -0
  34. package/dist/commands/new.js +272 -0
  35. package/dist/commands/new.js.map +1 -0
  36. package/dist/commands/run.d.ts +16 -0
  37. package/dist/commands/run.d.ts.map +1 -0
  38. package/dist/commands/run.js +175 -0
  39. package/dist/commands/run.js.map +1 -0
  40. package/dist/generator/config.d.ts +59 -0
  41. package/dist/generator/config.d.ts.map +1 -0
  42. package/dist/generator/config.js +68 -0
  43. package/dist/generator/config.js.map +1 -0
  44. package/dist/generator/index.d.ts +64 -0
  45. package/dist/generator/index.d.ts.map +1 -0
  46. package/dist/generator/index.js +147 -0
  47. package/dist/generator/index.js.map +1 -0
  48. package/dist/generator/templates.d.ts +70 -0
  49. package/dist/generator/templates.d.ts.map +1 -0
  50. package/dist/generator/templates.js +296 -0
  51. package/dist/generator/templates.js.map +1 -0
  52. package/dist/generator/writer.d.ts +93 -0
  53. package/dist/generator/writer.d.ts.map +1 -0
  54. package/dist/generator/writer.js +213 -0
  55. package/dist/generator/writer.js.map +1 -0
  56. package/dist/index.d.ts +12 -0
  57. package/dist/index.d.ts.map +1 -0
  58. package/dist/index.js +17 -0
  59. package/dist/index.js.map +1 -0
  60. package/dist/scanner/detectors/core/framework.d.ts +11 -0
  61. package/dist/scanner/detectors/core/framework.d.ts.map +1 -0
  62. package/dist/scanner/detectors/core/framework.js +275 -0
  63. package/dist/scanner/detectors/core/framework.js.map +1 -0
  64. package/dist/scanner/detectors/core/packageManager.d.ts +11 -0
  65. package/dist/scanner/detectors/core/packageManager.d.ts.map +1 -0
  66. package/dist/scanner/detectors/core/packageManager.js +74 -0
  67. package/dist/scanner/detectors/core/packageManager.js.map +1 -0
  68. package/dist/scanner/detectors/core/styling.d.ts +12 -0
  69. package/dist/scanner/detectors/core/styling.d.ts.map +1 -0
  70. package/dist/scanner/detectors/core/styling.js +230 -0
  71. package/dist/scanner/detectors/core/styling.js.map +1 -0
  72. package/dist/scanner/detectors/core/testing.d.ts +12 -0
  73. package/dist/scanner/detectors/core/testing.d.ts.map +1 -0
  74. package/dist/scanner/detectors/core/testing.js +190 -0
  75. package/dist/scanner/detectors/core/testing.js.map +1 -0
  76. package/dist/scanner/detectors/data/api.d.ts +12 -0
  77. package/dist/scanner/detectors/data/api.d.ts.map +1 -0
  78. package/dist/scanner/detectors/data/api.js +261 -0
  79. package/dist/scanner/detectors/data/api.js.map +1 -0
  80. package/dist/scanner/detectors/data/database.d.ts +12 -0
  81. package/dist/scanner/detectors/data/database.d.ts.map +1 -0
  82. package/dist/scanner/detectors/data/database.js +213 -0
  83. package/dist/scanner/detectors/data/database.js.map +1 -0
  84. package/dist/scanner/detectors/data/orm.d.ts +12 -0
  85. package/dist/scanner/detectors/data/orm.d.ts.map +1 -0
  86. package/dist/scanner/detectors/data/orm.js +160 -0
  87. package/dist/scanner/detectors/data/orm.js.map +1 -0
  88. package/dist/scanner/detectors/frontend/formHandling.d.ts +12 -0
  89. package/dist/scanner/detectors/frontend/formHandling.d.ts.map +1 -0
  90. package/dist/scanner/detectors/frontend/formHandling.js +211 -0
  91. package/dist/scanner/detectors/frontend/formHandling.js.map +1 -0
  92. package/dist/scanner/detectors/frontend/stateManagement.d.ts +12 -0
  93. package/dist/scanner/detectors/frontend/stateManagement.d.ts.map +1 -0
  94. package/dist/scanner/detectors/frontend/stateManagement.js +221 -0
  95. package/dist/scanner/detectors/frontend/stateManagement.js.map +1 -0
  96. package/dist/scanner/detectors/frontend/uiComponents.d.ts +12 -0
  97. package/dist/scanner/detectors/frontend/uiComponents.d.ts.map +1 -0
  98. package/dist/scanner/detectors/frontend/uiComponents.js +285 -0
  99. package/dist/scanner/detectors/frontend/uiComponents.js.map +1 -0
  100. package/dist/scanner/detectors/infra/deployment.d.ts +12 -0
  101. package/dist/scanner/detectors/infra/deployment.d.ts.map +1 -0
  102. package/dist/scanner/detectors/infra/deployment.js +301 -0
  103. package/dist/scanner/detectors/infra/deployment.js.map +1 -0
  104. package/dist/scanner/detectors/infra/monorepo.d.ts +12 -0
  105. package/dist/scanner/detectors/infra/monorepo.d.ts.map +1 -0
  106. package/dist/scanner/detectors/infra/monorepo.js +219 -0
  107. package/dist/scanner/detectors/infra/monorepo.js.map +1 -0
  108. package/dist/scanner/detectors/mcp/mcpProject.d.ts +12 -0
  109. package/dist/scanner/detectors/mcp/mcpProject.d.ts.map +1 -0
  110. package/dist/scanner/detectors/mcp/mcpProject.js +154 -0
  111. package/dist/scanner/detectors/mcp/mcpProject.js.map +1 -0
  112. package/dist/scanner/detectors/mcp/mcpServers.d.ts +17 -0
  113. package/dist/scanner/detectors/mcp/mcpServers.d.ts.map +1 -0
  114. package/dist/scanner/detectors/mcp/mcpServers.js +193 -0
  115. package/dist/scanner/detectors/mcp/mcpServers.js.map +1 -0
  116. package/dist/scanner/detectors/services/analytics.d.ts +12 -0
  117. package/dist/scanner/detectors/services/analytics.d.ts.map +1 -0
  118. package/dist/scanner/detectors/services/analytics.js +236 -0
  119. package/dist/scanner/detectors/services/analytics.js.map +1 -0
  120. package/dist/scanner/detectors/services/auth.d.ts +12 -0
  121. package/dist/scanner/detectors/services/auth.d.ts.map +1 -0
  122. package/dist/scanner/detectors/services/auth.js +217 -0
  123. package/dist/scanner/detectors/services/auth.js.map +1 -0
  124. package/dist/scanner/detectors/services/email.d.ts +12 -0
  125. package/dist/scanner/detectors/services/email.d.ts.map +1 -0
  126. package/dist/scanner/detectors/services/email.js +211 -0
  127. package/dist/scanner/detectors/services/email.js.map +1 -0
  128. package/dist/scanner/detectors/services/payments.d.ts +12 -0
  129. package/dist/scanner/detectors/services/payments.d.ts.map +1 -0
  130. package/dist/scanner/detectors/services/payments.js +185 -0
  131. package/dist/scanner/detectors/services/payments.js.map +1 -0
  132. package/dist/scanner/detectors/utils.d.ts +160 -0
  133. package/dist/scanner/detectors/utils.d.ts.map +1 -0
  134. package/dist/scanner/detectors/utils.js +222 -0
  135. package/dist/scanner/detectors/utils.js.map +1 -0
  136. package/dist/scanner/index.d.ts +42 -0
  137. package/dist/scanner/index.d.ts.map +1 -0
  138. package/dist/scanner/index.js +282 -0
  139. package/dist/scanner/index.js.map +1 -0
  140. package/dist/scanner/registry.d.ts +43 -0
  141. package/dist/scanner/registry.d.ts.map +1 -0
  142. package/dist/scanner/registry.js +243 -0
  143. package/dist/scanner/registry.js.map +1 -0
  144. package/dist/scanner/types.d.ts +112 -0
  145. package/dist/scanner/types.d.ts.map +1 -0
  146. package/dist/scanner/types.js +6 -0
  147. package/dist/scanner/types.js.map +1 -0
  148. package/dist/templates/config/ralph.config.js.tmpl +38 -0
  149. package/dist/templates/guides/AGENTS.md.tmpl +100 -0
  150. package/dist/templates/guides/FRONTEND.md.tmpl +523 -0
  151. package/dist/templates/guides/PERFORMANCE.md.tmpl +264 -0
  152. package/dist/templates/guides/SECURITY.md.tmpl +100 -0
  153. package/dist/templates/prompts/PROMPT.md.tmpl +77 -0
  154. package/dist/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
  155. package/dist/templates/prompts/PROMPT_feature.md.tmpl +83 -0
  156. package/dist/templates/prompts/PROMPT_review.md.tmpl +167 -0
  157. package/dist/templates/prompts/PROMPT_verify.md.tmpl +72 -0
  158. package/dist/templates/root/.gitignore.tmpl +5 -0
  159. package/dist/templates/root/LEARNINGS.md.tmpl +24 -0
  160. package/dist/templates/root/README.md.tmpl +61 -0
  161. package/dist/templates/scripts/feature-loop.sh.tmpl +267 -0
  162. package/dist/templates/scripts/loop.sh.tmpl +59 -0
  163. package/dist/templates/scripts/ralph-monitor.sh.tmpl +244 -0
  164. package/dist/templates/specs/README.md.tmpl +57 -0
  165. package/dist/templates/specs/_example.md.tmpl +71 -0
  166. package/dist/utils/config.d.ts +95 -0
  167. package/dist/utils/config.d.ts.map +1 -0
  168. package/dist/utils/config.js +148 -0
  169. package/dist/utils/config.js.map +1 -0
  170. package/dist/utils/header.d.ts +5 -0
  171. package/dist/utils/header.d.ts.map +1 -0
  172. package/dist/utils/header.js +15 -0
  173. package/dist/utils/header.js.map +1 -0
  174. package/dist/utils/logger.d.ts +11 -0
  175. package/dist/utils/logger.d.ts.map +1 -0
  176. package/dist/utils/logger.js +24 -0
  177. package/dist/utils/logger.js.map +1 -0
  178. package/package.json +44 -0
  179. package/src/ai/enhancer.ts +350 -0
  180. package/src/ai/index.ts +38 -0
  181. package/src/ai/prompts.ts +217 -0
  182. package/src/ai/providers.ts +136 -0
  183. package/src/cli.ts +255 -0
  184. package/src/commands/init.ts +149 -0
  185. package/src/commands/monitor.ts +412 -0
  186. package/src/commands/new.ts +312 -0
  187. package/src/commands/run.ts +214 -0
  188. package/src/generator/config.ts +116 -0
  189. package/src/generator/index.ts +227 -0
  190. package/src/generator/templates.ts +412 -0
  191. package/src/generator/writer.ts +293 -0
  192. package/src/index.ts +41 -0
  193. package/src/scanner/detectors/core/framework.ts +332 -0
  194. package/src/scanner/detectors/core/packageManager.ts +91 -0
  195. package/src/scanner/detectors/core/styling.ts +261 -0
  196. package/src/scanner/detectors/core/testing.ts +221 -0
  197. package/src/scanner/detectors/data/api.ts +303 -0
  198. package/src/scanner/detectors/data/database.ts +245 -0
  199. package/src/scanner/detectors/data/orm.ts +180 -0
  200. package/src/scanner/detectors/frontend/formHandling.ts +244 -0
  201. package/src/scanner/detectors/frontend/stateManagement.ts +261 -0
  202. package/src/scanner/detectors/frontend/uiComponents.ts +328 -0
  203. package/src/scanner/detectors/infra/deployment.ts +343 -0
  204. package/src/scanner/detectors/infra/monorepo.ts +251 -0
  205. package/src/scanner/detectors/mcp/mcpProject.ts +176 -0
  206. package/src/scanner/detectors/mcp/mcpServers.ts +237 -0
  207. package/src/scanner/detectors/services/analytics.ts +273 -0
  208. package/src/scanner/detectors/services/auth.ts +254 -0
  209. package/src/scanner/detectors/services/email.ts +244 -0
  210. package/src/scanner/detectors/services/payments.ts +213 -0
  211. package/src/scanner/detectors/utils.ts +251 -0
  212. package/src/scanner/index.ts +354 -0
  213. package/src/scanner/registry.ts +301 -0
  214. package/src/scanner/types.ts +152 -0
  215. package/src/templates/config/ralph.config.js.tmpl +38 -0
  216. package/src/templates/guides/AGENTS.md.tmpl +100 -0
  217. package/src/templates/guides/FRONTEND.md.tmpl +523 -0
  218. package/src/templates/guides/PERFORMANCE.md.tmpl +264 -0
  219. package/src/templates/guides/SECURITY.md.tmpl +100 -0
  220. package/src/templates/prompts/PROMPT.md.tmpl +77 -0
  221. package/src/templates/prompts/PROMPT_e2e.md.tmpl +234 -0
  222. package/src/templates/prompts/PROMPT_feature.md.tmpl +83 -0
  223. package/src/templates/prompts/PROMPT_review.md.tmpl +167 -0
  224. package/src/templates/prompts/PROMPT_verify.md.tmpl +72 -0
  225. package/src/templates/root/.gitignore.tmpl +5 -0
  226. package/src/templates/root/LEARNINGS.md.tmpl +24 -0
  227. package/src/templates/root/README.md.tmpl +61 -0
  228. package/src/templates/scripts/feature-loop.sh.tmpl +267 -0
  229. package/src/templates/scripts/loop.sh.tmpl +59 -0
  230. package/src/templates/scripts/ralph-monitor.sh.tmpl +244 -0
  231. package/src/templates/specs/README.md.tmpl +57 -0
  232. package/src/templates/specs/_example.md.tmpl +71 -0
  233. package/src/utils/config.ts +221 -0
  234. package/src/utils/header.ts +15 -0
  235. package/src/utils/logger.ts +28 -0
  236. package/tsconfig.json +19 -0
@@ -0,0 +1,243 @@
1
+ /**
2
+ * Detector Registry
3
+ * Registers and manages all detectors for the scanner
4
+ */
5
+ // Import core detectors
6
+ import { frameworkDetector } from './detectors/core/framework.js';
7
+ import { packageManagerDetector } from './detectors/core/packageManager.js';
8
+ import { testingDetector } from './detectors/core/testing.js';
9
+ import { stylingDetector } from './detectors/core/styling.js';
10
+ // Import data layer detectors
11
+ import { databaseDetector } from './detectors/data/database.js';
12
+ import { ormDetector } from './detectors/data/orm.js';
13
+ import { apiDetector } from './detectors/data/api.js';
14
+ // Import frontend detectors
15
+ import { stateManagementDetector } from './detectors/frontend/stateManagement.js';
16
+ import { uiComponentsDetector } from './detectors/frontend/uiComponents.js';
17
+ import { formHandlingDetector } from './detectors/frontend/formHandling.js';
18
+ // Import services detectors
19
+ import { authDetector } from './detectors/services/auth.js';
20
+ import { analyticsDetector } from './detectors/services/analytics.js';
21
+ import { paymentsDetector } from './detectors/services/payments.js';
22
+ import { emailDetector } from './detectors/services/email.js';
23
+ // Import infrastructure detectors
24
+ import { deploymentDetector } from './detectors/infra/deployment.js';
25
+ import { monorepoDetector } from './detectors/infra/monorepo.js';
26
+ // Import MCP detectors
27
+ import { mcpServersDetector, getRecommendedMCPServers } from './detectors/mcp/mcpServers.js';
28
+ import { mcpProjectDetector } from './detectors/mcp/mcpProject.js';
29
+ /**
30
+ * All detector categories
31
+ */
32
+ const ALL_CATEGORIES = [
33
+ // Core
34
+ 'framework',
35
+ 'packageManager',
36
+ 'testing',
37
+ 'styling',
38
+ // Data Layer
39
+ 'database',
40
+ 'orm',
41
+ 'api',
42
+ // Frontend
43
+ 'stateManagement',
44
+ 'uiComponents',
45
+ 'formHandling',
46
+ // Services
47
+ 'auth',
48
+ 'analytics',
49
+ 'payments',
50
+ 'email',
51
+ // Infrastructure
52
+ 'deployment',
53
+ 'monorepo',
54
+ // MCP
55
+ 'mcp',
56
+ ];
57
+ /**
58
+ * Detector Registry class
59
+ * Manages registration and execution of detectors
60
+ */
61
+ export class DetectorRegistry {
62
+ detectors = new Map();
63
+ constructor() {
64
+ // Initialize all categories
65
+ for (const category of ALL_CATEGORIES) {
66
+ this.detectors.set(category, []);
67
+ }
68
+ }
69
+ /**
70
+ * Register a detector
71
+ */
72
+ register(detector) {
73
+ const category = this.detectors.get(detector.category);
74
+ if (category) {
75
+ category.push(detector);
76
+ }
77
+ }
78
+ /**
79
+ * Get all detectors for a category
80
+ */
81
+ getDetectors(category) {
82
+ return this.detectors.get(category) || [];
83
+ }
84
+ /**
85
+ * Get all registered detectors
86
+ */
87
+ getAllDetectors() {
88
+ const all = [];
89
+ for (const detectors of this.detectors.values()) {
90
+ all.push(...detectors);
91
+ }
92
+ return all;
93
+ }
94
+ /**
95
+ * Run a single-result detector category
96
+ */
97
+ async runSingleDetector(projectRoot, category) {
98
+ for (const detector of this.getDetectors(category)) {
99
+ const result = await detector.detect(projectRoot);
100
+ if (result && !Array.isArray(result)) {
101
+ return result;
102
+ }
103
+ }
104
+ return null;
105
+ }
106
+ /**
107
+ * Run a multi-result detector category
108
+ */
109
+ async runMultiDetector(projectRoot, category) {
110
+ for (const detector of this.getDetectors(category)) {
111
+ const result = await detector.detect(projectRoot);
112
+ if (result) {
113
+ return Array.isArray(result) ? result : [result];
114
+ }
115
+ }
116
+ return null;
117
+ }
118
+ /**
119
+ * Run all detectors for a project
120
+ */
121
+ async runAllDetectors(projectRoot) {
122
+ const stack = {};
123
+ // ============ Core ============
124
+ // Run framework detector
125
+ stack.framework = await this.runSingleDetector(projectRoot, 'framework') || undefined;
126
+ // Run package manager detector
127
+ stack.packageManager = await this.runSingleDetector(projectRoot, 'packageManager') || undefined;
128
+ // Run testing detectors
129
+ for (const detector of this.getDetectors('testing')) {
130
+ const result = await detector.detect(projectRoot);
131
+ if (result) {
132
+ stack.testing = {};
133
+ if (Array.isArray(result)) {
134
+ for (const r of result) {
135
+ if (r.variant === 'unit') {
136
+ stack.testing.unit = r;
137
+ }
138
+ else if (r.variant === 'e2e') {
139
+ stack.testing.e2e = r;
140
+ }
141
+ }
142
+ }
143
+ else {
144
+ // Single result, determine type from name
145
+ if (result.name === 'Jest' || result.name === 'Vitest') {
146
+ stack.testing.unit = result;
147
+ }
148
+ else {
149
+ stack.testing.e2e = result;
150
+ }
151
+ }
152
+ break;
153
+ }
154
+ }
155
+ // Run styling detector
156
+ stack.styling = await this.runSingleDetector(projectRoot, 'styling') || undefined;
157
+ // ============ Data Layer ============
158
+ // Run database detector
159
+ stack.database = await this.runSingleDetector(projectRoot, 'database') || undefined;
160
+ // Run ORM detector
161
+ stack.orm = await this.runSingleDetector(projectRoot, 'orm') || undefined;
162
+ // Run API detector (multi-result)
163
+ stack.api = await this.runMultiDetector(projectRoot, 'api') || undefined;
164
+ // ============ Frontend ============
165
+ // Run state management detector
166
+ stack.stateManagement = await this.runSingleDetector(projectRoot, 'stateManagement') || undefined;
167
+ // Run UI components detector (multi-result)
168
+ stack.uiComponents = await this.runMultiDetector(projectRoot, 'uiComponents') || undefined;
169
+ // Run form handling detector (multi-result)
170
+ stack.formHandling = await this.runMultiDetector(projectRoot, 'formHandling') || undefined;
171
+ // ============ Services ============
172
+ // Run auth detector
173
+ stack.auth = await this.runSingleDetector(projectRoot, 'auth') || undefined;
174
+ // Run analytics detector (multi-result)
175
+ stack.analytics = await this.runMultiDetector(projectRoot, 'analytics') || undefined;
176
+ // Run payments detector
177
+ stack.payments = await this.runSingleDetector(projectRoot, 'payments') || undefined;
178
+ // Run email detector
179
+ stack.email = await this.runSingleDetector(projectRoot, 'email') || undefined;
180
+ // ============ Infrastructure ============
181
+ // Run deployment detector (multi-result)
182
+ stack.deployment = await this.runMultiDetector(projectRoot, 'deployment') || undefined;
183
+ // Run monorepo detector
184
+ stack.monorepo = await this.runSingleDetector(projectRoot, 'monorepo') || undefined;
185
+ // ============ MCP ============
186
+ // Run MCP detectors
187
+ const mcpStack = {};
188
+ // Detect configured MCP servers
189
+ const mcpServers = await this.runMultiDetector(projectRoot, 'mcp');
190
+ // Separate MCP server configs from MCP project detection
191
+ if (mcpServers) {
192
+ const serverConfigs = mcpServers.filter(r => r.name.startsWith('MCP:') || r.name === 'MCP Config Directory');
193
+ const projectInfo = mcpServers.find(r => r.name === 'MCP Server Project' || r.name === 'MCP Client');
194
+ if (serverConfigs.length > 0) {
195
+ mcpStack.detected = serverConfigs;
196
+ }
197
+ if (projectInfo) {
198
+ mcpStack.isProject = projectInfo.name === 'MCP Server Project';
199
+ mcpStack.projectInfo = projectInfo;
200
+ }
201
+ }
202
+ // Get recommended MCP servers based on stack
203
+ mcpStack.recommended = getRecommendedMCPServers(projectRoot);
204
+ // Only add MCP stack if there's meaningful data
205
+ if (mcpStack.detected || mcpStack.isProject || (mcpStack.recommended && mcpStack.recommended.length > 0)) {
206
+ stack.mcp = mcpStack;
207
+ }
208
+ return stack;
209
+ }
210
+ }
211
+ /**
212
+ * Create a registry with all core detectors pre-registered
213
+ */
214
+ export function createDefaultRegistry() {
215
+ const registry = new DetectorRegistry();
216
+ // Register core detectors
217
+ registry.register(frameworkDetector);
218
+ registry.register(packageManagerDetector);
219
+ registry.register(testingDetector);
220
+ registry.register(stylingDetector);
221
+ // Register data layer detectors
222
+ registry.register(databaseDetector);
223
+ registry.register(ormDetector);
224
+ registry.register(apiDetector);
225
+ // Register frontend detectors
226
+ registry.register(stateManagementDetector);
227
+ registry.register(uiComponentsDetector);
228
+ registry.register(formHandlingDetector);
229
+ // Register services detectors
230
+ registry.register(authDetector);
231
+ registry.register(analyticsDetector);
232
+ registry.register(paymentsDetector);
233
+ registry.register(emailDetector);
234
+ // Register infrastructure detectors
235
+ registry.register(deploymentDetector);
236
+ registry.register(monorepoDetector);
237
+ // Register MCP detectors
238
+ registry.register(mcpServersDetector);
239
+ registry.register(mcpProjectDetector);
240
+ return registry;
241
+ }
242
+ export { DetectorRegistry as Registry };
243
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/scanner/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Scanner Types
3
+ * Type definitions for the project scanner system
4
+ */
5
+ /**
6
+ * Result of detecting a single technology/tool
7
+ */
8
+ export interface DetectionResult {
9
+ /** Name of the detected technology (e.g., "Next.js", "pnpm") */
10
+ name: string;
11
+ /** Version if detectable from package.json */
12
+ version?: string;
13
+ /** Variant or additional context (e.g., "app-router" for Next.js) */
14
+ variant?: string;
15
+ /** Confidence score from 0-100 */
16
+ confidence: number;
17
+ /** Evidence that led to this detection (files found, deps matched) */
18
+ evidence: string[];
19
+ }
20
+ /**
21
+ * MCP detection result
22
+ */
23
+ export interface MCPStack {
24
+ /** Detected MCP servers from config */
25
+ detected?: DetectionResult[];
26
+ /** Recommended MCP servers based on stack */
27
+ recommended?: string[];
28
+ /** Is this an MCP server project */
29
+ isProject?: boolean;
30
+ /** MCP project detection result (if it's an MCP server project) */
31
+ projectInfo?: DetectionResult;
32
+ }
33
+ /**
34
+ * Complete detected tech stack for a project
35
+ */
36
+ export interface DetectedStack {
37
+ /** Web framework (Next.js, React, Vue, etc.) */
38
+ framework?: DetectionResult;
39
+ /** Package manager (pnpm, yarn, npm, bun) */
40
+ packageManager?: DetectionResult;
41
+ /** Testing frameworks */
42
+ testing?: {
43
+ unit?: DetectionResult;
44
+ e2e?: DetectionResult;
45
+ };
46
+ /** Styling approach (Tailwind, CSS Modules, etc.) */
47
+ styling?: DetectionResult;
48
+ /** Database (Supabase, Firebase, MongoDB, PostgreSQL) */
49
+ database?: DetectionResult;
50
+ /** ORM (Prisma, Drizzle) */
51
+ orm?: DetectionResult;
52
+ /** API patterns (tRPC, GraphQL, TanStack Query, REST) - can have multiple */
53
+ api?: DetectionResult[];
54
+ /** State management (Redux, Zustand, Jotai, Pinia, etc.) */
55
+ stateManagement?: DetectionResult;
56
+ /** UI component libraries (shadcn, Radix, MUI, etc.) - can have multiple */
57
+ uiComponents?: DetectionResult[];
58
+ /** Form handling and validation (React Hook Form, Zod, etc.) - can have multiple */
59
+ formHandling?: DetectionResult[];
60
+ /** Auth provider (NextAuth, Clerk, Auth0, Supabase Auth) */
61
+ auth?: DetectionResult;
62
+ /** Analytics (PostHog, Mixpanel, Vercel Analytics, etc.) - can have multiple */
63
+ analytics?: DetectionResult[];
64
+ /** Payment provider (Stripe, Lemon Squeezy, Paddle) */
65
+ payments?: DetectionResult;
66
+ /** Email provider (Resend, SendGrid, Nodemailer) */
67
+ email?: DetectionResult;
68
+ /** Deployment targets (Vercel, Netlify, Railway, Docker) - can have multiple */
69
+ deployment?: DetectionResult[];
70
+ /** Monorepo tools (Turborepo, Nx, pnpm workspaces, Lerna) */
71
+ monorepo?: DetectionResult;
72
+ /** MCP (Model Context Protocol) related detection */
73
+ mcp?: MCPStack;
74
+ }
75
+ /**
76
+ * Category of detector
77
+ */
78
+ export type DetectorCategory = 'framework' | 'packageManager' | 'testing' | 'styling' | 'database' | 'orm' | 'api' | 'stateManagement' | 'uiComponents' | 'formHandling' | 'auth' | 'analytics' | 'payments' | 'email' | 'deployment' | 'monorepo' | 'mcp';
79
+ /**
80
+ * Interface for a detector function
81
+ */
82
+ export interface Detector {
83
+ /** Category this detector belongs to */
84
+ category: DetectorCategory;
85
+ /** Human-readable name */
86
+ name: string;
87
+ /** Run detection on a project directory */
88
+ detect: (projectRoot: string) => Promise<DetectionResult | DetectionResult[] | null>;
89
+ }
90
+ /**
91
+ * Options for the scanner
92
+ */
93
+ export interface ScannerOptions {
94
+ /** Whether to include low-confidence results */
95
+ includeLowConfidence?: boolean;
96
+ /** Minimum confidence threshold (0-100) */
97
+ minConfidence?: number;
98
+ }
99
+ /**
100
+ * Result of a full project scan
101
+ */
102
+ export interface ScanResult {
103
+ /** Path that was scanned */
104
+ projectRoot: string;
105
+ /** Detected tech stack */
106
+ stack: DetectedStack;
107
+ /** Time taken to scan in milliseconds */
108
+ scanTime: number;
109
+ /** Any errors encountered during scanning */
110
+ errors?: string[];
111
+ }
112
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scanner/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Scanner Types
3
+ * Type definitions for the project scanner system
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/scanner/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,38 @@
1
+ module.exports = {
2
+ name: '{{projectName}}',
3
+ stack: {
4
+ framework: {
5
+ name: '{{framework}}',
6
+ version: '{{frameworkVersion}}',
7
+ variant: '{{frameworkVariant}}',
8
+ },
9
+ packageManager: '{{packageManager}}',
10
+ testing: {
11
+ unit: '{{unitTest}}',
12
+ e2e: '{{e2eTest}}',
13
+ },
14
+ styling: '{{styling}}',
15
+ },
16
+ commands: {
17
+ dev: '{{devCommand}}',
18
+ build: '{{buildCommand}}',
19
+ test: '{{testCommand}}',
20
+ lint: '{{lintCommand}}',
21
+ typecheck: '{{typecheckCommand}}',
22
+ },
23
+ paths: {
24
+ root: '.ralph',
25
+ prompts: '.ralph/prompts',
26
+ guides: '.ralph/guides',
27
+ specs: '.ralph/specs',
28
+ scripts: '.ralph/scripts',
29
+ learnings: '.ralph/LEARNINGS.md',
30
+ agents: '.ralph/AGENTS.md',
31
+ },
32
+ loop: {
33
+ maxIterations: 10,
34
+ maxE2eAttempts: 5,
35
+ defaultModel: 'sonnet',
36
+ planningModel: 'opus',
37
+ },
38
+ };
@@ -0,0 +1,100 @@
1
+ # AGENTS.md
2
+
3
+ ## Stack
4
+ {{framework}}{{#if frameworkVersion}} {{frameworkVersion}}{{/if}}{{#if frameworkVariant}} ({{frameworkVariant}}){{/if}}, TypeScript, {{styling || css}}{{#if unitTest}}, {{unitTest}}{{/if}}{{#if e2eTest}}, {{e2eTest}}{{/if}}
5
+
6
+ ## Commands
7
+ All commands run from `{{appDir}}/` directory:
8
+
9
+ | Action | Command |
10
+ |--------|---------|
11
+ | Dev | `cd {{appDir}} && {{devCommand}}` |
12
+ | Build | `cd {{appDir}} && {{buildCommand}}` |
13
+ | Lint | `cd {{appDir}} && {{lintCommand}}` |
14
+ | Lint fix | `cd {{appDir}} && {{lintCommand}} -- --fix` |
15
+ | Format | `cd {{appDir}} && {{formatCommand}}` |
16
+ | Typecheck | `cd {{appDir}} && {{typecheckCommand}}` |
17
+ {{#if unitTest}}| Test | `cd {{appDir}} && {{testCommand}}` |
18
+ | Test watch | `cd {{appDir}} && {{testCommand}} -- --watch` |{{/if}}
19
+
20
+ ## Validation (run before commit)
21
+ ```bash
22
+ cd {{appDir}} && {{lintCommand}} -- --fix && {{typecheckCommand}}{{#if unitTest}} && {{testCommand}}{{/if}} && {{buildCommand}}
23
+ ```
24
+
25
+ ## Security Review (run before commit)
26
+ ```bash
27
+ cd {{appDir}} && {{packageManager}} audit # Check vulnerable dependencies
28
+ ```
29
+ Then review changes against @.ralph/guides/SECURITY.md checklist.
30
+ Use `mcp__supabase__get_advisors` with type "security" to check RLS policies.
31
+
32
+ ## Patterns
33
+ - Pages: `{{appDir}}/app/` - Next.js App Router
34
+ - Components: `{{appDir}}/components/` - see ui/, ai-elements/, survey-editor/
35
+ - API: `{{appDir}}/app/api/` - streaming endpoints with tool calling
36
+ - Store: `{{appDir}}/store/` - State management
37
+ - Server Actions: `{{appDir}}/app/actions.ts` and `{{appDir}}/app/actions/`
38
+ - Libs: `{{appDir}}/lib/` - utilities and integrations
39
+
40
+ ## Search Tools
41
+ - **Codebase search**: Use `mgrep "query"` (preferred over Grep/Glob)
42
+ - **Documentation lookup**: Use Context7 MCP for library/framework docs
43
+ - **Web search**: Use `mgrep --web "query"` for general web lookups
44
+
45
+ ## Code Rules
46
+ - Explicit return types on functions
47
+ - No `any` - use `unknown` if truly unknown
48
+ - Early returns over nested conditionals
49
+ - Named exports, not default exports
50
+ - Path alias `@/` maps to `{{appDir}}/` root
51
+ - Follow patterns in existing components
52
+ - 2-space indentation, single quotes
53
+ - PascalCase for components, `use` prefix for hooks
54
+ - kebab-case for folder names (e.g., `survey-editor`)
55
+
56
+ {{#if unitTest}}## Testing
57
+ - Framework: {{unitTest}}{{#if unitTestVersion}} {{unitTestVersion}}{{/if}}
58
+ - Test location: next to component as `*.test.tsx` or in `__tests__/`
59
+ - Run: `cd {{appDir}} && {{testCommand}}`
60
+ - Each feature task should include tests
61
+ - Validation fails if tests fail
62
+ {{/if}}
63
+
64
+ ## Secrets
65
+ - Use `.env.local` for secrets, never commit API keys
66
+ - Use `process.env.*` for all secrets
67
+
68
+ ## Git
69
+ - Commits: `type(scope): description` (conventional commits)
70
+ - Types: feat, fix, docs, refactor, test, chore
71
+ - After changes: validate, commit, push
72
+
73
+ ## MCP Servers Available
74
+ - **Supabase**: Query DB, manage migrations, generate types
75
+ - **PostHog**: Analytics, feature flags, experiments
76
+ - **Playwright**: Browser automation for E2E testing
77
+ - Navigate: `browser_navigate`, `browser_snapshot`
78
+ - Interact: `browser_click`, `browser_type`, `browser_fill_form`
79
+ - Verify: `browser_wait_for`, `browser_console_messages`
80
+ - Debug: `browser_take_screenshot`
81
+ - **Codex CLI** (shell command, not MCP): PR review
82
+ - Command: `echo "prompt" | codex exec --full-auto -`
83
+ - For reviews: `codex review --base main` (interactive mode)
84
+ - Location: `/opt/homebrew/bin/codex`
85
+ - Use for: code review, PR feedback before merge
86
+ - **Context7**: Documentation lookup for libraries/frameworks
87
+
88
+ ## Quick Triggers
89
+ | Keywords | Action |
90
+ |----------|--------|
91
+ | type error, ts | Run typecheck |
92
+ | lint, format | Run lint --fix and prettier |
93
+ | deploy, build | Run full build |
94
+ | error, debug | Check PostHog logs or console |
95
+ | database, table | Use Supabase MCP |
96
+ | e2e, browser test | Use Playwright MCP |
97
+
98
+ ## Detailed Docs
99
+ - Architecture: `{{appDir}}/.claude/CLAUDE.md` - comprehensive codebase details
100
+ - Frontend: `.ralph/guides/FRONTEND.md` - design patterns, component usage, quality checklist