@flaid/devmap 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (391) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +168 -0
  3. package/dist/ai/completion.d.ts +7 -0
  4. package/dist/ai/completion.d.ts.map +1 -0
  5. package/dist/ai/completion.js +27 -0
  6. package/dist/ai/completion.js.map +1 -0
  7. package/dist/ai/contextBuilder.d.ts +42 -0
  8. package/dist/ai/contextBuilder.d.ts.map +1 -0
  9. package/dist/ai/contextBuilder.js +632 -0
  10. package/dist/ai/contextBuilder.js.map +1 -0
  11. package/dist/ai/groq.d.ts +36 -0
  12. package/dist/ai/groq.d.ts.map +1 -0
  13. package/dist/ai/groq.js +368 -0
  14. package/dist/ai/groq.js.map +1 -0
  15. package/dist/ai/openrouter.d.ts +20 -0
  16. package/dist/ai/openrouter.d.ts.map +1 -0
  17. package/dist/ai/openrouter.js +187 -0
  18. package/dist/ai/openrouter.js.map +1 -0
  19. package/dist/ai/prompts.d.ts +7 -0
  20. package/dist/ai/prompts.d.ts.map +1 -0
  21. package/dist/ai/prompts.js +88 -0
  22. package/dist/ai/prompts.js.map +1 -0
  23. package/dist/ai/provider.d.ts +15 -0
  24. package/dist/ai/provider.d.ts.map +1 -0
  25. package/dist/ai/provider.js +28 -0
  26. package/dist/ai/provider.js.map +1 -0
  27. package/dist/ai/snapshotEnrichment.d.ts +4 -0
  28. package/dist/ai/snapshotEnrichment.d.ts.map +1 -0
  29. package/dist/ai/snapshotEnrichment.js +188 -0
  30. package/dist/ai/snapshotEnrichment.js.map +1 -0
  31. package/dist/ai/types.d.ts +29 -0
  32. package/dist/ai/types.d.ts.map +1 -0
  33. package/dist/ai/types.js +2 -0
  34. package/dist/ai/types.js.map +1 -0
  35. package/dist/analyzers/analysis/extractors/fallbackExtractor.d.ts +30 -0
  36. package/dist/analyzers/analysis/extractors/fallbackExtractor.d.ts.map +1 -0
  37. package/dist/analyzers/analysis/extractors/fallbackExtractor.js +114 -0
  38. package/dist/analyzers/analysis/extractors/fallbackExtractor.js.map +1 -0
  39. package/dist/analyzers/analysis/extractors/index.d.ts +16 -0
  40. package/dist/analyzers/analysis/extractors/index.d.ts.map +1 -0
  41. package/dist/analyzers/analysis/extractors/index.js +135 -0
  42. package/dist/analyzers/analysis/extractors/index.js.map +1 -0
  43. package/dist/analyzers/analysis/extractors/prismaExtractor.d.ts +15 -0
  44. package/dist/analyzers/analysis/extractors/prismaExtractor.d.ts.map +1 -0
  45. package/dist/analyzers/analysis/extractors/prismaExtractor.js +183 -0
  46. package/dist/analyzers/analysis/extractors/prismaExtractor.js.map +1 -0
  47. package/dist/analyzers/analysis/extractors/sqlExtractor.d.ts +14 -0
  48. package/dist/analyzers/analysis/extractors/sqlExtractor.d.ts.map +1 -0
  49. package/dist/analyzers/analysis/extractors/sqlExtractor.js +163 -0
  50. package/dist/analyzers/analysis/extractors/sqlExtractor.js.map +1 -0
  51. package/dist/analyzers/analysis/extractors/types.d.ts +76 -0
  52. package/dist/analyzers/analysis/extractors/types.d.ts.map +1 -0
  53. package/dist/analyzers/analysis/extractors/types.js +2 -0
  54. package/dist/analyzers/analysis/extractors/types.js.map +1 -0
  55. package/dist/analyzers/analysis/fileAnalysis.d.ts +36 -0
  56. package/dist/analyzers/analysis/fileAnalysis.d.ts.map +1 -0
  57. package/dist/analyzers/analysis/fileAnalysis.js +2 -0
  58. package/dist/analyzers/analysis/fileAnalysis.js.map +1 -0
  59. package/dist/analyzers/analysis/fileRole.d.ts +30 -0
  60. package/dist/analyzers/analysis/fileRole.d.ts.map +1 -0
  61. package/dist/analyzers/analysis/fileRole.js +242 -0
  62. package/dist/analyzers/analysis/fileRole.js.map +1 -0
  63. package/dist/analyzers/analysis/fileScanner.d.ts +10 -0
  64. package/dist/analyzers/analysis/fileScanner.d.ts.map +1 -0
  65. package/dist/analyzers/analysis/fileScanner.js +44 -0
  66. package/dist/analyzers/analysis/fileScanner.js.map +1 -0
  67. package/dist/analyzers/analysis/filterEngine.d.ts +2 -0
  68. package/dist/analyzers/analysis/filterEngine.d.ts.map +1 -0
  69. package/dist/analyzers/analysis/filterEngine.js +110 -0
  70. package/dist/analyzers/analysis/filterEngine.js.map +1 -0
  71. package/dist/analyzers/analysis/index.d.ts +12 -0
  72. package/dist/analyzers/analysis/index.d.ts.map +1 -0
  73. package/dist/analyzers/analysis/index.js +8 -0
  74. package/dist/analyzers/analysis/index.js.map +1 -0
  75. package/dist/analyzers/analysis/preprocessors/astroPreprocessor.d.ts +23 -0
  76. package/dist/analyzers/analysis/preprocessors/astroPreprocessor.d.ts.map +1 -0
  77. package/dist/analyzers/analysis/preprocessors/astroPreprocessor.js +40 -0
  78. package/dist/analyzers/analysis/preprocessors/astroPreprocessor.js.map +1 -0
  79. package/dist/analyzers/analysis/preprocessors/index.d.ts +5 -0
  80. package/dist/analyzers/analysis/preprocessors/index.d.ts.map +1 -0
  81. package/dist/analyzers/analysis/preprocessors/index.js +4 -0
  82. package/dist/analyzers/analysis/preprocessors/index.js.map +1 -0
  83. package/dist/analyzers/analysis/preprocessors/sveltePreprocessor.d.ts +27 -0
  84. package/dist/analyzers/analysis/preprocessors/sveltePreprocessor.d.ts.map +1 -0
  85. package/dist/analyzers/analysis/preprocessors/sveltePreprocessor.js +50 -0
  86. package/dist/analyzers/analysis/preprocessors/sveltePreprocessor.js.map +1 -0
  87. package/dist/analyzers/analysis/preprocessors/types.d.ts +45 -0
  88. package/dist/analyzers/analysis/preprocessors/types.d.ts.map +1 -0
  89. package/dist/analyzers/analysis/preprocessors/types.js +2 -0
  90. package/dist/analyzers/analysis/preprocessors/types.js.map +1 -0
  91. package/dist/analyzers/analysis/preprocessors/vuePreprocessor.d.ts +21 -0
  92. package/dist/analyzers/analysis/preprocessors/vuePreprocessor.d.ts.map +1 -0
  93. package/dist/analyzers/analysis/preprocessors/vuePreprocessor.js +44 -0
  94. package/dist/analyzers/analysis/preprocessors/vuePreprocessor.js.map +1 -0
  95. package/dist/analyzers/analysis/tsMorphAnalyzer.d.ts +10 -0
  96. package/dist/analyzers/analysis/tsMorphAnalyzer.d.ts.map +1 -0
  97. package/dist/analyzers/analysis/tsMorphAnalyzer.js +190 -0
  98. package/dist/analyzers/analysis/tsMorphAnalyzer.js.map +1 -0
  99. package/dist/analyzers/detectors/capabilityDetector.d.ts +28 -0
  100. package/dist/analyzers/detectors/capabilityDetector.d.ts.map +1 -0
  101. package/dist/analyzers/detectors/capabilityDetector.js +288 -0
  102. package/dist/analyzers/detectors/capabilityDetector.js.map +1 -0
  103. package/dist/analyzers/detectors/databaseDetector.d.ts +7 -0
  104. package/dist/analyzers/detectors/databaseDetector.d.ts.map +1 -0
  105. package/dist/analyzers/detectors/databaseDetector.js +71 -0
  106. package/dist/analyzers/detectors/databaseDetector.js.map +1 -0
  107. package/dist/analyzers/detectors/frameworkDetector.d.ts +22 -0
  108. package/dist/analyzers/detectors/frameworkDetector.d.ts.map +1 -0
  109. package/dist/analyzers/detectors/frameworkDetector.js +160 -0
  110. package/dist/analyzers/detectors/frameworkDetector.js.map +1 -0
  111. package/dist/analyzers/detectors/frontendFeatureDetector.d.ts +26 -0
  112. package/dist/analyzers/detectors/frontendFeatureDetector.d.ts.map +1 -0
  113. package/dist/analyzers/detectors/frontendFeatureDetector.js +269 -0
  114. package/dist/analyzers/detectors/frontendFeatureDetector.js.map +1 -0
  115. package/dist/analyzers/detectors/index.d.ts +11 -0
  116. package/dist/analyzers/detectors/index.d.ts.map +1 -0
  117. package/dist/analyzers/detectors/index.js +7 -0
  118. package/dist/analyzers/detectors/index.js.map +1 -0
  119. package/dist/analyzers/detectors/nestRouteDetector.d.ts +13 -0
  120. package/dist/analyzers/detectors/nestRouteDetector.d.ts.map +1 -0
  121. package/dist/analyzers/detectors/nestRouteDetector.js +69 -0
  122. package/dist/analyzers/detectors/nestRouteDetector.js.map +1 -0
  123. package/dist/analyzers/detectors/routeDetector.d.ts +22 -0
  124. package/dist/analyzers/detectors/routeDetector.d.ts.map +1 -0
  125. package/dist/analyzers/detectors/routeDetector.js +368 -0
  126. package/dist/analyzers/detectors/routeDetector.js.map +1 -0
  127. package/dist/analyzers/detectors/serviceDetector.d.ts +3 -0
  128. package/dist/analyzers/detectors/serviceDetector.d.ts.map +1 -0
  129. package/dist/analyzers/detectors/serviceDetector.js +81 -0
  130. package/dist/analyzers/detectors/serviceDetector.js.map +1 -0
  131. package/dist/analyzers/features/featureDetector.d.ts +22 -0
  132. package/dist/analyzers/features/featureDetector.d.ts.map +1 -0
  133. package/dist/analyzers/features/featureDetector.js +821 -0
  134. package/dist/analyzers/features/featureDetector.js.map +1 -0
  135. package/dist/analyzers/features/featureMerge.d.ts +65 -0
  136. package/dist/analyzers/features/featureMerge.d.ts.map +1 -0
  137. package/dist/analyzers/features/featureMerge.js +168 -0
  138. package/dist/analyzers/features/featureMerge.js.map +1 -0
  139. package/dist/analyzers/features/featureSimilarity.d.ts +152 -0
  140. package/dist/analyzers/features/featureSimilarity.d.ts.map +1 -0
  141. package/dist/analyzers/features/featureSimilarity.js +264 -0
  142. package/dist/analyzers/features/featureSimilarity.js.map +1 -0
  143. package/dist/analyzers/features/index.d.ts +6 -0
  144. package/dist/analyzers/features/index.d.ts.map +1 -0
  145. package/dist/analyzers/features/index.js +4 -0
  146. package/dist/analyzers/features/index.js.map +1 -0
  147. package/dist/analyzers/graph/dependencyGraph.d.ts +5 -0
  148. package/dist/analyzers/graph/dependencyGraph.d.ts.map +1 -0
  149. package/dist/analyzers/graph/dependencyGraph.js +88 -0
  150. package/dist/analyzers/graph/dependencyGraph.js.map +1 -0
  151. package/dist/analyzers/graph/dependencyMap.d.ts +43 -0
  152. package/dist/analyzers/graph/dependencyMap.d.ts.map +1 -0
  153. package/dist/analyzers/graph/dependencyMap.js +85 -0
  154. package/dist/analyzers/graph/dependencyMap.js.map +1 -0
  155. package/dist/analyzers/graph/entryPoints.d.ts +3 -0
  156. package/dist/analyzers/graph/entryPoints.d.ts.map +1 -0
  157. package/dist/analyzers/graph/entryPoints.js +21 -0
  158. package/dist/analyzers/graph/entryPoints.js.map +1 -0
  159. package/dist/analyzers/graph/index.d.ts +7 -0
  160. package/dist/analyzers/graph/index.d.ts.map +1 -0
  161. package/dist/analyzers/graph/index.js +5 -0
  162. package/dist/analyzers/graph/index.js.map +1 -0
  163. package/dist/analyzers/graph/sourceScope.d.ts +2 -0
  164. package/dist/analyzers/graph/sourceScope.d.ts.map +1 -0
  165. package/dist/analyzers/graph/sourceScope.js +30 -0
  166. package/dist/analyzers/graph/sourceScope.js.map +1 -0
  167. package/dist/analyzers/inference/domainInference.d.ts +58 -0
  168. package/dist/analyzers/inference/domainInference.d.ts.map +1 -0
  169. package/dist/analyzers/inference/domainInference.js +234 -0
  170. package/dist/analyzers/inference/domainInference.js.map +1 -0
  171. package/dist/analyzers/inference/index.d.ts +5 -0
  172. package/dist/analyzers/inference/index.d.ts.map +1 -0
  173. package/dist/analyzers/inference/index.js +3 -0
  174. package/dist/analyzers/inference/index.js.map +1 -0
  175. package/dist/analyzers/inference/ownershipTopology.d.ts +8 -0
  176. package/dist/analyzers/inference/ownershipTopology.d.ts.map +1 -0
  177. package/dist/analyzers/inference/ownershipTopology.js +65 -0
  178. package/dist/analyzers/inference/ownershipTopology.js.map +1 -0
  179. package/dist/analyzers/pipeline/analyzerRegistry.d.ts +9 -0
  180. package/dist/analyzers/pipeline/analyzerRegistry.d.ts.map +1 -0
  181. package/dist/analyzers/pipeline/analyzerRegistry.js +35 -0
  182. package/dist/analyzers/pipeline/analyzerRegistry.js.map +1 -0
  183. package/dist/analyzers/pipeline/heuristicAnalyzer.d.ts +12 -0
  184. package/dist/analyzers/pipeline/heuristicAnalyzer.d.ts.map +1 -0
  185. package/dist/analyzers/pipeline/heuristicAnalyzer.js +150 -0
  186. package/dist/analyzers/pipeline/heuristicAnalyzer.js.map +1 -0
  187. package/dist/analyzers/pipeline/index.d.ts +7 -0
  188. package/dist/analyzers/pipeline/index.d.ts.map +1 -0
  189. package/dist/analyzers/pipeline/index.js +5 -0
  190. package/dist/analyzers/pipeline/index.js.map +1 -0
  191. package/dist/analyzers/pipeline/projectMap.d.ts +120 -0
  192. package/dist/analyzers/pipeline/projectMap.d.ts.map +1 -0
  193. package/dist/analyzers/pipeline/projectMap.js +726 -0
  194. package/dist/analyzers/pipeline/projectMap.js.map +1 -0
  195. package/dist/analyzers/pipeline/projectMetadata.d.ts +19 -0
  196. package/dist/analyzers/pipeline/projectMetadata.d.ts.map +1 -0
  197. package/dist/analyzers/pipeline/projectMetadata.js +149 -0
  198. package/dist/analyzers/pipeline/projectMetadata.js.map +1 -0
  199. package/dist/analyzers/pipeline/reasonTags.d.ts +6 -0
  200. package/dist/analyzers/pipeline/reasonTags.d.ts.map +1 -0
  201. package/dist/analyzers/pipeline/reasonTags.js +6 -0
  202. package/dist/analyzers/pipeline/reasonTags.js.map +1 -0
  203. package/dist/analyzers/registry/ai-providers.d.ts +3 -0
  204. package/dist/analyzers/registry/ai-providers.d.ts.map +1 -0
  205. package/dist/analyzers/registry/ai-providers.js +94 -0
  206. package/dist/analyzers/registry/ai-providers.js.map +1 -0
  207. package/dist/analyzers/registry/analytics.d.ts +3 -0
  208. package/dist/analyzers/registry/analytics.d.ts.map +1 -0
  209. package/dist/analyzers/registry/analytics.js +15 -0
  210. package/dist/analyzers/registry/analytics.js.map +1 -0
  211. package/dist/analyzers/registry/auth.d.ts +3 -0
  212. package/dist/analyzers/registry/auth.d.ts.map +1 -0
  213. package/dist/analyzers/registry/auth.js +18 -0
  214. package/dist/analyzers/registry/auth.js.map +1 -0
  215. package/dist/analyzers/registry/background-jobs.d.ts +3 -0
  216. package/dist/analyzers/registry/background-jobs.d.ts.map +1 -0
  217. package/dist/analyzers/registry/background-jobs.js +14 -0
  218. package/dist/analyzers/registry/background-jobs.js.map +1 -0
  219. package/dist/analyzers/registry/caching.d.ts +3 -0
  220. package/dist/analyzers/registry/caching.d.ts.map +1 -0
  221. package/dist/analyzers/registry/caching.js +13 -0
  222. package/dist/analyzers/registry/caching.js.map +1 -0
  223. package/dist/analyzers/registry/cms-content.d.ts +3 -0
  224. package/dist/analyzers/registry/cms-content.d.ts.map +1 -0
  225. package/dist/analyzers/registry/cms-content.js +15 -0
  226. package/dist/analyzers/registry/cms-content.js.map +1 -0
  227. package/dist/analyzers/registry/database.d.ts +3 -0
  228. package/dist/analyzers/registry/database.d.ts.map +1 -0
  229. package/dist/analyzers/registry/database.js +13 -0
  230. package/dist/analyzers/registry/database.js.map +1 -0
  231. package/dist/analyzers/registry/email.d.ts +3 -0
  232. package/dist/analyzers/registry/email.d.ts.map +1 -0
  233. package/dist/analyzers/registry/email.js +19 -0
  234. package/dist/analyzers/registry/email.js.map +1 -0
  235. package/dist/analyzers/registry/file-upload.d.ts +3 -0
  236. package/dist/analyzers/registry/file-upload.d.ts.map +1 -0
  237. package/dist/analyzers/registry/file-upload.js +19 -0
  238. package/dist/analyzers/registry/file-upload.js.map +1 -0
  239. package/dist/analyzers/registry/firebase.d.ts +3 -0
  240. package/dist/analyzers/registry/firebase.d.ts.map +1 -0
  241. package/dist/analyzers/registry/firebase.js +8 -0
  242. package/dist/analyzers/registry/firebase.js.map +1 -0
  243. package/dist/analyzers/registry/index.d.ts +16 -0
  244. package/dist/analyzers/registry/index.d.ts.map +1 -0
  245. package/dist/analyzers/registry/index.js +88 -0
  246. package/dist/analyzers/registry/index.js.map +1 -0
  247. package/dist/analyzers/registry/internationalization.d.ts +3 -0
  248. package/dist/analyzers/registry/internationalization.d.ts.map +1 -0
  249. package/dist/analyzers/registry/internationalization.js +13 -0
  250. package/dist/analyzers/registry/internationalization.js.map +1 -0
  251. package/dist/analyzers/registry/logging-monitoring.d.ts +3 -0
  252. package/dist/analyzers/registry/logging-monitoring.d.ts.map +1 -0
  253. package/dist/analyzers/registry/logging-monitoring.js +14 -0
  254. package/dist/analyzers/registry/logging-monitoring.js.map +1 -0
  255. package/dist/analyzers/registry/notifications.d.ts +3 -0
  256. package/dist/analyzers/registry/notifications.d.ts.map +1 -0
  257. package/dist/analyzers/registry/notifications.js +14 -0
  258. package/dist/analyzers/registry/notifications.js.map +1 -0
  259. package/dist/analyzers/registry/payments.d.ts +3 -0
  260. package/dist/analyzers/registry/payments.d.ts.map +1 -0
  261. package/dist/analyzers/registry/payments.js +23 -0
  262. package/dist/analyzers/registry/payments.js.map +1 -0
  263. package/dist/analyzers/registry/rate-limiting.d.ts +3 -0
  264. package/dist/analyzers/registry/rate-limiting.d.ts.map +1 -0
  265. package/dist/analyzers/registry/rate-limiting.js +13 -0
  266. package/dist/analyzers/registry/rate-limiting.js.map +1 -0
  267. package/dist/analyzers/registry/search.d.ts +3 -0
  268. package/dist/analyzers/registry/search.d.ts.map +1 -0
  269. package/dist/analyzers/registry/search.js +15 -0
  270. package/dist/analyzers/registry/search.js.map +1 -0
  271. package/dist/analyzers/registry/testing.d.ts +3 -0
  272. package/dist/analyzers/registry/testing.d.ts.map +1 -0
  273. package/dist/analyzers/registry/testing.js +13 -0
  274. package/dist/analyzers/registry/testing.js.map +1 -0
  275. package/dist/analyzers/registry/types.d.ts +14 -0
  276. package/dist/analyzers/registry/types.d.ts.map +1 -0
  277. package/dist/analyzers/registry/types.js +2 -0
  278. package/dist/analyzers/registry/types.js.map +1 -0
  279. package/dist/cache/agentNavigation.d.ts +7 -0
  280. package/dist/cache/agentNavigation.d.ts.map +1 -0
  281. package/dist/cache/agentNavigation.js +253 -0
  282. package/dist/cache/agentNavigation.js.map +1 -0
  283. package/dist/cache/fileHash.d.ts +2 -0
  284. package/dist/cache/fileHash.d.ts.map +1 -0
  285. package/dist/cache/fileHash.js +5 -0
  286. package/dist/cache/fileHash.js.map +1 -0
  287. package/dist/cache/snapshot.d.ts +20 -0
  288. package/dist/cache/snapshot.d.ts.map +1 -0
  289. package/dist/cache/snapshot.js +184 -0
  290. package/dist/cache/snapshot.js.map +1 -0
  291. package/dist/commands/analyze.d.ts +12 -0
  292. package/dist/commands/analyze.d.ts.map +1 -0
  293. package/dist/commands/analyze.js +201 -0
  294. package/dist/commands/analyze.js.map +1 -0
  295. package/dist/commands/config.d.ts +10 -0
  296. package/dist/commands/config.d.ts.map +1 -0
  297. package/dist/commands/config.js +65 -0
  298. package/dist/commands/config.js.map +1 -0
  299. package/dist/commands/doctor.d.ts +11 -0
  300. package/dist/commands/doctor.d.ts.map +1 -0
  301. package/dist/commands/doctor.js +141 -0
  302. package/dist/commands/doctor.js.map +1 -0
  303. package/dist/commands/explain.d.ts +37 -0
  304. package/dist/commands/explain.d.ts.map +1 -0
  305. package/dist/commands/explain.js +101 -0
  306. package/dist/commands/explain.js.map +1 -0
  307. package/dist/commands/flow.d.ts +34 -0
  308. package/dist/commands/flow.d.ts.map +1 -0
  309. package/dist/commands/flow.js +151 -0
  310. package/dist/commands/flow.js.map +1 -0
  311. package/dist/commands/init.d.ts +16 -0
  312. package/dist/commands/init.d.ts.map +1 -0
  313. package/dist/commands/init.js +197 -0
  314. package/dist/commands/init.js.map +1 -0
  315. package/dist/commands/map.d.ts +24 -0
  316. package/dist/commands/map.d.ts.map +1 -0
  317. package/dist/commands/map.js +282 -0
  318. package/dist/commands/map.js.map +1 -0
  319. package/dist/commands/onboarding.d.ts +36 -0
  320. package/dist/commands/onboarding.d.ts.map +1 -0
  321. package/dist/commands/onboarding.js +226 -0
  322. package/dist/commands/onboarding.js.map +1 -0
  323. package/dist/index.d.ts +3 -0
  324. package/dist/index.d.ts.map +1 -0
  325. package/dist/index.js +104 -0
  326. package/dist/index.js.map +1 -0
  327. package/dist/onboarding/model.d.ts +27 -0
  328. package/dist/onboarding/model.d.ts.map +1 -0
  329. package/dist/onboarding/model.js +2 -0
  330. package/dist/onboarding/model.js.map +1 -0
  331. package/dist/onboarding/modelBuilder.d.ts +4 -0
  332. package/dist/onboarding/modelBuilder.d.ts.map +1 -0
  333. package/dist/onboarding/modelBuilder.js +330 -0
  334. package/dist/onboarding/modelBuilder.js.map +1 -0
  335. package/dist/utils/agentsFile.d.ts +6 -0
  336. package/dist/utils/agentsFile.d.ts.map +1 -0
  337. package/dist/utils/agentsFile.js +85 -0
  338. package/dist/utils/agentsFile.js.map +1 -0
  339. package/dist/utils/config.d.ts +20 -0
  340. package/dist/utils/config.d.ts.map +1 -0
  341. package/dist/utils/config.js +88 -0
  342. package/dist/utils/config.js.map +1 -0
  343. package/dist/utils/devmapFile.d.ts +3 -0
  344. package/dist/utils/devmapFile.d.ts.map +1 -0
  345. package/dist/utils/devmapFile.js +43 -0
  346. package/dist/utils/devmapFile.js.map +1 -0
  347. package/dist/utils/errors.d.ts +8 -0
  348. package/dist/utils/errors.d.ts.map +1 -0
  349. package/dist/utils/errors.js +92 -0
  350. package/dist/utils/errors.js.map +1 -0
  351. package/dist/utils/gitignore.d.ts +2 -0
  352. package/dist/utils/gitignore.d.ts.map +1 -0
  353. package/dist/utils/gitignore.js +22 -0
  354. package/dist/utils/gitignore.js.map +1 -0
  355. package/dist/utils/help.d.ts +3 -0
  356. package/dist/utils/help.d.ts.map +1 -0
  357. package/dist/utils/help.js +19 -0
  358. package/dist/utils/help.js.map +1 -0
  359. package/dist/utils/mapRenderer.d.ts +39 -0
  360. package/dist/utils/mapRenderer.d.ts.map +1 -0
  361. package/dist/utils/mapRenderer.js +90 -0
  362. package/dist/utils/mapRenderer.js.map +1 -0
  363. package/dist/utils/markdownTerminal.d.ts +6 -0
  364. package/dist/utils/markdownTerminal.d.ts.map +1 -0
  365. package/dist/utils/markdownTerminal.js +153 -0
  366. package/dist/utils/markdownTerminal.js.map +1 -0
  367. package/dist/utils/output.d.ts +29 -0
  368. package/dist/utils/output.d.ts.map +1 -0
  369. package/dist/utils/output.js +108 -0
  370. package/dist/utils/output.js.map +1 -0
  371. package/dist/utils/packageMetadata.d.ts +2 -0
  372. package/dist/utils/packageMetadata.d.ts.map +1 -0
  373. package/dist/utils/packageMetadata.js +5 -0
  374. package/dist/utils/packageMetadata.js.map +1 -0
  375. package/dist/utils/prompt.d.ts +11 -0
  376. package/dist/utils/prompt.d.ts.map +1 -0
  377. package/dist/utils/prompt.js +81 -0
  378. package/dist/utils/prompt.js.map +1 -0
  379. package/dist/utils/slug.d.ts +2 -0
  380. package/dist/utils/slug.d.ts.map +1 -0
  381. package/dist/utils/slug.js +8 -0
  382. package/dist/utils/slug.js.map +1 -0
  383. package/dist/utils/targetResolver.d.ts +7 -0
  384. package/dist/utils/targetResolver.d.ts.map +1 -0
  385. package/dist/utils/targetResolver.js +15 -0
  386. package/dist/utils/targetResolver.js.map +1 -0
  387. package/dist/utils/welcome.d.ts +10 -0
  388. package/dist/utils/welcome.d.ts.map +1 -0
  389. package/dist/utils/welcome.js +80 -0
  390. package/dist/utils/welcome.js.map +1 -0
  391. package/package.json +61 -0
