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,285 @@
1
+ /**
2
+ * UI Components Detector
3
+ * Detects: shadcn, Radix, MUI, Chakra, Ant Design, Headless UI
4
+ */
5
+ import { existsSync, readFileSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ /**
8
+ * Read and parse package.json from a directory
9
+ */
10
+ function readPackageJson(projectRoot) {
11
+ const packageJsonPath = join(projectRoot, 'package.json');
12
+ if (!existsSync(packageJsonPath)) {
13
+ return null;
14
+ }
15
+ try {
16
+ const content = readFileSync(packageJsonPath, 'utf-8');
17
+ return JSON.parse(content);
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ /**
24
+ * Get all dependencies from package.json (deps + devDeps)
25
+ */
26
+ function getDependencies(pkg) {
27
+ const deps = pkg.dependencies || {};
28
+ const devDeps = pkg.devDependencies || {};
29
+ return { ...deps, ...devDeps };
30
+ }
31
+ /**
32
+ * Find all matching dependencies by pattern
33
+ */
34
+ function findMatchingDeps(deps, pattern) {
35
+ return Object.keys(deps).filter(name => name.startsWith(pattern));
36
+ }
37
+ /**
38
+ * Detect shadcn/ui
39
+ */
40
+ function detectShadcn(projectRoot, deps) {
41
+ const evidence = [];
42
+ let confidence = 0;
43
+ // Check for components.json (shadcn config file)
44
+ const componentsJsonPath = join(projectRoot, 'components.json');
45
+ if (existsSync(componentsJsonPath)) {
46
+ evidence.push('components.json found');
47
+ confidence += 60;
48
+ // Try to read and validate it's a shadcn config
49
+ try {
50
+ const content = readFileSync(componentsJsonPath, 'utf-8');
51
+ const config = JSON.parse(content);
52
+ if (config.style || config.rsc || config.tsx || config.components) {
53
+ evidence.push('Valid shadcn/ui configuration detected');
54
+ confidence += 20;
55
+ }
56
+ }
57
+ catch {
58
+ // File exists but couldn't be parsed
59
+ }
60
+ }
61
+ // Check for @radix-ui/* packages (shadcn uses Radix primitives)
62
+ const radixPackages = findMatchingDeps(deps, '@radix-ui/');
63
+ if (radixPackages.length >= 3) {
64
+ evidence.push(`Multiple @radix-ui packages found (${radixPackages.length})`);
65
+ confidence += 20;
66
+ }
67
+ // Check for class-variance-authority (commonly used with shadcn)
68
+ if (deps['class-variance-authority']) {
69
+ evidence.push('class-variance-authority detected (common with shadcn)');
70
+ confidence += 10;
71
+ }
72
+ // Check for clsx or tailwind-merge (common utilities with shadcn)
73
+ if (deps.clsx || deps['tailwind-merge']) {
74
+ evidence.push('clsx/tailwind-merge utilities detected');
75
+ confidence += 5;
76
+ }
77
+ if (confidence === 0)
78
+ return null;
79
+ return {
80
+ name: 'shadcn/ui',
81
+ confidence: Math.min(confidence, 100),
82
+ evidence,
83
+ };
84
+ }
85
+ /**
86
+ * Detect Radix UI (standalone, not as part of shadcn)
87
+ */
88
+ function detectRadix(projectRoot, deps) {
89
+ const evidence = [];
90
+ let confidence = 0;
91
+ // Check for @radix-ui/* packages
92
+ const radixPackages = findMatchingDeps(deps, '@radix-ui/');
93
+ if (radixPackages.length > 0) {
94
+ evidence.push(`@radix-ui packages found: ${radixPackages.slice(0, 5).join(', ')}${radixPackages.length > 5 ? '...' : ''}`);
95
+ confidence += 50 + Math.min(radixPackages.length * 5, 30);
96
+ }
97
+ // Check for @radix-ui/themes (full theme package)
98
+ if (deps['@radix-ui/themes']) {
99
+ evidence.push('@radix-ui/themes found');
100
+ confidence += 20;
101
+ }
102
+ if (confidence === 0)
103
+ return null;
104
+ return {
105
+ name: 'Radix UI',
106
+ confidence: Math.min(confidence, 100),
107
+ evidence,
108
+ };
109
+ }
110
+ /**
111
+ * Detect Material UI (MUI)
112
+ */
113
+ function detectMUI(deps) {
114
+ const evidence = [];
115
+ let confidence = 0;
116
+ // Check for @mui/material
117
+ if (deps['@mui/material']) {
118
+ evidence.push(`@mui/material@${deps['@mui/material']} in dependencies`);
119
+ confidence += 70;
120
+ }
121
+ // Check for @mui/icons-material
122
+ if (deps['@mui/icons-material']) {
123
+ evidence.push('@mui/icons-material found');
124
+ confidence += 10;
125
+ }
126
+ // Check for @mui/x-* (data grid, date pickers, etc.)
127
+ const muiXPackages = findMatchingDeps(deps, '@mui/x-');
128
+ if (muiXPackages.length > 0) {
129
+ evidence.push(`MUI X packages found: ${muiXPackages.join(', ')}`);
130
+ confidence += 10;
131
+ }
132
+ // Check for @emotion (MUI's default styling)
133
+ if (deps['@emotion/react'] || deps['@emotion/styled']) {
134
+ evidence.push('Emotion styling detected (MUI default)');
135
+ confidence += 10;
136
+ }
137
+ if (confidence === 0)
138
+ return null;
139
+ return {
140
+ name: 'MUI',
141
+ version: deps['@mui/material'],
142
+ confidence: Math.min(confidence, 100),
143
+ evidence,
144
+ };
145
+ }
146
+ /**
147
+ * Detect Chakra UI
148
+ */
149
+ function detectChakra(deps) {
150
+ const evidence = [];
151
+ let confidence = 0;
152
+ // Check for @chakra-ui/react
153
+ if (deps['@chakra-ui/react']) {
154
+ evidence.push(`@chakra-ui/react@${deps['@chakra-ui/react']} in dependencies`);
155
+ confidence += 80;
156
+ }
157
+ // Check for @chakra-ui/* packages
158
+ const chakraPackages = findMatchingDeps(deps, '@chakra-ui/');
159
+ if (chakraPackages.length > 1) {
160
+ evidence.push(`Multiple Chakra packages found (${chakraPackages.length})`);
161
+ confidence += 10;
162
+ }
163
+ if (confidence === 0)
164
+ return null;
165
+ return {
166
+ name: 'Chakra UI',
167
+ version: deps['@chakra-ui/react'],
168
+ confidence: Math.min(confidence, 100),
169
+ evidence,
170
+ };
171
+ }
172
+ /**
173
+ * Detect Ant Design
174
+ */
175
+ function detectAntDesign(deps) {
176
+ const evidence = [];
177
+ let confidence = 0;
178
+ if (deps.antd) {
179
+ evidence.push(`antd@${deps.antd} in dependencies`);
180
+ confidence += 80;
181
+ }
182
+ // Check for @ant-design/* packages
183
+ const antPackages = findMatchingDeps(deps, '@ant-design/');
184
+ if (antPackages.length > 0) {
185
+ evidence.push(`Ant Design packages found: ${antPackages.join(', ')}`);
186
+ confidence += 10;
187
+ }
188
+ if (confidence === 0)
189
+ return null;
190
+ return {
191
+ name: 'Ant Design',
192
+ version: deps.antd,
193
+ confidence: Math.min(confidence, 100),
194
+ evidence,
195
+ };
196
+ }
197
+ /**
198
+ * Detect Headless UI
199
+ */
200
+ function detectHeadlessUI(deps) {
201
+ const evidence = [];
202
+ let confidence = 0;
203
+ // Check for @headlessui/react
204
+ if (deps['@headlessui/react']) {
205
+ evidence.push(`@headlessui/react@${deps['@headlessui/react']} in dependencies`);
206
+ confidence += 80;
207
+ }
208
+ // Check for @headlessui/vue
209
+ if (deps['@headlessui/vue']) {
210
+ evidence.push(`@headlessui/vue@${deps['@headlessui/vue']} in dependencies`);
211
+ confidence += 80;
212
+ }
213
+ if (confidence === 0)
214
+ return null;
215
+ return {
216
+ name: 'Headless UI',
217
+ version: deps['@headlessui/react'] || deps['@headlessui/vue'],
218
+ confidence: Math.min(confidence, 100),
219
+ evidence,
220
+ };
221
+ }
222
+ /**
223
+ * Detect daisyUI
224
+ */
225
+ function detectDaisyUI(deps) {
226
+ const evidence = [];
227
+ let confidence = 0;
228
+ if (deps.daisyui) {
229
+ evidence.push(`daisyui@${deps.daisyui} in dependencies`);
230
+ confidence += 80;
231
+ }
232
+ if (confidence === 0)
233
+ return null;
234
+ return {
235
+ name: 'daisyUI',
236
+ version: deps.daisyui,
237
+ confidence: Math.min(confidence, 100),
238
+ evidence,
239
+ };
240
+ }
241
+ /**
242
+ * UI Components detector
243
+ * Returns all detected UI libraries (projects often use multiple)
244
+ */
245
+ export const uiComponentsDetector = {
246
+ category: 'uiComponents',
247
+ name: 'UI Components Detector',
248
+ async detect(projectRoot) {
249
+ const pkg = readPackageJson(projectRoot);
250
+ if (!pkg) {
251
+ return null;
252
+ }
253
+ const deps = getDependencies(pkg);
254
+ const results = [];
255
+ // Check for shadcn first (it uses Radix under the hood)
256
+ const shadcn = detectShadcn(projectRoot, deps);
257
+ if (shadcn && shadcn.confidence >= 40) {
258
+ results.push(shadcn);
259
+ }
260
+ // Only add Radix as separate if not using shadcn
261
+ if (!shadcn || shadcn.confidence < 40) {
262
+ const radix = detectRadix(projectRoot, deps);
263
+ if (radix && radix.confidence >= 40) {
264
+ results.push(radix);
265
+ }
266
+ }
267
+ // Check other UI libraries
268
+ const detectors = [
269
+ () => detectMUI(deps),
270
+ () => detectChakra(deps),
271
+ () => detectAntDesign(deps),
272
+ () => detectHeadlessUI(deps),
273
+ () => detectDaisyUI(deps),
274
+ ];
275
+ for (const detector of detectors) {
276
+ const result = detector();
277
+ if (result && result.confidence >= 40) {
278
+ results.push(result);
279
+ }
280
+ }
281
+ return results.length > 0 ? results : null;
282
+ },
283
+ };
284
+ export default uiComponentsDetector;
285
+ //# sourceMappingURL=uiComponents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uiComponents.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/frontend/uiComponents.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Deployment Target Detector
3
+ * Detects: Vercel, Netlify, Railway, Docker
4
+ */
5
+ import type { Detector } from '../../types.js';
6
+ /**
7
+ * Deployment target detector
8
+ * Returns all detected deployment targets (projects can deploy to multiple)
9
+ */
10
+ export declare const deploymentDetector: Detector;
11
+ export default deploymentDetector;
12
+ //# sourceMappingURL=deployment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/infra/deployment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AA6ShE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QA4BhC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,301 @@
1
+ /**
2
+ * Deployment Target Detector
3
+ * Detects: Vercel, Netlify, Railway, Docker
4
+ */
5
+ import { existsSync, readFileSync } from 'node:fs';
6
+ import { join } from 'node:path';
7
+ /**
8
+ * Read and parse package.json from a directory
9
+ */
10
+ function readPackageJson(projectRoot) {
11
+ const packageJsonPath = join(projectRoot, 'package.json');
12
+ if (!existsSync(packageJsonPath)) {
13
+ return null;
14
+ }
15
+ try {
16
+ const content = readFileSync(packageJsonPath, 'utf-8');
17
+ return JSON.parse(content);
18
+ }
19
+ catch {
20
+ return null;
21
+ }
22
+ }
23
+ /**
24
+ * Get all dependencies from package.json (deps + devDeps)
25
+ */
26
+ function getDependencies(pkg) {
27
+ const deps = pkg.dependencies || {};
28
+ const devDeps = pkg.devDependencies || {};
29
+ return { ...deps, ...devDeps };
30
+ }
31
+ /**
32
+ * Find all matching dependencies by pattern
33
+ */
34
+ function findMatchingDeps(deps, pattern) {
35
+ return Object.keys(deps).filter(name => name.startsWith(pattern));
36
+ }
37
+ /**
38
+ * Detect Vercel deployment
39
+ */
40
+ function detectVercel(projectRoot, deps) {
41
+ const evidence = [];
42
+ let confidence = 0;
43
+ // Check for vercel.json
44
+ const vercelJson = join(projectRoot, 'vercel.json');
45
+ if (existsSync(vercelJson)) {
46
+ evidence.push('vercel.json found');
47
+ confidence += 50;
48
+ }
49
+ // Check for .vercel directory
50
+ const vercelDir = join(projectRoot, '.vercel');
51
+ if (existsSync(vercelDir)) {
52
+ evidence.push('.vercel/ directory found');
53
+ confidence += 30;
54
+ }
55
+ // Check for @vercel/* packages
56
+ const vercelPackages = findMatchingDeps(deps, '@vercel/');
57
+ if (vercelPackages.length > 0) {
58
+ evidence.push(`Vercel packages found: ${vercelPackages.join(', ')}`);
59
+ confidence += 30;
60
+ }
61
+ // Check for vercel CLI
62
+ if (deps.vercel) {
63
+ evidence.push('vercel CLI in devDependencies');
64
+ confidence += 20;
65
+ }
66
+ if (confidence === 0)
67
+ return null;
68
+ return {
69
+ name: 'Vercel',
70
+ confidence: Math.min(confidence, 100),
71
+ evidence,
72
+ };
73
+ }
74
+ /**
75
+ * Detect Netlify deployment
76
+ */
77
+ function detectNetlify(projectRoot, deps) {
78
+ const evidence = [];
79
+ let confidence = 0;
80
+ // Check for netlify.toml
81
+ const netlifyToml = join(projectRoot, 'netlify.toml');
82
+ if (existsSync(netlifyToml)) {
83
+ evidence.push('netlify.toml found');
84
+ confidence += 60;
85
+ }
86
+ // Check for .netlify directory
87
+ const netlifyDir = join(projectRoot, '.netlify');
88
+ if (existsSync(netlifyDir)) {
89
+ evidence.push('.netlify/ directory found');
90
+ confidence += 30;
91
+ }
92
+ // Check for netlify-cli
93
+ if (deps['netlify-cli']) {
94
+ evidence.push('netlify-cli in devDependencies');
95
+ confidence += 20;
96
+ }
97
+ // Check for @netlify/* packages
98
+ const netlifyPackages = findMatchingDeps(deps, '@netlify/');
99
+ if (netlifyPackages.length > 0) {
100
+ evidence.push(`Netlify packages found: ${netlifyPackages.join(', ')}`);
101
+ confidence += 20;
102
+ }
103
+ if (confidence === 0)
104
+ return null;
105
+ return {
106
+ name: 'Netlify',
107
+ confidence: Math.min(confidence, 100),
108
+ evidence,
109
+ };
110
+ }
111
+ /**
112
+ * Detect Railway deployment
113
+ */
114
+ function detectRailway(projectRoot) {
115
+ const evidence = [];
116
+ let confidence = 0;
117
+ // Check for railway.json
118
+ const railwayJson = join(projectRoot, 'railway.json');
119
+ if (existsSync(railwayJson)) {
120
+ evidence.push('railway.json found');
121
+ confidence += 70;
122
+ }
123
+ // Check for railway.toml
124
+ const railwayToml = join(projectRoot, 'railway.toml');
125
+ if (existsSync(railwayToml)) {
126
+ evidence.push('railway.toml found');
127
+ confidence += 70;
128
+ }
129
+ if (confidence === 0)
130
+ return null;
131
+ return {
132
+ name: 'Railway',
133
+ confidence: Math.min(confidence, 100),
134
+ evidence,
135
+ };
136
+ }
137
+ /**
138
+ * Detect Docker deployment
139
+ */
140
+ function detectDocker(projectRoot) {
141
+ const evidence = [];
142
+ let confidence = 0;
143
+ let variant;
144
+ // Check for Dockerfile
145
+ const dockerfile = join(projectRoot, 'Dockerfile');
146
+ if (existsSync(dockerfile)) {
147
+ evidence.push('Dockerfile found');
148
+ confidence += 50;
149
+ }
150
+ // Check for docker-compose files
151
+ const composeFiles = [
152
+ 'docker-compose.yml',
153
+ 'docker-compose.yaml',
154
+ 'compose.yml',
155
+ 'compose.yaml',
156
+ ];
157
+ for (const file of composeFiles) {
158
+ if (existsSync(join(projectRoot, file))) {
159
+ evidence.push(`${file} found`);
160
+ confidence += 40;
161
+ variant = 'compose';
162
+ break;
163
+ }
164
+ }
165
+ // Check for .dockerignore
166
+ const dockerignore = join(projectRoot, '.dockerignore');
167
+ if (existsSync(dockerignore)) {
168
+ evidence.push('.dockerignore found');
169
+ confidence += 10;
170
+ }
171
+ if (confidence === 0)
172
+ return null;
173
+ return {
174
+ name: 'Docker',
175
+ variant,
176
+ confidence: Math.min(confidence, 100),
177
+ evidence,
178
+ };
179
+ }
180
+ /**
181
+ * Detect Fly.io deployment
182
+ */
183
+ function detectFly(projectRoot) {
184
+ const evidence = [];
185
+ let confidence = 0;
186
+ // Check for fly.toml
187
+ const flyToml = join(projectRoot, 'fly.toml');
188
+ if (existsSync(flyToml)) {
189
+ evidence.push('fly.toml found');
190
+ confidence += 80;
191
+ }
192
+ if (confidence === 0)
193
+ return null;
194
+ return {
195
+ name: 'Fly.io',
196
+ confidence: Math.min(confidence, 100),
197
+ evidence,
198
+ };
199
+ }
200
+ /**
201
+ * Detect Render deployment
202
+ */
203
+ function detectRender(projectRoot) {
204
+ const evidence = [];
205
+ let confidence = 0;
206
+ // Check for render.yaml
207
+ const renderYaml = join(projectRoot, 'render.yaml');
208
+ if (existsSync(renderYaml)) {
209
+ evidence.push('render.yaml found');
210
+ confidence += 80;
211
+ }
212
+ if (confidence === 0)
213
+ return null;
214
+ return {
215
+ name: 'Render',
216
+ confidence: Math.min(confidence, 100),
217
+ evidence,
218
+ };
219
+ }
220
+ /**
221
+ * Detect AWS deployment
222
+ */
223
+ function detectAWS(projectRoot, deps) {
224
+ const evidence = [];
225
+ let confidence = 0;
226
+ let variant;
227
+ // Check for AWS SAM template
228
+ const samTemplate = join(projectRoot, 'template.yaml');
229
+ if (existsSync(samTemplate)) {
230
+ try {
231
+ const content = readFileSync(samTemplate, 'utf-8');
232
+ if (content.includes('AWS::Serverless') || content.includes('AWSTemplateFormatVersion')) {
233
+ evidence.push('AWS SAM template.yaml found');
234
+ confidence += 70;
235
+ variant = 'sam';
236
+ }
237
+ }
238
+ catch {
239
+ // Ignore read errors
240
+ }
241
+ }
242
+ // Check for serverless.yml (Serverless Framework)
243
+ const serverlessYml = join(projectRoot, 'serverless.yml');
244
+ const serverlessYaml = join(projectRoot, 'serverless.yaml');
245
+ if (existsSync(serverlessYml) || existsSync(serverlessYaml)) {
246
+ evidence.push('serverless.yml found');
247
+ confidence += 60;
248
+ variant = 'serverless-framework';
249
+ }
250
+ // Check for AWS CDK
251
+ if (deps['aws-cdk-lib'] || deps['@aws-cdk/core']) {
252
+ evidence.push('AWS CDK detected');
253
+ confidence += 60;
254
+ variant = 'cdk';
255
+ }
256
+ // Check for SST
257
+ if (deps.sst) {
258
+ evidence.push(`sst@${deps.sst} in dependencies`);
259
+ confidence += 70;
260
+ variant = 'sst';
261
+ }
262
+ if (confidence === 0)
263
+ return null;
264
+ return {
265
+ name: 'AWS',
266
+ variant,
267
+ confidence: Math.min(confidence, 100),
268
+ evidence,
269
+ };
270
+ }
271
+ /**
272
+ * Deployment target detector
273
+ * Returns all detected deployment targets (projects can deploy to multiple)
274
+ */
275
+ export const deploymentDetector = {
276
+ category: 'deployment',
277
+ name: 'Deployment Target Detector',
278
+ async detect(projectRoot) {
279
+ const pkg = readPackageJson(projectRoot);
280
+ const deps = pkg ? getDependencies(pkg) : {};
281
+ const results = [];
282
+ const detectors = [
283
+ () => detectVercel(projectRoot, deps),
284
+ () => detectNetlify(projectRoot, deps),
285
+ () => detectRailway(projectRoot),
286
+ () => detectDocker(projectRoot),
287
+ () => detectFly(projectRoot),
288
+ () => detectRender(projectRoot),
289
+ () => detectAWS(projectRoot, deps),
290
+ ];
291
+ for (const detector of detectors) {
292
+ const result = detector();
293
+ if (result && result.confidence >= 40) {
294
+ results.push(result);
295
+ }
296
+ }
297
+ return results.length > 0 ? results : null;
298
+ },
299
+ };
300
+ export default deploymentDetector;
301
+ //# sourceMappingURL=deployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/infra/deployment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Monorepo Tool Detector
3
+ * Detects: Turborepo, Nx, pnpm workspaces, Lerna
4
+ */
5
+ import type { Detector } from '../../types.js';
6
+ /**
7
+ * Monorepo tool detector
8
+ * Returns the primary monorepo tool detected
9
+ */
10
+ export declare const monorepoDetector: Detector;
11
+ export default monorepoDetector;
12
+ //# sourceMappingURL=monorepo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monorepo.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/infra/monorepo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AA6MhE;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAgC9B,CAAC;AAEF,eAAe,gBAAgB,CAAC"}