@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,264 @@
1
+ /**
2
+ * featureSimilarity.ts
3
+ *
4
+ * Reusable similarity engine untuk feature identity comparison.
5
+ *
6
+ * Design goals:
7
+ * - Tidak bergantung pada feature name sebagai primary identity
8
+ * - Weighted multi-factor scoring: files, entities, searchTerms, description
9
+ * - Groundwork untuk future fingerprint system
10
+ * - No heuristic string tricks (substring, includes, normalize-only)
11
+ *
12
+ * Scoring model:
13
+ * Setiap faktor diberi bobot berbeda tergantung reliability-nya.
14
+ * File overlap = paling reliable (concrete evidence).
15
+ * Name similarity = least reliable (AI dapat berubah wording).
16
+ *
17
+ * Composite score 0.0 - 1.0.
18
+ * Threshold default 0.35 — dipilih biar:
19
+ * - "Plan Management" ↔ "Customizable Plans" MATCH (entity + terms overlap)
20
+ * - "Authentication" ↔ "Search" TIDAK MATCH (no overlap)
21
+ * - "Search" ↔ "Search Functionality" MATCH (terms overlap)
22
+ */
23
+ // ---------------------------------------------------------------------------
24
+ // Config
25
+ // ---------------------------------------------------------------------------
26
+ /**
27
+ * MAX_SEARCH_TERMS — cross-cutting constant untuk search term cap.
28
+ * Konsisten dengan featureDetector. Dipakai di similarity engine dan merge.
29
+ */
30
+ export const MAX_SEARCH_TERMS = 8;
31
+ const DEFAULT_WEIGHTS = {
32
+ fileOverlap: 0.45,
33
+ termOverlap: 0.25,
34
+ entityOverlap: 0.20,
35
+ nameSimilarity: 0.10,
36
+ };
37
+ export const DEFAULT_SIMILARITY_CONFIG = {
38
+ weights: DEFAULT_WEIGHTS,
39
+ threshold: 0.35,
40
+ };
41
+ /**
42
+ * DEFAULT_SIMILARITY_THRESHOLD — backward compat alias.
43
+ */
44
+ export const DEFAULT_SIMILARITY_THRESHOLD = DEFAULT_SIMILARITY_CONFIG.threshold;
45
+ // ---------------------------------------------------------------------------
46
+ // Public API
47
+ // ---------------------------------------------------------------------------
48
+ function resolveConfig(config) {
49
+ return config ?? DEFAULT_SIMILARITY_CONFIG;
50
+ }
51
+ /**
52
+ * computeSimilarity — hitung composite similarity score antara dua feature.
53
+ *
54
+ * @returns 0.0 - 1.0 (0 = no similarity, 1 = identical)
55
+ */
56
+ export function computeSimilarity(a, b, config) {
57
+ const { weights } = resolveConfig(config);
58
+ const fileScore = jaccardSimilarity(new Set(a.files), new Set(b.files));
59
+ const termScore = jaccardSimilarity(new Set(normTerms(a.searchTerms)), new Set(normTerms(b.searchTerms)));
60
+ const entityScore = jaccardSimilarity(new Set(normTerms(a.relatedEntities)), new Set(normTerms(b.relatedEntities)));
61
+ const nameScore = trigramSimilarity(a.name, b.name);
62
+ return (fileScore * weights.fileOverlap +
63
+ termScore * weights.termOverlap +
64
+ entityScore * weights.entityOverlap +
65
+ nameScore * weights.nameSimilarity);
66
+ }
67
+ /**
68
+ * isSimilarFeature — convenience wrapper dengan threshold.
69
+ */
70
+ export function isSimilarFeature(a, b, thresholdOrConfig) {
71
+ if (typeof thresholdOrConfig === "number") {
72
+ return computeSimilarity(a, b) >= thresholdOrConfig;
73
+ }
74
+ const config = resolveConfig(thresholdOrConfig);
75
+ return computeSimilarity(a, b, config) >= config.threshold;
76
+ }
77
+ /**
78
+ * findSimilarFeature — cari feature di list yang paling similar ke candidate.
79
+ *
80
+ * Return { index, score } dari match terbaik, atau null kalau tidak ada yang
81
+ * melewati threshold.
82
+ */
83
+ export function findSimilarFeature(candidates, target, thresholdOrConfig) {
84
+ const config = resolveConfig(typeof thresholdOrConfig === "object" ? thresholdOrConfig : undefined);
85
+ const threshold = typeof thresholdOrConfig === "number"
86
+ ? thresholdOrConfig
87
+ : config.threshold;
88
+ let bestIndex = -1;
89
+ let bestScore = 0;
90
+ for (let i = 0; i < candidates.length; i++) {
91
+ const score = computeSimilarity(candidates[i], target, config);
92
+ if (score > bestScore) {
93
+ bestScore = score;
94
+ bestIndex = i;
95
+ }
96
+ }
97
+ if (bestIndex === -1 || bestScore < threshold)
98
+ return null;
99
+ return { index: bestIndex, score: bestScore };
100
+ }
101
+ /**
102
+ * computeSimilarityWithExplanation — seperti computeSimilarity, tapi return
103
+ * breakdown detail buat debugging.
104
+ * @internal
105
+ */
106
+ export function computeSimilarityWithExplanation(a, b, config) {
107
+ const { weights, threshold } = resolveConfig(config);
108
+ const fileScore = jaccardSimilarity(new Set(a.files), new Set(b.files));
109
+ const termScore = jaccardSimilarity(new Set(normTerms(a.searchTerms)), new Set(normTerms(b.searchTerms)));
110
+ const entityScore = jaccardSimilarity(new Set(normTerms(a.relatedEntities)), new Set(normTerms(b.relatedEntities)));
111
+ const nameScore = trigramSimilarity(a.name, b.name);
112
+ const factors = {
113
+ fileOverlap: {
114
+ score: fileScore,
115
+ weight: weights.fileOverlap,
116
+ contribution: fileScore * weights.fileOverlap,
117
+ detail: a.files.length === 0 && b.files.length === 0
118
+ ? "both empty"
119
+ : a.files.length === 0 || b.files.length === 0
120
+ ? "one side empty"
121
+ : `overlap ${describeFilesOverlap(a.files, b.files)}`,
122
+ },
123
+ termOverlap: {
124
+ score: termScore,
125
+ weight: weights.termOverlap,
126
+ contribution: termScore * weights.termOverlap,
127
+ detail: a.searchTerms.length === 0 && b.searchTerms.length === 0
128
+ ? "both empty"
129
+ : a.searchTerms.length === 0 || b.searchTerms.length === 0
130
+ ? "one side empty"
131
+ : `jaccard ${termScore.toFixed(3)}`,
132
+ },
133
+ entityOverlap: {
134
+ score: entityScore,
135
+ weight: weights.entityOverlap,
136
+ contribution: entityScore * weights.entityOverlap,
137
+ detail: a.relatedEntities.length === 0 && b.relatedEntities.length === 0
138
+ ? "both empty"
139
+ : a.relatedEntities.length === 0 || b.relatedEntities.length === 0
140
+ ? "one side empty"
141
+ : `jaccard ${entityScore.toFixed(3)}`,
142
+ },
143
+ nameSimilarity: {
144
+ score: nameScore,
145
+ weight: weights.nameSimilarity,
146
+ contribution: nameScore * weights.nameSimilarity,
147
+ detail: `trigram ${nameScore.toFixed(3)}`,
148
+ },
149
+ };
150
+ const total = factors.fileOverlap.contribution
151
+ + factors.termOverlap.contribution
152
+ + factors.entityOverlap.contribution
153
+ + factors.nameSimilarity.contribution;
154
+ const weaknesses = [];
155
+ if (a.files.length === 0 || b.files.length === 0) {
156
+ weaknesses.push("one or both sides have no files — fileOverlap may be unreliable");
157
+ }
158
+ if (total < threshold && total >= threshold - 0.1) {
159
+ weaknesses.push(`score ${total.toFixed(3)} is close to threshold ${threshold}`);
160
+ }
161
+ return {
162
+ score: total,
163
+ threshold,
164
+ similar: total >= threshold,
165
+ factors,
166
+ weaknesses,
167
+ };
168
+ }
169
+ function describeFilesOverlap(a, b) {
170
+ const setA = new Set(a);
171
+ const overlap = b.filter((f) => setA.has(f));
172
+ return overlap.length > 0
173
+ ? `${overlap.length}/${Math.max(a.length, b.length)} files`
174
+ : "none";
175
+ }
176
+ // ---------------------------------------------------------------------------
177
+ // Similarity algorithms
178
+ // ---------------------------------------------------------------------------
179
+ /**
180
+ * jaccardSimilarity — |A ∩ B| / |A ∪ B|
181
+ *
182
+ * Dipakai untuk set-based features (files, terms, entities).
183
+ * Return 1.0 kalau keduanya empty (dua feature tanpa data tidak conflicting).
184
+ * Return 0.0 kalau salah satu empty dan yang lain tidak.
185
+ */
186
+ export function jaccardSimilarity(a, b) {
187
+ if (a.size === 0 && b.size === 0)
188
+ return 1.0;
189
+ if (a.size === 0 || b.size === 0)
190
+ return 0.0;
191
+ let intersection = 0;
192
+ for (const item of a) {
193
+ if (b.has(item))
194
+ intersection++;
195
+ }
196
+ const union = a.size + b.size - intersection;
197
+ return union === 0 ? 1.0 : intersection / union;
198
+ }
199
+ /**
200
+ * trigramSimilarity — Dice coefficient pada character trigrams.
201
+ *
202
+ * Lebih robust dari Levenshtein untuk perbandingan nama pendek.
203
+ * "Plan Management" ↔ "Customizable Plans" → ~0.28
204
+ * "Authentication" ↔ "Authentication System" → ~0.82
205
+ * "Search" ↔ "Search Functionality" → ~0.55
206
+ *
207
+ * Dipakai sebagai soft signal saja (weight 0.10) karena AI wording volatile.
208
+ */
209
+ export function trigramSimilarity(a, b) {
210
+ const ta = buildTrigrams(a.toLowerCase());
211
+ const tb = buildTrigrams(b.toLowerCase());
212
+ if (ta.size === 0 && tb.size === 0)
213
+ return 1.0;
214
+ if (ta.size === 0 || tb.size === 0)
215
+ return 0.0;
216
+ let intersection = 0;
217
+ for (const g of ta) {
218
+ if (tb.has(g))
219
+ intersection++;
220
+ }
221
+ // Dice coefficient: 2 * |A ∩ B| / (|A| + |B|)
222
+ return (2 * intersection) / (ta.size + tb.size);
223
+ }
224
+ function buildTrigrams(s) {
225
+ const grams = new Set();
226
+ const padded = ` ${s} `;
227
+ for (let i = 0; i < padded.length - 2; i++) {
228
+ grams.add(padded.slice(i, i + 3));
229
+ }
230
+ return grams;
231
+ }
232
+ // ---------------------------------------------------------------------------
233
+ // Normalization helpers
234
+ // ---------------------------------------------------------------------------
235
+ /**
236
+ * normTerms — lowercase semua terms untuk case-insensitive comparison.
237
+ * Tidak strip stopwords — terlalu agresif dan bisa hilangkan signal penting.
238
+ */
239
+ function normTerms(terms) {
240
+ return terms.map((t) => t.toLowerCase().trim()).filter(Boolean);
241
+ }
242
+ export function buildFeatureFingerprint(identity) {
243
+ return {
244
+ fileSignature: [...identity.files].sort().join("|"),
245
+ termSignature: [...normTerms(identity.searchTerms)].sort().join("|"),
246
+ entitySignature: [...normTerms(identity.relatedEntities)].sort().join("|"),
247
+ };
248
+ }
249
+ /**
250
+ * fingerprintSimilarity — compare dua fingerprint secara segment-by-segment.
251
+ * Alternative entry point kalau future code ingin compare fingerprints
252
+ * tanpa reconstruct full FeatureIdentity.
253
+ */
254
+ export function fingerprintSimilarity(a, b) {
255
+ const fileScore = jaccardSimilarity(new Set(a.fileSignature.split("|").filter(Boolean)), new Set(b.fileSignature.split("|").filter(Boolean)));
256
+ const termScore = jaccardSimilarity(new Set(a.termSignature.split("|").filter(Boolean)), new Set(b.termSignature.split("|").filter(Boolean)));
257
+ const entityScore = jaccardSimilarity(new Set(a.entitySignature.split("|").filter(Boolean)), new Set(b.entitySignature.split("|").filter(Boolean)));
258
+ // tanpa nameSimilarity karena fingerprint tidak menyimpan nama
259
+ const { weights } = DEFAULT_SIMILARITY_CONFIG;
260
+ return (fileScore * (weights.fileOverlap / (1 - weights.nameSimilarity)) +
261
+ termScore * (weights.termOverlap / (1 - weights.nameSimilarity)) +
262
+ entityScore * (weights.entityOverlap / (1 - weights.nameSimilarity)));
263
+ }
264
+ //# sourceMappingURL=featureSimilarity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"featureSimilarity.js","sourceRoot":"","sources":["../../../src/analyzers/features/featureSimilarity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { detectFeatures, detectAuthenticationSemanticRole, orderAuthenticationFiles, authenticationFilePriority, classifyFileTier, } from "./featureDetector.js";
2
+ export type { FeatureInfo, AuthSemanticRole, FileTier, } from "./featureDetector.js";
3
+ export { toFeatureIdentity, mergeIntoFeatureList, mergeFeatureData, mergeDomainFeatures, } from "./featureMerge.js";
4
+ export { computeSimilarity, isSimilarFeature, findSimilarFeature, jaccardSimilarity, trigramSimilarity, buildFeatureFingerprint, fingerprintSimilarity, DEFAULT_SIMILARITY_THRESHOLD, } from "./featureSimilarity.js";
5
+ export type { FeatureIdentity, FeatureFingerprint, } from "./featureSimilarity.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzers/features/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,gCAAgC,EAChC,wBAAwB,EACxB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,QAAQ,GACT,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC;AAChC,YAAY,EACV,eAAe,EACf,kBAAkB,GACnB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { detectFeatures, detectAuthenticationSemanticRole, orderAuthenticationFiles, authenticationFilePriority, classifyFileTier, } from "./featureDetector.js";
2
+ export { toFeatureIdentity, mergeIntoFeatureList, mergeFeatureData, mergeDomainFeatures, } from "./featureMerge.js";
3
+ export { computeSimilarity, isSimilarFeature, findSimilarFeature, jaccardSimilarity, trigramSimilarity, buildFeatureFingerprint, fingerprintSimilarity, DEFAULT_SIMILARITY_THRESHOLD, } from "./featureSimilarity.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/features/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,gCAAgC,EAChC,wBAAwB,EACxB,0BAA0B,EAC1B,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EACL,iBAAiB,EACjB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,EACvB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FileAnalysis, ScannedFile } from "../analysis/index.js";
2
+ export type FileGraph = Record<string, string[]>;
3
+ export declare function buildDependencyGraph(files: ScannedFile[], analyses?: Record<string, FileAnalysis>): FileGraph;
4
+ export declare function countReferences(graph: FileGraph): Record<string, number>;
5
+ //# sourceMappingURL=dependencyGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyGraph.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/dependencyGraph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEtE,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AAIjD,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAAE,EACpB,QAAQ,GAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAM,GAC1C,SAAS,CAqBX;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAUxE"}
@@ -0,0 +1,88 @@
1
+ const IMPORT_RE = /(?:import\s+(?:[^'"]+\s+from\s+)?|export\s+[^'"]+\s+from\s+|require\()\s*['"]([^'"]+)['"]/g;
2
+ export function buildDependencyGraph(files, analyses = {}) {
3
+ const graph = {};
4
+ const localPaths = new Set(files.map((file) => file.path));
5
+ for (const file of files) {
6
+ graph[file.path] = [];
7
+ const importSpecifiers = analyses[file.path]?.imports ?? findImportSpecifiers(file.content);
8
+ for (const specifier of importSpecifiers) {
9
+ if (!specifier.startsWith(".")) {
10
+ continue;
11
+ }
12
+ const resolved = resolveImport(file.path, specifier, localPaths);
13
+ if (resolved) {
14
+ graph[file.path].push(resolved);
15
+ }
16
+ }
17
+ }
18
+ return graph;
19
+ }
20
+ export function countReferences(graph) {
21
+ const counts = {};
22
+ for (const imports of Object.values(graph)) {
23
+ for (const imported of imports) {
24
+ counts[imported] = (counts[imported] ?? 0) + 1;
25
+ }
26
+ }
27
+ return counts;
28
+ }
29
+ function findImportSpecifiers(content) {
30
+ const matches = [];
31
+ IMPORT_RE.lastIndex = 0;
32
+ let match = IMPORT_RE.exec(content);
33
+ while (match) {
34
+ matches.push(match[1]);
35
+ match = IMPORT_RE.exec(content);
36
+ }
37
+ return matches;
38
+ }
39
+ function resolveImport(fromPath, specifier, localPaths) {
40
+ const baseParts = fromPath.split("/");
41
+ baseParts.pop();
42
+ const normalized = normalizePath([...baseParts, specifier].join("/"));
43
+ const candidates = [
44
+ normalized,
45
+ `${normalized}.ts`,
46
+ `${normalized}.tsx`,
47
+ `${normalized}.js`,
48
+ `${normalized}.jsx`,
49
+ `${normalized}.mjs`,
50
+ `${normalized}.cjs`,
51
+ `${normalized}.vue`,
52
+ `${normalized}.svelte`,
53
+ `${normalized}.astro`,
54
+ `${normalized}/index.ts`,
55
+ `${normalized}/index.tsx`,
56
+ `${normalized}/index.js`,
57
+ `${normalized}/index.jsx`,
58
+ `${normalized}/index.vue`,
59
+ `${normalized}/index.svelte`,
60
+ `${normalized}/index.astro`
61
+ ];
62
+ if (normalized.endsWith(".js")) {
63
+ const withoutExtension = normalized.slice(0, -3);
64
+ candidates.push(`${withoutExtension}.ts`, `${withoutExtension}.tsx`);
65
+ }
66
+ if (normalized.endsWith(".mjs")) {
67
+ candidates.push(`${normalized.slice(0, -4)}.mts`);
68
+ }
69
+ if (normalized.endsWith(".cjs")) {
70
+ candidates.push(`${normalized.slice(0, -4)}.cts`);
71
+ }
72
+ return candidates.find((candidate) => localPaths.has(candidate)) ?? null;
73
+ }
74
+ function normalizePath(path) {
75
+ const parts = [];
76
+ for (const part of path.split("/")) {
77
+ if (part === "." || part === "") {
78
+ continue;
79
+ }
80
+ if (part === "..") {
81
+ parts.pop();
82
+ continue;
83
+ }
84
+ parts.push(part);
85
+ }
86
+ return parts.join("/");
87
+ }
88
+ //# sourceMappingURL=dependencyGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyGraph.js","sourceRoot":"","sources":["../../../src/analyzers/graph/dependencyGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { FileGraph } from "./dependencyGraph.js";
2
+ /**
3
+ * buildReverseGraph — invert a forward file-import graph into a
4
+ * "who depends on me" graph. `fileGraph` maps a file to the files it
5
+ * imports; the reverse maps a file to the files that import it.
6
+ */
7
+ export declare function buildReverseGraph(fileGraph: FileGraph): FileGraph;
8
+ export type MapTreeNode = {
9
+ path: string;
10
+ children: MapTreeNode[];
11
+ /** true if this node closes a cycle back to an ancestor already shown above it */
12
+ isCycle: boolean;
13
+ /** number of additional direct children that exist but were cut off by maxChildren */
14
+ truncatedCount?: number;
15
+ };
16
+ /**
17
+ * Default cap on direct children shown per node. Hub files (a shared
18
+ * types.ts, utils.ts, a common UI component) can have very high fan-in —
19
+ * without a cap, a single "used by" tree (or the mermaid diagram built from
20
+ * it) can balloon to hundreds of lines/nodes and become unreadable. Pass
21
+ * `maxChildren: Infinity` (wired to the `--all` flag) to bypass this.
22
+ */
23
+ export declare const DEFAULT_MAX_CHILDREN = 25;
24
+ /**
25
+ * buildBoundedTree — walk a graph outward from `root` up to `maxDepth` hops,
26
+ * stopping (and flagging isCycle) whenever a path revisits a file already on
27
+ * the current branch. File dependency graphs commonly have real cycles
28
+ * (A imports B imports A), so a naive walk without a visited-per-branch set
29
+ * would recurse forever.
30
+ */
31
+ export declare function buildBoundedTree(graph: FileGraph, root: string, maxDepth: number, options?: {
32
+ ancestors?: string[];
33
+ filter?: (path: string) => boolean;
34
+ maxChildren?: number;
35
+ }): MapTreeNode;
36
+ /**
37
+ * collectNodesWithinDepth — flat, deduplicated list of every file reachable
38
+ * from `root` within `maxDepth` hops (root excluded). Used for feature-level
39
+ * "what does this feature touch outside itself" style queries where a flat
40
+ * set is more useful than a nested tree.
41
+ */
42
+ export declare function collectNodesWithinDepth(graph: FileGraph, root: string, maxDepth: number): string[];
43
+ //# sourceMappingURL=dependencyMap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyMap.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/dependencyMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAajE;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,kFAAkF;IAClF,OAAO,EAAE,OAAO,CAAC;IACjB,sFAAsF;IACtF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/F,WAAW,CAmCb;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,EAChB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,MAAM,EAAE,CAmBV"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * buildReverseGraph — invert a forward file-import graph into a
3
+ * "who depends on me" graph. `fileGraph` maps a file to the files it
4
+ * imports; the reverse maps a file to the files that import it.
5
+ */
6
+ export function buildReverseGraph(fileGraph) {
7
+ const reverse = {};
8
+ for (const [file, dependencies] of Object.entries(fileGraph)) {
9
+ for (const dependency of dependencies) {
10
+ const dependents = reverse[dependency] ?? (reverse[dependency] = []);
11
+ if (!dependents.includes(file)) {
12
+ dependents.push(file);
13
+ }
14
+ }
15
+ }
16
+ return reverse;
17
+ }
18
+ /**
19
+ * Default cap on direct children shown per node. Hub files (a shared
20
+ * types.ts, utils.ts, a common UI component) can have very high fan-in —
21
+ * without a cap, a single "used by" tree (or the mermaid diagram built from
22
+ * it) can balloon to hundreds of lines/nodes and become unreadable. Pass
23
+ * `maxChildren: Infinity` (wired to the `--all` flag) to bypass this.
24
+ */
25
+ export const DEFAULT_MAX_CHILDREN = 25;
26
+ /**
27
+ * buildBoundedTree — walk a graph outward from `root` up to `maxDepth` hops,
28
+ * stopping (and flagging isCycle) whenever a path revisits a file already on
29
+ * the current branch. File dependency graphs commonly have real cycles
30
+ * (A imports B imports A), so a naive walk without a visited-per-branch set
31
+ * would recurse forever.
32
+ */
33
+ export function buildBoundedTree(graph, root, maxDepth, options = {}) {
34
+ const ancestors = options.ancestors ?? [root];
35
+ const maxChildren = options.maxChildren ?? DEFAULT_MAX_CHILDREN;
36
+ if (maxDepth <= 0) {
37
+ return { path: root, children: [], isCycle: false };
38
+ }
39
+ const candidates = (graph[root] ?? []).filter((next) => !options.filter || options.filter(next));
40
+ const shown = candidates.slice(0, maxChildren);
41
+ const truncatedCount = candidates.length - shown.length;
42
+ const children = [];
43
+ for (const next of shown) {
44
+ if (ancestors.includes(next)) {
45
+ children.push({ path: next, children: [], isCycle: true });
46
+ continue;
47
+ }
48
+ children.push(buildBoundedTree(graph, next, maxDepth - 1, {
49
+ ancestors: [...ancestors, next],
50
+ filter: options.filter,
51
+ maxChildren
52
+ }));
53
+ }
54
+ return {
55
+ path: root,
56
+ children,
57
+ isCycle: false,
58
+ ...(truncatedCount > 0 ? { truncatedCount } : {})
59
+ };
60
+ }
61
+ /**
62
+ * collectNodesWithinDepth — flat, deduplicated list of every file reachable
63
+ * from `root` within `maxDepth` hops (root excluded). Used for feature-level
64
+ * "what does this feature touch outside itself" style queries where a flat
65
+ * set is more useful than a nested tree.
66
+ */
67
+ export function collectNodesWithinDepth(graph, root, maxDepth) {
68
+ const visited = new Set([root]);
69
+ let frontier = [root];
70
+ for (let depth = 0; depth < maxDepth && frontier.length > 0; depth++) {
71
+ const next = [];
72
+ for (const file of frontier) {
73
+ for (const neighbor of graph[file] ?? []) {
74
+ if (!visited.has(neighbor)) {
75
+ visited.add(neighbor);
76
+ next.push(neighbor);
77
+ }
78
+ }
79
+ }
80
+ frontier = next;
81
+ }
82
+ visited.delete(root);
83
+ return [...visited];
84
+ }
85
+ //# sourceMappingURL=dependencyMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependencyMap.js","sourceRoot":"","sources":["../../../src/analyzers/graph/dependencyMap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FileGraph } from "./dependencyGraph.js";
2
+ export declare function detectEntryPoints(graph: FileGraph): string[];
3
+ //# sourceMappingURL=entryPoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entryPoints.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/entryPoints.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAWtD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,EAAE,CAS5D"}
@@ -0,0 +1,21 @@
1
+ import { isArchitectureSource } from "./sourceScope.js";
2
+ const ENTRY_PATTERNS = [
3
+ /(^|\/)page\.[jt]sx?$/,
4
+ /(^|\/)layout\.[jt]sx?$/,
5
+ /(^|\/)middleware\.[jt]s$/,
6
+ /(^|\/)(server|app|index|main)\.[cm]?[jt]sx?$/,
7
+ /(^|\/)route\.[jt]s$/
8
+ ];
9
+ export function detectEntryPoints(graph) {
10
+ const imported = new Set(Object.values(graph).flat());
11
+ return Object.keys(graph)
12
+ .filter((path) => isSourceFile(path))
13
+ .filter((path) => isArchitectureSource(path))
14
+ .filter((path) => ENTRY_PATTERNS.some((pattern) => pattern.test(path)) || (!imported.has(path) && (graph[path]?.length ?? 0) > 0))
15
+ .sort((a, b) => a.localeCompare(b))
16
+ .slice(0, 20);
17
+ }
18
+ function isSourceFile(path) {
19
+ return /\.[cm]?[jt]sx?$|\.vue$|\.svelte$|\.astro$/.test(path);
20
+ }
21
+ //# sourceMappingURL=entryPoints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"entryPoints.js","sourceRoot":"","sources":["../../../src/analyzers/graph/entryPoints.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,MAAM,cAAc,GAAG;IACrB,sBAAsB;IACtB,wBAAwB;IACxB,0BAA0B;IAC1B,8CAA8C;IAC9C,qBAAqB;CACtB,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,KAAgB;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAEtD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;SACtB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;SACpC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;SAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;SACjI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SAClC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChE,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { buildDependencyGraph, countReferences, } from "./dependencyGraph.js";
2
+ export type { FileGraph, } from "./dependencyGraph.js";
3
+ export { detectEntryPoints, } from "./entryPoints.js";
4
+ export { isArchitectureSource, } from "./sourceScope.js";
5
+ export { buildReverseGraph, buildBoundedTree, collectNodesWithinDepth, DEFAULT_MAX_CHILDREN, } from "./dependencyMap.js";
6
+ export type { MapTreeNode, } from "./dependencyMap.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,SAAS,GACV,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EACV,WAAW,GACZ,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { buildDependencyGraph, countReferences, } from "./dependencyGraph.js";
2
+ export { detectEntryPoints, } from "./entryPoints.js";
3
+ export { isArchitectureSource, } from "./sourceScope.js";
4
+ export { buildReverseGraph, buildBoundedTree, collectNodesWithinDepth, DEFAULT_MAX_CHILDREN, } from "./dependencyMap.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/analyzers/graph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EACL,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function isArchitectureSource(path: string): boolean;
2
+ //# sourceMappingURL=sourceScope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sourceScope.d.ts","sourceRoot":"","sources":["../../../src/analyzers/graph/sourceScope.ts"],"names":[],"mappings":"AAeA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAkB1D"}