@@ -0,0 +1,30 @@
1
+ const NON_PRODUCTION_SEGMENTS = new Set([
2
+ "__fixtures__",
3
+ "__mocks__",
4
+ "__tests__",
5
+ "coverage",
6
+ "demo",
7
+ "docs",
8
+ "example",
9
+ "examples",
10
+ "fixtures",
11
+ "samples",
12
+ "test",
13
+ "tests"
14
+ ]);
15
+ export function isArchitectureSource(path) {
16
+ const normalized = path.toLowerCase();
17
+ const segments = normalized.split("/");
18
+ if (segments.some((segment) => NON_PRODUCTION_SEGMENTS.has(segment))) {
19
+ return false;
20
+ }
21
+ return !(normalized.endsWith(".test.ts")
22
+ || normalized.endsWith(".test.tsx")
23
+ || normalized.endsWith(".test.js")
24
+ || normalized.endsWith(".test.jsx")
25
+ || normalized.endsWith(".spec.ts")
26
+ || normalized.endsWith(".spec.tsx")
27
+ || normalized.endsWith(".spec.js")
28
+ || normalized.endsWith(".spec.jsx"));
29
+ }
30
+ //# sourceMappingURL=sourceScope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceScope.js","sourceRoot":"","sources":["../../../src/analyzers/graph/sourceScope.ts"],"names":[],"mappings":"AAAA,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,cAAc;IACd,WAAW;IACX,WAAW;IACX,UAAU;IACV,MAAM;IACN,MAAM;IACN,SAAS;IACT,UAAU;IACV,UAAU;IACV,SAAS;IACT,MAAM;IACN,OAAO;CACR,CAAC,CAAC;AAEH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEvC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,CACN,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;WAC5B,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;WAChC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;WAC/B,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;WAChC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;WAC/B,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC;WAChC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC;WAC/B,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,CACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,58 @@
1
+ import type { EntityGraph } from "../analysis/index.js";
2
+ import type { CapabilityInfo } from "../detectors/index.js";
3
+ import type { FeatureInfo } from "../features/index.js";
4
+ import { type OwnershipPattern } from "./ownershipTopology.js";
5
+ export type DomainInferenceResult = {
6
+ /** e.g. "Code Snippet Manager", "E-Commerce Platform", "LMS" */
7
+ domain: string;
8
+ /** Human-readable summary of what the project does */
9
+ summary: string;
10
+ /** Domain-specific features AI inferred — tidak hardcode, truly dynamic */
11
+ domainFeatures: DomainFeature[];
12
+ confidence: number;
13
+ model: string;
14
+ /** Total tokens used — buat monitoring cost */
15
+ tokensUsed: number;
16
+ };
17
+ export type DomainFeature = {
18
+ name: string;
19
+ purpose: string;
20
+ relatedEntities: string[];
21
+ };
22
+ export type DomainInferenceInput = {
23
+ entityNames: string[];
24
+ relations: Array<{
25
+ from: string;
26
+ to: string;
27
+ kind: string;
28
+ }>;
29
+ capabilities: string[];
30
+ technicalFeatures: string[];
31
+ routeCount: number;
32
+ framework: string;
33
+ ownershipPattern: OwnershipPattern;
34
+ crossUserFields: string[];
35
+ absentCapabilities: string[];
36
+ };
37
+ /**
38
+ * inferDomain — kirim structured metadata ke AI, dapat domain understanding.
39
+ *
40
+ * INTENTIONALLY tidak kirim raw source code — hanya metadata terstruktur.
41
+ * Ini menjaga token usage minimal (~300-500 token per call) dan
42
+ * memastikan AI focus pada domain inference, bukan code analysis.
43
+ *
44
+ * Cache: result di-cache di .devmap/domain-cache.json berdasarkan hash input.
45
+ * Kalau input tidak berubah, cached result dipakai langsung (no LLM call).
46
+ * Ini memastikan analyze idempotent — feature names tidak berubah tiap run.
47
+ *
48
+ * Dipanggil SETELAH static analysis selesai (Step 1-4) — sebagai enhancement,
49
+ * bukan replacement. Kalau AI unavailable, static features tetap ada.
50
+ *
51
+ * @param input - Structured metadata dari static analysis
52
+ * @param callAI - Injected AI caller — decoupled dari provider specifics
53
+ * @param projectRoot - Root project path, untuk baca/tulis cache
54
+ */
55
+ export declare function inferDomain(input: DomainInferenceInput, callAI: (prompt: string) => Promise<string>, projectRoot?: string): Promise<DomainInferenceResult | null>;
56
+ export declare function domainFeaturesToFeatureInfo(domainFeatures: DomainFeature[]): FeatureInfo[];
57
+ export declare function buildDomainInferenceInput(entityGraph: EntityGraph, capabilities: CapabilityInfo[], features: FeatureInfo[], framework: string, routeCount: number): DomainInferenceInput;
58
+ //# sourceMappingURL=domainInference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domainInference.d.ts","sourceRoot":"","sources":["../../../src/analyzers/inference/domainInference.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,uBAAuB,CAAC;AAC5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAA6B,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAS1F,MAAM,MAAM,qBAAqB,GAAG;IAClC,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B,CAAC;AAgFF;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,oBAAoB,EAC3B,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,EAC3C,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAgCvC;AA4GD,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,aAAa,EAAE,GAC9B,WAAW,EAAE,CAmBf;AAWD,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,cAAc,EAAE,EAC9B,QAAQ,EAAE,WAAW,EAAE,EACvB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,oBAAoB,CAuBtB"}
@@ -0,0 +1,234 @@
1
+ import { classifyOwnershipTopology } from "./ownershipTopology.js";
2
+ import { createHash } from "node:crypto";
3
+ import { readFile, writeFile, mkdir } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ function hashDomainInput(input) {
6
+ const stable = JSON.stringify({
7
+ v: 2,
8
+ entityNames: [...input.entityNames].sort(),
9
+ relations: [...input.relations]
10
+ .map((r) => `${r.from}:${r.kind}:${r.to}`)
11
+ .sort(),
12
+ capabilities: [...input.capabilities].sort(),
13
+ technicalFeatures: [...input.technicalFeatures].sort(),
14
+ routeCount: input.routeCount,
15
+ framework: input.framework,
16
+ ownershipPattern: input.ownershipPattern,
17
+ crossUserFields: [...input.crossUserFields].sort(),
18
+ absentCapabilities: [...input.absentCapabilities].sort(),
19
+ });
20
+ return createHash("sha256").update(stable).digest("hex").slice(0, 16);
21
+ }
22
+ async function readDomainCache(projectRoot, inputHash) {
23
+ try {
24
+ const cachePath = join(projectRoot, ".devmap", "domain-cache.json");
25
+ const raw = await readFile(cachePath, "utf-8");
26
+ const cache = JSON.parse(raw);
27
+ if (cache.inputHash !== inputHash)
28
+ return null; // input berubah → stale
29
+ return cache.result;
30
+ }
31
+ catch {
32
+ return null; // file tidak ada atau corrupt → miss
33
+ }
34
+ }
35
+ async function writeDomainCache(projectRoot, inputHash, result) {
36
+ try {
37
+ const devmapDir = join(projectRoot, ".devmap");
38
+ await mkdir(devmapDir, { recursive: true });
39
+ const cachePath = join(devmapDir, "domain-cache.json");
40
+ const cache = {
41
+ inputHash,
42
+ result,
43
+ cachedAt: new Date().toISOString(),
44
+ };
45
+ await writeFile(cachePath, JSON.stringify(cache, null, 2) + "\n", "utf-8");
46
+ }
47
+ catch {
48
+ // Cache write gagal = non-fatal, lanjut tanpa cache
49
+ }
50
+ }
51
+ // ---------------------------------------------------------------------------
52
+ // Main entry
53
+ // ---------------------------------------------------------------------------
54
+ /**
55
+ * inferDomain — kirim structured metadata ke AI, dapat domain understanding.
56
+ *
57
+ * INTENTIONALLY tidak kirim raw source code — hanya metadata terstruktur.
58
+ * Ini menjaga token usage minimal (~300-500 token per call) dan
59
+ * memastikan AI focus pada domain inference, bukan code analysis.
60
+ *
61
+ * Cache: result di-cache di .devmap/domain-cache.json berdasarkan hash input.
62
+ * Kalau input tidak berubah, cached result dipakai langsung (no LLM call).
63
+ * Ini memastikan analyze idempotent — feature names tidak berubah tiap run.
64
+ *
65
+ * Dipanggil SETELAH static analysis selesai (Step 1-4) — sebagai enhancement,
66
+ * bukan replacement. Kalau AI unavailable, static features tetap ada.
67
+ *
68
+ * @param input - Structured metadata dari static analysis
69
+ * @param callAI - Injected AI caller — decoupled dari provider specifics
70
+ * @param projectRoot - Root project path, untuk baca/tulis cache
71
+ */
72
+ export async function inferDomain(input, callAI, projectRoot) {
73
+ // Skip kalau data terlalu sedikit — AI inference gak akan meaningful
74
+ if (input.entityNames.length === 0 && input.capabilities.length === 0) {
75
+ return null;
76
+ }
77
+ const inputHash = hashDomainInput(input);
78
+ // Cache hit → return langsung, no LLM call
79
+ if (projectRoot) {
80
+ const cached = await readDomainCache(projectRoot, inputHash);
81
+ if (cached)
82
+ return cached;
83
+ }
84
+ const prompt = buildDomainInferencePrompt(input);
85
+ try {
86
+ const raw = await callAI(prompt);
87
+ const result = parseDomainInferenceResponse(raw, input);
88
+ if (!result)
89
+ return null;
90
+ // Tulis ke cache buat run berikutnya
91
+ if (projectRoot) {
92
+ await writeDomainCache(projectRoot, inputHash, result);
93
+ }
94
+ return result;
95
+ }
96
+ catch {
97
+ // AI inference adalah enhancement, bukan blocker
98
+ // Kalau gagal, return null — caller tetap punya static features
99
+ return null;
100
+ }
101
+ }
102
+ // ---------------------------------------------------------------------------
103
+ // Prompt builder
104
+ // ---------------------------------------------------------------------------
105
+ /**
106
+ * buildDomainInferencePrompt — build minimal, structured prompt.
107
+ *
108
+ * Design principles:
109
+ * - Compact: hanya kirim yang AI butuhkan
110
+ * - Structured: JSON input biar AI gak perlu parse prose
111
+ * - Focused: satu task, satu output format
112
+ * - Bounded: max_tokens 600 cukup buat domain inference
113
+ */
114
+ function buildDomainInferencePrompt(input) {
115
+ const metadata = JSON.stringify({
116
+ framework: input.framework,
117
+ entities: input.entityNames,
118
+ relations: input.relations.map((r) => `${r.from} ${r.kind} ${r.to}`),
119
+ capabilities: input.capabilities,
120
+ technicalFeatures: input.technicalFeatures,
121
+ routeCount: input.routeCount,
122
+ ownershipPattern: input.ownershipPattern,
123
+ crossUserFields: input.crossUserFields,
124
+ absentCapabilities: input.absentCapabilities,
125
+ }, null, 2);
126
+ return `You are analyzing a software project. Given this structural metadata, infer the project domain.
127
+
128
+ ${metadata}
129
+
130
+ Respond with ONLY a JSON object (no markdown, no explanation):
131
+ {
132
+ "domain": "short domain name, e.g. Code Snippet Manager",
133
+ "summary": "1-2 sentences describing what this project does",
134
+ "confidence": 0.0-1.0,
135
+ "domainFeatures": [
136
+ {
137
+ "name": "Feature Name",
138
+ "purpose": "What this feature does",
139
+ "relatedEntities": ["Entity1", "Entity2"]
140
+ }
141
+ ]
142
+ }
143
+
144
+ Rules:
145
+ - domainFeatures: 3-6 features specific to this domain, not generic technical features
146
+ - Do not include Authentication, Database, or other infrastructure as domainFeatures
147
+ - Base everything on the metadata provided, not assumptions
148
+ - Entity names alone (e.g. 'Message', 'Room', 'User') are NOT reliable signals of application domain. The same entity name can represent a chat message, an activity log, a personal note, or a comment — depending on ownership pattern, not naming. Use ownershipPattern and absentCapabilities as primary evidence: single_user_isolated strongly suggests a personal/private tool (notes, journal, tracker), not a multi-user communication platform. Only conclude 'chat' or 'messaging' domain if ownershipPattern is shared_access or direct_messaging, or detectedCapabilities includes collaboration/social/real-time.`;
149
+ }
150
+ // ---------------------------------------------------------------------------
151
+ // Response parser
152
+ // ---------------------------------------------------------------------------
153
+ function parseDomainInferenceResponse(raw, input) {
154
+ try {
155
+ // Strip markdown fences kalau ada
156
+ const cleaned = raw
157
+ .replace(/^```json\s*/i, "")
158
+ .replace(/^```\s*/i, "")
159
+ .replace(/```\s*$/i, "")
160
+ .trim();
161
+ const parsed = JSON.parse(cleaned);
162
+ if (!parsed.domain || !parsed.summary)
163
+ return null;
164
+ const domainFeatures = (parsed.domainFeatures ?? [])
165
+ .filter((f) => f.name && f.purpose)
166
+ .map((f) => ({
167
+ name: f.name,
168
+ purpose: f.purpose,
169
+ relatedEntities: f.relatedEntities ?? []
170
+ }))
171
+ .slice(0, 6);
172
+ return {
173
+ domain: parsed.domain,
174
+ summary: parsed.summary,
175
+ domainFeatures,
176
+ confidence: Math.min(1, Math.max(0, parsed.confidence ?? 0.7)),
177
+ model: "unknown", // diisi caller
178
+ tokensUsed: 0 // diisi caller
179
+ };
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ }
185
+ // ---------------------------------------------------------------------------
186
+ // Helper — convert DomainFeature ke FeatureInfo buat merge ke snapshot
187
+ // ---------------------------------------------------------------------------
188
+ export function domainFeaturesToFeatureInfo(domainFeatures) {
189
+ return domainFeatures.map((df) => ({
190
+ name: df.name,
191
+ purpose: df.purpose,
192
+ files: [],
193
+ entryPoints: [],
194
+ businessFlow: [],
195
+ // searchTerms include relatedEntities agar similarity engine dapat
196
+ // mencocokkan AI feature dengan static feature via entity overlap.
197
+ // Contoh: AI returns relatedEntities: ["Plan", "Subscription"]
198
+ // Static feature "Plan Management" punya searchTerms: ["plan", "subscription", ...]
199
+ // → entityOverlap / termOverlap tinggi → di-merge, bukan duplicate.
200
+ searchTerms: [
201
+ ...df.relatedEntities.map((e) => e.toLowerCase()),
202
+ ...df.name.toLowerCase().split(/\s+/).filter(Boolean)
203
+ ].filter((v, i, arr) => arr.indexOf(v) === i).slice(0, 12),
204
+ confidence: "medium", // AI-inferred = medium, bukan high
205
+ evidence: []
206
+ }));
207
+ }
208
+ // ---------------------------------------------------------------------------
209
+ // Helper — build DomainInferenceInput dari projectMap data
210
+ // ---------------------------------------------------------------------------
211
+ const ALL_CAPABILITY_KINDS = [
212
+ "crud", "sharing", "collaboration", "discovery", "publishing",
213
+ "social", "file-management", "real-time", "search", "reporting",
214
+ ];
215
+ export function buildDomainInferenceInput(entityGraph, capabilities, features, framework, routeCount) {
216
+ const detectedKinds = new Set(capabilities.map((c) => c.kind));
217
+ const absentCapabilities = ALL_CAPABILITY_KINDS.filter((k) => !detectedKinds.has(k));
218
+ const ownershipResult = classifyOwnershipTopology(entityGraph, entityGraph.relations);
219
+ return {
220
+ entityNames: entityGraph.entityNames.slice(0, 15),
221
+ relations: entityGraph.relations.slice(0, 10),
222
+ capabilities: [...detectedKinds],
223
+ technicalFeatures: features
224
+ .filter((f) => f.confidence === "high" || f.confidence === "medium")
225
+ .map((f) => f.name)
226
+ .slice(0, 10),
227
+ framework,
228
+ routeCount,
229
+ ownershipPattern: ownershipResult.pattern,
230
+ crossUserFields: ownershipResult.crossUserFields.slice(0, 5),
231
+ absentCapabilities: absentCapabilities.slice(0, 8),
232
+ };
233
+ }
234
+ //# sourceMappingURL=domainInference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domainInference.js","sourceRoot":"","sources":["../../../src/analyzers/inference/domainInference.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { inferDomain, domainFeaturesToFeatureInfo, buildDomainInferenceInput, } from "./domainInference.js";
2
+ export type { DomainInferenceResult, DomainFeature, DomainInferenceInput, } from "./domainInference.js";
3
+ export { classifyOwnershipTopology, } from "./ownershipTopology.js";
4
+ export type { OwnershipPattern, } from "./ownershipTopology.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzers/inference/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,qBAAqB,EACrB,aAAa,EACb,oBAAoB,GACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,gBAAgB,GACjB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { inferDomain, domainFeaturesToFeatureInfo, buildDomainInferenceInput, } from "./domainInference.js";
2
+ export { classifyOwnershipTopology, } from "./ownershipTopology.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/inference/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EACL,yBAAyB,GAC1B,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { EntityGraph, RelationInfo } from "../analysis/index.js";
2
+ export type OwnershipPattern = "single_user_isolated" | "shared_access" | "direct_messaging" | "unclear";
3
+ export declare function classifyOwnershipTopology(entityGraph: EntityGraph, relations: RelationInfo[]): {
4
+ pattern: OwnershipPattern;
5
+ crossUserFields: string[];
6
+ evidence: string[];
7
+ };
8
+ //# sourceMappingURL=ownershipTopology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownershipTopology.d.ts","sourceRoot":"","sources":["../../../src/analyzers/inference/ownershipTopology.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEtE,MAAM,MAAM,gBAAgB,GACxB,sBAAsB,GACtB,eAAe,GACf,kBAAkB,GAClB,SAAS,CAAC;AAWd,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,YAAY,EAAE,GACxB;IACD,OAAO,EAAE,gBAAgB,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CAkEA"}
@@ -0,0 +1,65 @@
1
+ const CROSS_USER_FIELD_NAMES = [
2
+ "participants", "members", "invitedby", "sharedwith", "sharedby",
3
+ "recipientid", "senderid", "collaborators", "inviteeid", "inviterid",
4
+ ];
5
+ function normalizeFieldName(name) {
6
+ return name.replace(/[^a-z0-9]/g, "").toLowerCase();
7
+ }
8
+ export function classifyOwnershipTopology(entityGraph, relations) {
9
+ const crossUserFields = [];
10
+ const evidence = [];
11
+ const userEntityName = entityGraph.entities.find((e) => e.name.toLowerCase() === "user")?.name ?? "User";
12
+ for (const entity of entityGraph.entities) {
13
+ for (const field of entity.fields) {
14
+ const normalized = normalizeFieldName(field.name);
15
+ if (CROSS_USER_FIELD_NAMES.includes(normalized)) {
16
+ crossUserFields.push(`${entity.name}.${field.name}`);
17
+ evidence.push(`field:${entity.name}.${field.name}`);
18
+ }
19
+ }
20
+ }
21
+ const multiUserRelations = relations.filter((r) => r.kind === "many-to-many"
22
+ && (r.from === userEntityName || r.to === userEntityName));
23
+ if (multiUserRelations.length > 0) {
24
+ evidence.push(`many-to-many:${userEntityName} ↔ ${multiUserRelations.map(r => r.from === userEntityName ? r.to : r.from).join(", ")}`);
25
+ }
26
+ const userFksInEntity = new Map();
27
+ for (const entity of entityGraph.entities) {
28
+ if (entity.name === userEntityName)
29
+ continue;
30
+ const userFks = entity.fields
31
+ .filter((f) => f.type === userEntityName || f.type === "String" || f.type === "Int")
32
+ .filter((f) => /(id|Id)$/.test(f.name))
33
+ .filter((f) => normalizeFieldName(f.name).includes(normalizeFieldName(userEntityName)));
34
+ if (userFks.length >= 2) {
35
+ userFksInEntity.set(entity.name, userFks.map(f => f.name));
36
+ }
37
+ }
38
+ for (const [entity, fks] of userFksInEntity) {
39
+ evidence.push(`multi-fk:${entity} has ${fks.length} FK to User (${fks.join(", ")})`);
40
+ }
41
+ const directMsgEntities = [...userFksInEntity.entries()]
42
+ .filter(([_, fks]) => {
43
+ const lowerFks = fks.map(f => normalizeFieldName(f));
44
+ return lowerFks.some(f => f.includes("sender") || f.includes("recipient"));
45
+ })
46
+ .map(([entity]) => entity);
47
+ if (directMsgEntities.length > 0) {
48
+ evidence.push(`direct_messaging:${directMsgEntities.join(", ")}`);
49
+ }
50
+ let pattern;
51
+ if (directMsgEntities.length > 0 && crossUserFields.length > 0) {
52
+ pattern = "direct_messaging";
53
+ }
54
+ else if (multiUserRelations.length > 0 || crossUserFields.length > 0) {
55
+ pattern = "shared_access";
56
+ }
57
+ else if (entityGraph.entities.length > 1 && multiUserRelations.length === 0 && crossUserFields.length === 0) {
58
+ pattern = "single_user_isolated";
59
+ }
60
+ else {
61
+ pattern = "unclear";
62
+ }
63
+ return { pattern, crossUserFields, evidence };
64
+ }
65
+ //# sourceMappingURL=ownershipTopology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownershipTopology.js","sourceRoot":"","sources":["../../../src/analyzers/inference/ownershipTopology.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AnalyzerContext, FileAnalysis, FileAnalyzer } from "../analysis/index.js";
2
+ import type { ScannedFile } from "../analysis/index.js";
3
+ export declare class AnalyzerRegistry {
4
+ private readonly analyzers;
5
+ constructor(analyzers: FileAnalyzer[]);
6
+ analyze(file: ScannedFile, context: AnalyzerContext): Promise<FileAnalysis>;
7
+ }
8
+ export declare function analyzeFiles(files: ScannedFile[]): Promise<Record<string, FileAnalysis>>;
9
+ //# sourceMappingURL=analyzerRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzerRegistry.d.ts","sourceRoot":"","sources":["../../../src/analyzers/pipeline/analyzerRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EACb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAIxD,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,YAAY,EAAE;IAEhD,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;CAalF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAa9F"}
@@ -0,0 +1,35 @@
1
+ import { FallbackAnalyzer, HeuristicAnalyzer } from "./heuristicAnalyzer.js";
2
+ import { TsMorphAnalyzer } from "../analysis/index.js";
3
+ export class AnalyzerRegistry {
4
+ analyzers;
5
+ constructor(analyzers) {
6
+ this.analyzers = analyzers;
7
+ }
8
+ async analyze(file, context) {
9
+ for (const analyzer of this.analyzers) {
10
+ if (!analyzer.supports(file))
11
+ continue;
12
+ try {
13
+ return await analyzer.analyze(file, context);
14
+ }
15
+ catch {
16
+ // Continue to the next analyzer so malformed source still receives metadata.
17
+ }
18
+ }
19
+ throw new Error(`No analyzer supports ${file.path}.`);
20
+ }
21
+ }
22
+ export async function analyzeFiles(files) {
23
+ const registry = new AnalyzerRegistry([
24
+ new TsMorphAnalyzer(),
25
+ new HeuristicAnalyzer(),
26
+ new FallbackAnalyzer()
27
+ ]);
28
+ const context = { files };
29
+ const entries = await Promise.all(files.map(async (file) => [
30
+ file.path,
31
+ await registry.analyze(file, context)
32
+ ]));
33
+ return Object.fromEntries(entries);
34
+ }
35
+ //# sourceMappingURL=analyzerRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzerRegistry.js","sourceRoot":"","sources":["../../../src/analyzers/pipeline/analyzerRegistry.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,MAAM,OAAO,gBAAgB;IACE;IAA7B,YAA6B,SAAyB;QAAzB,cAAS,GAAT,SAAS,CAAgB;IAAG,CAAC;IAE1D,KAAK,CAAC,OAAO,CAAC,IAAiB,EAAE,OAAwB;QACvD,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,SAAS;YAEvC,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;YAAC,MAAM,CAAC;gBACP,6EAA6E;YAC/E,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;IACxD,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAoB;IACrD,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CAAC;QACpC,IAAI,eAAe,EAAE;QACrB,IAAI,iBAAiB,EAAE;QACvB,IAAI,gBAAgB,EAAE;KACvB,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC;QAC1D,IAAI,CAAC,IAAI;QACT,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;KAC7B,CAAC,CAAC,CAAC;IAEb,OAAO,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { AnalyzerContext, FileAnalysis, FileAnalyzer, ScannedFile } from "../analysis/index.js";
2
+ export declare class HeuristicAnalyzer implements FileAnalyzer {
3
+ readonly id = "heuristic";
4
+ supports(file: ScannedFile): boolean;
5
+ analyze(file: ScannedFile, _context: AnalyzerContext): Promise<FileAnalysis>;
6
+ }
7
+ export declare class FallbackAnalyzer implements FileAnalyzer {
8
+ readonly id = "fallback";
9
+ supports(_file: ScannedFile): boolean;
10
+ analyze(_file: ScannedFile, _context: AnalyzerContext): Promise<FileAnalysis>;
11
+ }
12
+ //# sourceMappingURL=heuristicAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heuristicAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/analyzers/pipeline/heuristicAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EACZ,YAAY,EAGZ,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAuB9B,qBAAa,iBAAkB,YAAW,YAAY;IACpD,QAAQ,CAAC,EAAE,eAAe;IAE1B,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO;IAI9B,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;CA8BnF;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,EAAE,cAAc;IAEzB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO;IAI/B,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,YAAY,CAAC;CAUpF"}