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,219 @@
1
+ /**
2
+ * Monorepo Tool Detector
3
+ * Detects: Turborepo, Nx, pnpm workspaces, Lerna
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
+ * Detect Turborepo
33
+ */
34
+ function detectTurborepo(projectRoot, deps) {
35
+ const evidence = [];
36
+ let confidence = 0;
37
+ // Check for turbo.json
38
+ const turboJson = join(projectRoot, 'turbo.json');
39
+ if (existsSync(turboJson)) {
40
+ evidence.push('turbo.json found');
41
+ confidence += 60;
42
+ }
43
+ // Check for turbo in dependencies
44
+ if (deps.turbo) {
45
+ evidence.push(`turbo@${deps.turbo} in devDependencies`);
46
+ confidence += 40;
47
+ }
48
+ if (confidence === 0)
49
+ return null;
50
+ return {
51
+ name: 'Turborepo',
52
+ version: deps.turbo,
53
+ confidence: Math.min(confidence, 100),
54
+ evidence,
55
+ };
56
+ }
57
+ /**
58
+ * Detect Nx
59
+ */
60
+ function detectNx(projectRoot, deps) {
61
+ const evidence = [];
62
+ let confidence = 0;
63
+ // Check for nx.json
64
+ const nxJson = join(projectRoot, 'nx.json');
65
+ if (existsSync(nxJson)) {
66
+ evidence.push('nx.json found');
67
+ confidence += 60;
68
+ }
69
+ // Check for nx in dependencies
70
+ if (deps.nx) {
71
+ evidence.push(`nx@${deps.nx} in devDependencies`);
72
+ confidence += 40;
73
+ }
74
+ // Check for @nrwl/* packages (older Nx packages)
75
+ if (deps['@nrwl/workspace'] || deps['@nx/workspace']) {
76
+ evidence.push('Nx workspace package found');
77
+ confidence += 20;
78
+ }
79
+ if (confidence === 0)
80
+ return null;
81
+ return {
82
+ name: 'Nx',
83
+ version: deps.nx,
84
+ confidence: Math.min(confidence, 100),
85
+ evidence,
86
+ };
87
+ }
88
+ /**
89
+ * Detect pnpm workspaces
90
+ */
91
+ function detectPnpmWorkspaces(projectRoot) {
92
+ const evidence = [];
93
+ let confidence = 0;
94
+ // Check for pnpm-workspace.yaml
95
+ const pnpmWorkspace = join(projectRoot, 'pnpm-workspace.yaml');
96
+ if (existsSync(pnpmWorkspace)) {
97
+ evidence.push('pnpm-workspace.yaml found');
98
+ confidence += 80;
99
+ }
100
+ if (confidence === 0)
101
+ return null;
102
+ return {
103
+ name: 'pnpm Workspaces',
104
+ confidence: Math.min(confidence, 100),
105
+ evidence,
106
+ };
107
+ }
108
+ /**
109
+ * Detect npm/yarn workspaces
110
+ */
111
+ function detectNpmYarnWorkspaces(projectRoot, pkg) {
112
+ const evidence = [];
113
+ let confidence = 0;
114
+ let variant;
115
+ // Check for workspaces field in package.json
116
+ if (pkg.workspaces) {
117
+ evidence.push('workspaces field in package.json');
118
+ confidence += 70;
119
+ // Determine if it's yarn or npm based on lock files
120
+ const yarnLock = join(projectRoot, 'yarn.lock');
121
+ const npmLock = join(projectRoot, 'package-lock.json');
122
+ if (existsSync(yarnLock)) {
123
+ variant = 'yarn';
124
+ evidence.push('yarn.lock found');
125
+ }
126
+ else if (existsSync(npmLock)) {
127
+ variant = 'npm';
128
+ evidence.push('package-lock.json found');
129
+ }
130
+ }
131
+ if (confidence === 0)
132
+ return null;
133
+ return {
134
+ name: variant === 'yarn' ? 'Yarn Workspaces' : 'npm Workspaces',
135
+ variant,
136
+ confidence: Math.min(confidence, 100),
137
+ evidence,
138
+ };
139
+ }
140
+ /**
141
+ * Detect Lerna
142
+ */
143
+ function detectLerna(projectRoot, deps) {
144
+ const evidence = [];
145
+ let confidence = 0;
146
+ // Check for lerna.json
147
+ const lernaJson = join(projectRoot, 'lerna.json');
148
+ if (existsSync(lernaJson)) {
149
+ evidence.push('lerna.json found');
150
+ confidence += 70;
151
+ }
152
+ // Check for lerna in dependencies
153
+ if (deps.lerna) {
154
+ evidence.push(`lerna@${deps.lerna} in devDependencies`);
155
+ confidence += 30;
156
+ }
157
+ if (confidence === 0)
158
+ return null;
159
+ return {
160
+ name: 'Lerna',
161
+ version: deps.lerna,
162
+ confidence: Math.min(confidence, 100),
163
+ evidence,
164
+ };
165
+ }
166
+ /**
167
+ * Detect Rush
168
+ */
169
+ function detectRush(projectRoot) {
170
+ const evidence = [];
171
+ let confidence = 0;
172
+ // Check for rush.json
173
+ const rushJson = join(projectRoot, 'rush.json');
174
+ if (existsSync(rushJson)) {
175
+ evidence.push('rush.json found');
176
+ confidence += 80;
177
+ }
178
+ if (confidence === 0)
179
+ return null;
180
+ return {
181
+ name: 'Rush',
182
+ confidence: Math.min(confidence, 100),
183
+ evidence,
184
+ };
185
+ }
186
+ /**
187
+ * Monorepo tool detector
188
+ * Returns the primary monorepo tool detected
189
+ */
190
+ export const monorepoDetector = {
191
+ category: 'monorepo',
192
+ name: 'Monorepo Tool Detector',
193
+ async detect(projectRoot) {
194
+ const pkg = readPackageJson(projectRoot);
195
+ const deps = pkg ? getDependencies(pkg) : {};
196
+ // Priority: dedicated monorepo tools first, then workspace configs
197
+ const detectors = [
198
+ () => detectTurborepo(projectRoot, deps),
199
+ () => detectNx(projectRoot, deps),
200
+ () => detectLerna(projectRoot, deps),
201
+ () => detectRush(projectRoot),
202
+ () => detectPnpmWorkspaces(projectRoot),
203
+ () => pkg ? detectNpmYarnWorkspaces(projectRoot, pkg) : null,
204
+ ];
205
+ // Find the highest confidence result
206
+ let bestResult = null;
207
+ let bestConfidence = 0;
208
+ for (const detector of detectors) {
209
+ const result = detector();
210
+ if (result && result.confidence > bestConfidence) {
211
+ bestResult = result;
212
+ bestConfidence = result.confidence;
213
+ }
214
+ }
215
+ return bestResult && bestResult.confidence >= 40 ? bestResult : null;
216
+ },
217
+ };
218
+ export default monorepoDetector;
219
+ //# sourceMappingURL=monorepo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monorepo.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/infra/monorepo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC;;GAEG;AACH,SAAS,eAAe,CAAC,WAAmB;IAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC1D,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,GAA4B;IACnD,MAAM,IAAI,GAAI,GAAG,CAAC,YAAuC,IAAI,EAAE,CAAC;IAChE,MAAM,OAAO,GAAI,GAAG,CAAC,eAA0C,IAAI,EAAE,CAAC;IACtE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;AACjC,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,WAAmB,EAAE,IAA4B;IACxE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,uBAAuB;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClC,UAAU,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,kCAAkC;IAClC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,qBAAqB,CAAC,CAAC;QACxD,UAAU,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,IAAI,CAAC,KAAK;QACnB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;QACrC,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,QAAQ,CAAC,WAAmB,EAAE,IAA4B;IACjE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;IAC5C,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/B,UAAU,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,+BAA+B;IAC/B,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACZ,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,qBAAqB,CAAC,CAAC;QAClD,UAAU,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,iDAAiD;IACjD,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QAC5C,UAAU,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,OAAO;QACL,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,IAAI,CAAC,EAAE;QAChB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;QACrC,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,WAAmB;IAC/C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,gCAAgC;IAChC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IAC/D,IAAI,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC9B,QAAQ,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAC3C,UAAU,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;QACrC,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,WAAmB,EAAE,GAA4B;IAChF,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,OAA2B,CAAC;IAEhC,6CAA6C;IAC7C,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAClD,UAAU,IAAI,EAAE,CAAC;QAEjB,oDAAoD;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,CAAC;QAEvD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzB,OAAO,GAAG,MAAM,CAAC;YACjB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACnC,CAAC;aAAM,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YAC/B,OAAO,GAAG,KAAK,CAAC;YAChB,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,OAAO;QACL,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,gBAAgB;QAC/D,OAAO;QACP,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;QACrC,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,WAAmB,EAAE,IAA4B;IACpE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,uBAAuB;IACvB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAClC,UAAU,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,kCAAkC;IAClC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,KAAK,qBAAqB,CAAC,CAAC;QACxD,UAAU,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,OAAO;QACL,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,IAAI,CAAC,KAAK;QACnB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;QACrC,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,WAAmB;IACrC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,sBAAsB;IACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAChD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACjC,UAAU,IAAI,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC;QACrC,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAa;IACxC,QAAQ,EAAE,UAAU;IACpB,IAAI,EAAE,wBAAwB;IAE9B,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,GAAG,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;QACzC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE7C,mEAAmE;QACnE,MAAM,SAAS,GAAG;YAChB,GAAG,EAAE,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC;YACxC,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC;YACjC,GAAG,EAAE,CAAC,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC;YACpC,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;YAC7B,GAAG,EAAE,CAAC,oBAAoB,CAAC,WAAW,CAAC;YACvC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,uBAAuB,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI;SAC7D,CAAC;QAEF,qCAAqC;QACrC,IAAI,UAAU,GAA2B,IAAI,CAAC;QAC9C,IAAI,cAAc,GAAG,CAAC,CAAC;QAEvB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;YAC1B,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,GAAG,cAAc,EAAE,CAAC;gBACjD,UAAU,GAAG,MAAM,CAAC;gBACpB,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC;YACrC,CAAC;QACH,CAAC;QAED,OAAO,UAAU,IAAI,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IACvE,CAAC;CACF,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * MCP Project Detector
3
+ * Detects if the project is building an MCP server
4
+ */
5
+ import type { Detector } from '../../types.js';
6
+ /**
7
+ * MCP project detector
8
+ * Detects if the project is an MCP server or uses MCP
9
+ */
10
+ export declare const mcpProjectDetector: Detector;
11
+ export default mcpProjectDetector;
12
+ //# sourceMappingURL=mcpProject.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpProject.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/mcp/mcpProject.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAwIhE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QA0BhC,CAAC;AAEF,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * MCP Project Detector
3
+ * Detects if the project is building an MCP server
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
+ * Detect if project is an MCP server
33
+ */
34
+ function detectMCPServer(projectRoot, pkg, deps) {
35
+ const evidence = [];
36
+ let confidence = 0;
37
+ // Check for @modelcontextprotocol/sdk
38
+ if (deps['@modelcontextprotocol/sdk']) {
39
+ evidence.push(`@modelcontextprotocol/sdk@${deps['@modelcontextprotocol/sdk']} in dependencies`);
40
+ confidence += 70;
41
+ }
42
+ // Check for mcp-* or *-mcp in package name
43
+ const packageName = pkg.name;
44
+ if (packageName) {
45
+ if (packageName.startsWith('mcp-') || packageName.endsWith('-mcp')) {
46
+ evidence.push(`Package name "${packageName}" follows MCP naming convention`);
47
+ confidence += 20;
48
+ }
49
+ if (packageName.includes('mcp-server') || packageName.includes('server-mcp')) {
50
+ evidence.push(`Package name "${packageName}" indicates MCP server`);
51
+ confidence += 10;
52
+ }
53
+ }
54
+ // Check for MCP-related keywords in package.json
55
+ const keywords = pkg.keywords;
56
+ if (keywords && Array.isArray(keywords)) {
57
+ const mcpKeywords = keywords.filter(k => k.toLowerCase().includes('mcp') ||
58
+ k.toLowerCase().includes('model-context-protocol') ||
59
+ k.toLowerCase().includes('claude'));
60
+ if (mcpKeywords.length > 0) {
61
+ evidence.push(`MCP-related keywords: ${mcpKeywords.join(', ')}`);
62
+ confidence += 10;
63
+ }
64
+ }
65
+ // Check for MCP server files
66
+ const serverFiles = [
67
+ 'src/index.ts',
68
+ 'src/server.ts',
69
+ 'src/mcp.ts',
70
+ 'index.ts',
71
+ 'server.ts',
72
+ ];
73
+ for (const file of serverFiles) {
74
+ const filePath = join(projectRoot, file);
75
+ if (existsSync(filePath)) {
76
+ try {
77
+ const content = readFileSync(filePath, 'utf-8');
78
+ if (content.includes('@modelcontextprotocol/sdk') || content.includes('McpServer')) {
79
+ evidence.push(`MCP server code found in ${file}`);
80
+ confidence += 20;
81
+ break;
82
+ }
83
+ }
84
+ catch {
85
+ // Ignore read errors
86
+ }
87
+ }
88
+ }
89
+ // Check for package.json bin field (common for MCP servers)
90
+ if (pkg.bin && deps['@modelcontextprotocol/sdk']) {
91
+ evidence.push('Package has bin field (likely a CLI MCP server)');
92
+ confidence += 10;
93
+ }
94
+ if (confidence === 0)
95
+ return null;
96
+ return {
97
+ name: 'MCP Server Project',
98
+ version: deps['@modelcontextprotocol/sdk'],
99
+ confidence: Math.min(confidence, 100),
100
+ evidence,
101
+ };
102
+ }
103
+ /**
104
+ * Detect if project uses MCP client
105
+ */
106
+ function detectMCPClient(deps) {
107
+ const evidence = [];
108
+ let confidence = 0;
109
+ // Check for MCP client packages
110
+ if (deps['@anthropic-ai/sdk']) {
111
+ evidence.push(`@anthropic-ai/sdk@${deps['@anthropic-ai/sdk']} in dependencies`);
112
+ confidence += 50;
113
+ }
114
+ if (deps['@modelcontextprotocol/sdk']) {
115
+ // Could be either client or server, lower confidence
116
+ evidence.push('MCP SDK found (could be client usage)');
117
+ confidence += 30;
118
+ }
119
+ if (confidence === 0)
120
+ return null;
121
+ return {
122
+ name: 'MCP Client',
123
+ confidence: Math.min(confidence, 100),
124
+ evidence,
125
+ };
126
+ }
127
+ /**
128
+ * MCP project detector
129
+ * Detects if the project is an MCP server or uses MCP
130
+ */
131
+ export const mcpProjectDetector = {
132
+ category: 'mcp',
133
+ name: 'MCP Project Detector',
134
+ async detect(projectRoot) {
135
+ const pkg = readPackageJson(projectRoot);
136
+ if (!pkg) {
137
+ return null;
138
+ }
139
+ const deps = getDependencies(pkg);
140
+ // First check if it's an MCP server project
141
+ const serverResult = detectMCPServer(projectRoot, pkg, deps);
142
+ if (serverResult && serverResult.confidence >= 40) {
143
+ return serverResult;
144
+ }
145
+ // Then check if it uses MCP client
146
+ const clientResult = detectMCPClient(deps);
147
+ if (clientResult && clientResult.confidence >= 40) {
148
+ return clientResult;
149
+ }
150
+ return null;
151
+ },
152
+ };
153
+ export default mcpProjectDetector;
154
+ //# sourceMappingURL=mcpProject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpProject.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/mcp/mcpProject.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * MCP Servers Detector
3
+ * Detects usable MCP tools from config files and infers from dependencies
4
+ */
5
+ import type { Detector } from '../../types.js';
6
+ /**
7
+ * MCP servers detector
8
+ * Returns detected MCP configurations and recommendations
9
+ */
10
+ export declare const mcpServersDetector: Detector;
11
+ /**
12
+ * Get recommended MCP servers based on project stack
13
+ * This is a utility function, not a detector
14
+ */
15
+ export declare function getRecommendedMCPServers(projectRoot: string): string[];
16
+ export default mcpServersDetector;
17
+ //# sourceMappingURL=mcpServers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpServers.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/mcp/mcpServers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAuKhE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QA0ChC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAQtE;AAED,eAAe,kBAAkB,CAAC"}
@@ -0,0 +1,193 @@
1
+ /**
2
+ * MCP Servers Detector
3
+ * Detects usable MCP tools from config files and infers from dependencies
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
+ * Read JSON file safely
33
+ */
34
+ function readJsonFile(filePath) {
35
+ if (!existsSync(filePath)) {
36
+ return null;
37
+ }
38
+ try {
39
+ const content = readFileSync(filePath, 'utf-8');
40
+ return JSON.parse(content);
41
+ }
42
+ catch {
43
+ return null;
44
+ }
45
+ }
46
+ /**
47
+ * Detect MCP configuration from .claude directory
48
+ */
49
+ function detectClaudeMCP(projectRoot) {
50
+ const results = [];
51
+ const claudeDir = join(projectRoot, '.claude');
52
+ if (!existsSync(claudeDir)) {
53
+ return results;
54
+ }
55
+ // Check for mcp.json in .claude directory
56
+ const mcpConfigPath = join(claudeDir, 'mcp.json');
57
+ const config = readJsonFile(mcpConfigPath);
58
+ if (config?.mcpServers) {
59
+ for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
60
+ results.push({
61
+ name: `MCP: ${name}`,
62
+ confidence: 90,
63
+ evidence: [`Configured in .claude/mcp.json`],
64
+ variant: serverConfig.command || serverConfig.url || 'configured',
65
+ });
66
+ }
67
+ }
68
+ return results;
69
+ }
70
+ /**
71
+ * Detect MCP configuration from .cursor directory
72
+ */
73
+ function detectCursorMCP(projectRoot) {
74
+ const results = [];
75
+ const cursorDir = join(projectRoot, '.cursor');
76
+ if (!existsSync(cursorDir)) {
77
+ return results;
78
+ }
79
+ // Check for mcp.json in .cursor directory
80
+ const mcpConfigPath = join(cursorDir, 'mcp.json');
81
+ const config = readJsonFile(mcpConfigPath);
82
+ if (config?.mcpServers) {
83
+ for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
84
+ results.push({
85
+ name: `MCP: ${name}`,
86
+ confidence: 90,
87
+ evidence: [`Configured in .cursor/mcp.json`],
88
+ variant: serverConfig.command || serverConfig.url || 'configured',
89
+ });
90
+ }
91
+ }
92
+ return results;
93
+ }
94
+ /**
95
+ * Detect MCP configuration from root mcp.json
96
+ */
97
+ function detectRootMCP(projectRoot) {
98
+ const results = [];
99
+ const mcpConfigPath = join(projectRoot, 'mcp.json');
100
+ const config = readJsonFile(mcpConfigPath);
101
+ if (config?.mcpServers) {
102
+ for (const [name, serverConfig] of Object.entries(config.mcpServers)) {
103
+ results.push({
104
+ name: `MCP: ${name}`,
105
+ confidence: 90,
106
+ evidence: [`Configured in mcp.json`],
107
+ variant: serverConfig.command || serverConfig.url || 'configured',
108
+ });
109
+ }
110
+ }
111
+ return results;
112
+ }
113
+ /**
114
+ * Infer recommended MCP servers from dependencies
115
+ */
116
+ function inferMCPFromDeps(deps) {
117
+ const recommendations = [];
118
+ // Supabase → Supabase MCP
119
+ if (deps['@supabase/supabase-js'] || deps['@supabase/ssr']) {
120
+ recommendations.push('supabase');
121
+ }
122
+ // GitHub (if repo uses git) → GitHub MCP
123
+ // This is almost always useful
124
+ recommendations.push('github');
125
+ // Stripe → Stripe MCP (if available)
126
+ if (deps.stripe) {
127
+ recommendations.push('stripe');
128
+ }
129
+ // PostgreSQL → Postgres MCP
130
+ if (deps.pg || deps.postgres || deps['@prisma/client']) {
131
+ recommendations.push('postgres');
132
+ }
133
+ // Filesystem is almost always useful
134
+ recommendations.push('filesystem');
135
+ // Memory/knowledge base
136
+ recommendations.push('memory');
137
+ return [...new Set(recommendations)]; // Remove duplicates
138
+ }
139
+ /**
140
+ * MCP servers detector
141
+ * Returns detected MCP configurations and recommendations
142
+ */
143
+ export const mcpServersDetector = {
144
+ category: 'mcp',
145
+ name: 'MCP Servers Detector',
146
+ async detect(projectRoot) {
147
+ const results = [];
148
+ // Detect configured MCP servers
149
+ results.push(...detectClaudeMCP(projectRoot));
150
+ results.push(...detectCursorMCP(projectRoot));
151
+ results.push(...detectRootMCP(projectRoot));
152
+ // Deduplicate by name
153
+ const seen = new Set();
154
+ const uniqueResults = results.filter(r => {
155
+ if (seen.has(r.name))
156
+ return false;
157
+ seen.add(r.name);
158
+ return true;
159
+ });
160
+ // If we found configured servers, return them
161
+ if (uniqueResults.length > 0) {
162
+ return uniqueResults;
163
+ }
164
+ // Otherwise, check for MCP config directories existence
165
+ const claudeDir = join(projectRoot, '.claude');
166
+ const cursorDir = join(projectRoot, '.cursor');
167
+ if (existsSync(claudeDir) || existsSync(cursorDir)) {
168
+ return [{
169
+ name: 'MCP Config Directory',
170
+ confidence: 50,
171
+ evidence: [
172
+ existsSync(claudeDir) ? '.claude/ directory found' : '',
173
+ existsSync(cursorDir) ? '.cursor/ directory found' : '',
174
+ ].filter(Boolean),
175
+ }];
176
+ }
177
+ return null;
178
+ },
179
+ };
180
+ /**
181
+ * Get recommended MCP servers based on project stack
182
+ * This is a utility function, not a detector
183
+ */
184
+ export function getRecommendedMCPServers(projectRoot) {
185
+ const pkg = readPackageJson(projectRoot);
186
+ if (!pkg) {
187
+ return ['filesystem', 'github', 'memory'];
188
+ }
189
+ const deps = getDependencies(pkg);
190
+ return inferMCPFromDeps(deps);
191
+ }
192
+ export default mcpServersDetector;
193
+ //# sourceMappingURL=mcpServers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcpServers.js","sourceRoot":"","sources":["../../../../src/scanner/detectors/mcp/mcpServers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Analytics Detector
3
+ * Detects: PostHog, Mixpanel, Vercel Analytics, Google Analytics
4
+ */
5
+ import type { Detector } from '../../types.js';
6
+ /**
7
+ * Analytics detector
8
+ * Returns all detected analytics solutions (projects often use multiple)
9
+ */
10
+ export declare const analyticsDetector: Detector;
11
+ export default analyticsDetector;
12
+ //# sourceMappingURL=analytics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics.d.ts","sourceRoot":"","sources":["../../../../src/scanner/detectors/services/analytics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAmB,MAAM,gBAAgB,CAAC;AAoOhE;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,QA+B/B,CAAC;AAEF,eAAe,iBAAiB,CAAC"}