@mycodemap/mycodemap 2.0.0 → 2.7.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 (424) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/README.md +59 -184
  3. package/dist/cli/commands/agent-metrics/human.d.ts +4 -0
  4. package/dist/cli/commands/agent-metrics/human.d.ts.map +1 -0
  5. package/dist/cli/commands/agent-metrics/human.js +134 -0
  6. package/dist/cli/commands/agent-metrics/human.js.map +1 -0
  7. package/dist/cli/commands/agent-metrics/index.d.ts +15 -0
  8. package/dist/cli/commands/agent-metrics/index.d.ts.map +1 -0
  9. package/dist/cli/commands/agent-metrics/index.js +116 -0
  10. package/dist/cli/commands/agent-metrics/index.js.map +1 -0
  11. package/dist/cli/commands/analyze.d.ts +3 -196
  12. package/dist/cli/commands/analyze.d.ts.map +1 -1
  13. package/dist/cli/commands/analyze.js +9 -1163
  14. package/dist/cli/commands/analyze.js.map +1 -1
  15. package/dist/cli/commands/benchmark.d.ts.map +1 -1
  16. package/dist/cli/commands/benchmark.js +5 -2
  17. package/dist/cli/commands/benchmark.js.map +1 -1
  18. package/dist/cli/commands/complexity.d.ts.map +1 -1
  19. package/dist/cli/commands/complexity.js +62 -95
  20. package/dist/cli/commands/complexity.js.map +1 -1
  21. package/dist/cli/commands/deps.d.ts +3 -60
  22. package/dist/cli/commands/deps.d.ts.map +1 -1
  23. package/dist/cli/commands/deps.js +16 -351
  24. package/dist/cli/commands/deps.js.map +1 -1
  25. package/dist/cli/commands/env-contract.d.ts +3 -0
  26. package/dist/cli/commands/env-contract.d.ts.map +1 -0
  27. package/dist/cli/commands/env-contract.js +221 -0
  28. package/dist/cli/commands/env-contract.js.map +1 -0
  29. package/dist/cli/commands/generate.d.ts +19 -1
  30. package/dist/cli/commands/generate.d.ts.map +1 -1
  31. package/dist/cli/commands/generate.js +735 -89
  32. package/dist/cli/commands/generate.js.map +1 -1
  33. package/dist/cli/commands/impact.d.ts +4 -38
  34. package/dist/cli/commands/impact.d.ts.map +1 -1
  35. package/dist/cli/commands/impact.js +133 -375
  36. package/dist/cli/commands/impact.js.map +1 -1
  37. package/dist/cli/commands/init.d.ts +1 -0
  38. package/dist/cli/commands/init.d.ts.map +1 -1
  39. package/dist/cli/commands/init.js +61 -2
  40. package/dist/cli/commands/init.js.map +1 -1
  41. package/dist/cli/commands/preview.d.ts +3 -0
  42. package/dist/cli/commands/preview.d.ts.map +1 -0
  43. package/dist/cli/commands/preview.js +216 -0
  44. package/dist/cli/commands/preview.js.map +1 -0
  45. package/dist/cli/commands/query.d.ts +2 -21
  46. package/dist/cli/commands/query.d.ts.map +1 -1
  47. package/dist/cli/commands/query.js +15 -683
  48. package/dist/cli/commands/query.js.map +1 -1
  49. package/dist/cli/commands/watch-foreground.d.ts.map +1 -1
  50. package/dist/cli/commands/watch-foreground.js +5 -1
  51. package/dist/cli/commands/watch-foreground.js.map +1 -1
  52. package/dist/cli/config-loader.d.ts.map +1 -1
  53. package/dist/cli/config-loader.js +51 -13
  54. package/dist/cli/config-loader.js.map +1 -1
  55. package/dist/cli/doctor/check-env-contract.d.ts +3 -0
  56. package/dist/cli/doctor/check-env-contract.d.ts.map +1 -0
  57. package/dist/cli/doctor/check-env-contract.js +96 -0
  58. package/dist/cli/doctor/check-env-contract.js.map +1 -0
  59. package/dist/cli/doctor/check-native-deps.d.ts.map +1 -1
  60. package/dist/cli/doctor/check-native-deps.js +20 -4
  61. package/dist/cli/doctor/check-native-deps.js.map +1 -1
  62. package/dist/cli/doctor/orchestrator.d.ts.map +1 -1
  63. package/dist/cli/doctor/orchestrator.js +5 -2
  64. package/dist/cli/doctor/orchestrator.js.map +1 -1
  65. package/dist/cli/env-contract/check.d.ts +18 -0
  66. package/dist/cli/env-contract/check.d.ts.map +1 -0
  67. package/dist/cli/env-contract/check.js +118 -0
  68. package/dist/cli/env-contract/check.js.map +1 -0
  69. package/dist/cli/env-contract/discovery.d.ts +12 -0
  70. package/dist/cli/env-contract/discovery.d.ts.map +1 -0
  71. package/dist/cli/env-contract/discovery.js +249 -0
  72. package/dist/cli/env-contract/discovery.js.map +1 -0
  73. package/dist/cli/env-contract/filters.d.ts +10 -0
  74. package/dist/cli/env-contract/filters.d.ts.map +1 -0
  75. package/dist/cli/env-contract/filters.js +23 -0
  76. package/dist/cli/env-contract/filters.js.map +1 -0
  77. package/dist/cli/env-contract/index.d.ts +6 -0
  78. package/dist/cli/env-contract/index.d.ts.map +1 -0
  79. package/dist/cli/env-contract/index.js +8 -0
  80. package/dist/cli/env-contract/index.js.map +1 -0
  81. package/dist/cli/env-contract/reminder-engine.d.ts +34 -0
  82. package/dist/cli/env-contract/reminder-engine.d.ts.map +1 -0
  83. package/dist/cli/env-contract/reminder-engine.js +51 -0
  84. package/dist/cli/env-contract/reminder-engine.js.map +1 -0
  85. package/dist/cli/env-contract/reminder-hook-runner.d.ts +45 -0
  86. package/dist/cli/env-contract/reminder-hook-runner.d.ts.map +1 -0
  87. package/dist/cli/env-contract/reminder-hook-runner.js +273 -0
  88. package/dist/cli/env-contract/reminder-hook-runner.js.map +1 -0
  89. package/dist/cli/env-contract/reminder-ledger.d.ts +11 -0
  90. package/dist/cli/env-contract/reminder-ledger.d.ts.map +1 -0
  91. package/dist/cli/env-contract/reminder-ledger.js +37 -0
  92. package/dist/cli/env-contract/reminder-ledger.js.map +1 -0
  93. package/dist/cli/env-contract/types.d.ts +48 -0
  94. package/dist/cli/env-contract/types.d.ts.map +1 -0
  95. package/dist/cli/env-contract/types.js +22 -0
  96. package/dist/cli/env-contract/types.js.map +1 -0
  97. package/dist/cli/env-contract/validation.d.ts +10 -0
  98. package/dist/cli/env-contract/validation.d.ts.map +1 -0
  99. package/dist/cli/env-contract/validation.js +116 -0
  100. package/dist/cli/env-contract/validation.js.map +1 -0
  101. package/dist/cli/first-run-guide.d.ts.map +1 -1
  102. package/dist/cli/first-run-guide.js +8 -3
  103. package/dist/cli/first-run-guide.js.map +1 -1
  104. package/dist/cli/index.js +23 -3
  105. package/dist/cli/index.js.map +1 -1
  106. package/dist/cli/init/assistant-plan.d.ts +14 -0
  107. package/dist/cli/init/assistant-plan.d.ts.map +1 -0
  108. package/dist/cli/init/assistant-plan.js +208 -0
  109. package/dist/cli/init/assistant-plan.js.map +1 -0
  110. package/dist/cli/init/detect.d.ts +28 -0
  111. package/dist/cli/init/detect.d.ts.map +1 -0
  112. package/dist/cli/init/detect.js +63 -0
  113. package/dist/cli/init/detect.js.map +1 -0
  114. package/dist/cli/init/env-contract-plan.d.ts +28 -0
  115. package/dist/cli/init/env-contract-plan.d.ts.map +1 -0
  116. package/dist/cli/init/env-contract-plan.js +184 -0
  117. package/dist/cli/init/env-contract-plan.js.map +1 -0
  118. package/dist/cli/init/manifest-extractors.d.ts +22 -0
  119. package/dist/cli/init/manifest-extractors.d.ts.map +1 -0
  120. package/dist/cli/init/manifest-extractors.js +185 -0
  121. package/dist/cli/init/manifest-extractors.js.map +1 -0
  122. package/dist/cli/init/profile-loader.d.ts +49 -0
  123. package/dist/cli/init/profile-loader.d.ts.map +1 -0
  124. package/dist/cli/init/profile-loader.js +107 -0
  125. package/dist/cli/init/profile-loader.js.map +1 -0
  126. package/dist/cli/init/profile-plan.d.ts +38 -0
  127. package/dist/cli/init/profile-plan.d.ts.map +1 -0
  128. package/dist/cli/init/profile-plan.js +120 -0
  129. package/dist/cli/init/profile-plan.js.map +1 -0
  130. package/dist/cli/init/profiles/generic.json +16 -0
  131. package/dist/cli/init/profiles/go.json +12 -0
  132. package/dist/cli/init/profiles/nodejs.json +16 -0
  133. package/dist/cli/init/profiles/python.json +17 -0
  134. package/dist/cli/init/profiles/rust.json +12 -0
  135. package/dist/cli/init/receipt.d.ts.map +1 -1
  136. package/dist/cli/init/receipt.js +107 -7
  137. package/dist/cli/init/receipt.js.map +1 -1
  138. package/dist/cli/init/reconciler.d.ts +10 -1
  139. package/dist/cli/init/reconciler.d.ts.map +1 -1
  140. package/dist/cli/init/reconciler.js +85 -15
  141. package/dist/cli/init/reconciler.js.map +1 -1
  142. package/dist/cli/interface-contract/commands/agent-metrics.d.ts +3 -0
  143. package/dist/cli/interface-contract/commands/agent-metrics.d.ts.map +1 -0
  144. package/dist/cli/interface-contract/commands/agent-metrics.js +217 -0
  145. package/dist/cli/interface-contract/commands/agent-metrics.js.map +1 -0
  146. package/dist/cli/interface-contract/commands/analyze.d.ts.map +1 -1
  147. package/dist/cli/interface-contract/commands/analyze.js +1 -0
  148. package/dist/cli/interface-contract/commands/analyze.js.map +1 -1
  149. package/dist/cli/interface-contract/commands/benchmark.d.ts.map +1 -1
  150. package/dist/cli/interface-contract/commands/benchmark.js +1 -0
  151. package/dist/cli/interface-contract/commands/benchmark.js.map +1 -1
  152. package/dist/cli/interface-contract/commands/deps.d.ts.map +1 -1
  153. package/dist/cli/interface-contract/commands/deps.js +1 -0
  154. package/dist/cli/interface-contract/commands/deps.js.map +1 -1
  155. package/dist/cli/interface-contract/commands/doctor.d.ts.map +1 -1
  156. package/dist/cli/interface-contract/commands/doctor.js +1 -0
  157. package/dist/cli/interface-contract/commands/doctor.js.map +1 -1
  158. package/dist/cli/interface-contract/commands/env-contract.d.ts +3 -0
  159. package/dist/cli/interface-contract/commands/env-contract.d.ts.map +1 -0
  160. package/dist/cli/interface-contract/commands/env-contract.js +168 -0
  161. package/dist/cli/interface-contract/commands/env-contract.js.map +1 -0
  162. package/dist/cli/interface-contract/commands/index.d.ts +5 -2
  163. package/dist/cli/interface-contract/commands/index.d.ts.map +1 -1
  164. package/dist/cli/interface-contract/commands/index.js +7 -1
  165. package/dist/cli/interface-contract/commands/index.js.map +1 -1
  166. package/dist/cli/interface-contract/commands/init.d.ts.map +1 -1
  167. package/dist/cli/interface-contract/commands/init.js +9 -0
  168. package/dist/cli/interface-contract/commands/init.js.map +1 -1
  169. package/dist/cli/interface-contract/commands/preview.d.ts +3 -0
  170. package/dist/cli/interface-contract/commands/preview.d.ts.map +1 -0
  171. package/dist/cli/interface-contract/commands/preview.js +118 -0
  172. package/dist/cli/interface-contract/commands/preview.js.map +1 -0
  173. package/dist/cli/interface-contract/commands/query.d.ts.map +1 -1
  174. package/dist/cli/interface-contract/commands/query.js +1 -0
  175. package/dist/cli/interface-contract/commands/query.js.map +1 -1
  176. package/dist/cli/interface-contract/index.d.ts +1 -1
  177. package/dist/cli/interface-contract/index.d.ts.map +1 -1
  178. package/dist/cli/interface-contract/index.js +2 -2
  179. package/dist/cli/interface-contract/index.js.map +1 -1
  180. package/dist/cli/interface-contract/schema.d.ts.map +1 -1
  181. package/dist/cli/interface-contract/schema.js +1 -0
  182. package/dist/cli/interface-contract/schema.js.map +1 -1
  183. package/dist/cli/interface-contract/types.d.ts +1 -0
  184. package/dist/cli/interface-contract/types.d.ts.map +1 -1
  185. package/dist/cli/output/error-codes.d.ts +2 -0
  186. package/dist/cli/output/error-codes.d.ts.map +1 -1
  187. package/dist/cli/output/error-codes.js +12 -0
  188. package/dist/cli/output/error-codes.js.map +1 -1
  189. package/dist/cli/output/errors.d.ts.map +1 -1
  190. package/dist/cli/output/errors.js +12 -0
  191. package/dist/cli/output/errors.js.map +1 -1
  192. package/dist/cli/output/wasm-fallback.d.ts +1 -0
  193. package/dist/cli/output/wasm-fallback.d.ts.map +1 -1
  194. package/dist/cli/output/wasm-fallback.js.map +1 -1
  195. package/dist/cli/preview/complexity-scanner.d.ts +21 -0
  196. package/dist/cli/preview/complexity-scanner.d.ts.map +1 -0
  197. package/dist/cli/preview/complexity-scanner.js +52 -0
  198. package/dist/cli/preview/complexity-scanner.js.map +1 -0
  199. package/dist/cli/preview/dependency-extractor.d.ts +38 -0
  200. package/dist/cli/preview/dependency-extractor.d.ts.map +1 -0
  201. package/dist/cli/preview/dependency-extractor.js +140 -0
  202. package/dist/cli/preview/dependency-extractor.js.map +1 -0
  203. package/dist/cli/preview/preview-renderer.d.ts +32 -0
  204. package/dist/cli/preview/preview-renderer.d.ts.map +1 -0
  205. package/dist/cli/preview/preview-renderer.js +54 -0
  206. package/dist/cli/preview/preview-renderer.js.map +1 -0
  207. package/dist/cli/storage-runtime.d.ts +7 -0
  208. package/dist/cli/storage-runtime.d.ts.map +1 -1
  209. package/dist/cli/storage-runtime.js +22 -0
  210. package/dist/cli/storage-runtime.js.map +1 -1
  211. package/dist/cli-new/index.js +1 -1
  212. package/dist/cli-new/index.js.map +1 -1
  213. package/dist/composition/parser-composition.d.ts +7 -0
  214. package/dist/composition/parser-composition.d.ts.map +1 -0
  215. package/dist/composition/parser-composition.js +15 -0
  216. package/dist/composition/parser-composition.js.map +1 -0
  217. package/dist/core/analyzer.d.ts.map +1 -1
  218. package/dist/core/analyzer.js +83 -67
  219. package/dist/core/analyzer.js.map +1 -1
  220. package/dist/core/ast-complexity-analyzer.d.ts +12 -6
  221. package/dist/core/ast-complexity-analyzer.d.ts.map +1 -1
  222. package/dist/core/ast-complexity-analyzer.js +368 -209
  223. package/dist/core/ast-complexity-analyzer.js.map +1 -1
  224. package/dist/core/file-discovery.d.ts +1 -1
  225. package/dist/core/file-discovery.d.ts.map +1 -1
  226. package/dist/core/file-discovery.js +3 -0
  227. package/dist/core/file-discovery.js.map +1 -1
  228. package/dist/core/global-index.d.ts +3 -1
  229. package/dist/core/global-index.d.ts.map +1 -1
  230. package/dist/core/global-index.js +69 -4
  231. package/dist/core/global-index.js.map +1 -1
  232. package/dist/domain/entities/CodeGraph.d.ts +3 -0
  233. package/dist/domain/entities/CodeGraph.d.ts.map +1 -1
  234. package/dist/domain/entities/CodeGraph.js +19 -2
  235. package/dist/domain/entities/CodeGraph.js.map +1 -1
  236. package/dist/domain/entities/Dependency.d.ts +5 -2
  237. package/dist/domain/entities/Dependency.d.ts.map +1 -1
  238. package/dist/domain/entities/Dependency.js +49 -3
  239. package/dist/domain/entities/Dependency.js.map +1 -1
  240. package/dist/domain/repositories/CodeGraphRepository.d.ts +5 -0
  241. package/dist/domain/repositories/CodeGraphRepository.d.ts.map +1 -1
  242. package/dist/domain/repositories/CodeGraphRepository.js.map +1 -1
  243. package/dist/execution/contract-tools/analyze.d.ts +205 -0
  244. package/dist/execution/contract-tools/analyze.d.ts.map +1 -0
  245. package/dist/execution/contract-tools/analyze.js +1215 -0
  246. package/dist/execution/contract-tools/analyze.js.map +1 -0
  247. package/dist/execution/contract-tools/deps.d.ts +62 -0
  248. package/dist/execution/contract-tools/deps.d.ts.map +1 -0
  249. package/dist/execution/contract-tools/deps.js +234 -0
  250. package/dist/execution/contract-tools/deps.js.map +1 -0
  251. package/dist/execution/contract-tools/index.d.ts +5 -0
  252. package/dist/execution/contract-tools/index.d.ts.map +1 -0
  253. package/dist/execution/contract-tools/index.js +7 -0
  254. package/dist/execution/contract-tools/index.js.map +1 -0
  255. package/dist/execution/contract-tools/query.d.ts +60 -0
  256. package/dist/execution/contract-tools/query.d.ts.map +1 -0
  257. package/dist/execution/contract-tools/query.js +532 -0
  258. package/dist/execution/contract-tools/query.js.map +1 -0
  259. package/dist/execution/contract-tools/types.d.ts +26 -0
  260. package/dist/execution/contract-tools/types.d.ts.map +1 -0
  261. package/dist/execution/contract-tools/types.js +32 -0
  262. package/dist/execution/contract-tools/types.js.map +1 -0
  263. package/dist/generator/index.d.ts.map +1 -1
  264. package/dist/generator/index.js +0 -3
  265. package/dist/generator/index.js.map +1 -1
  266. package/dist/infrastructure/parser/enhancers/TypeScriptTypeEnhancer.d.ts +12 -0
  267. package/dist/infrastructure/parser/enhancers/TypeScriptTypeEnhancer.d.ts.map +1 -0
  268. package/dist/infrastructure/parser/enhancers/TypeScriptTypeEnhancer.js +55 -0
  269. package/dist/infrastructure/parser/enhancers/TypeScriptTypeEnhancer.js.map +1 -0
  270. package/dist/infrastructure/parser/implementations/GoParser.d.ts +2 -1
  271. package/dist/infrastructure/parser/implementations/GoParser.d.ts.map +1 -1
  272. package/dist/infrastructure/parser/implementations/GoParser.js +13 -1
  273. package/dist/infrastructure/parser/implementations/GoParser.js.map +1 -1
  274. package/dist/infrastructure/parser/implementations/PythonTreeSitterParser.d.ts +114 -0
  275. package/dist/infrastructure/parser/implementations/PythonTreeSitterParser.d.ts.map +1 -0
  276. package/dist/infrastructure/parser/implementations/PythonTreeSitterParser.js +1022 -0
  277. package/dist/infrastructure/parser/implementations/PythonTreeSitterParser.js.map +1 -0
  278. package/dist/infrastructure/parser/implementations/TreeSitterParser.d.ts +78 -0
  279. package/dist/infrastructure/parser/implementations/TreeSitterParser.d.ts.map +1 -0
  280. package/dist/infrastructure/parser/implementations/TreeSitterParser.js +648 -0
  281. package/dist/infrastructure/parser/implementations/TreeSitterParser.js.map +1 -0
  282. package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts +3 -55
  283. package/dist/infrastructure/parser/implementations/TypeScriptParser.d.ts.map +1 -1
  284. package/dist/infrastructure/parser/implementations/TypeScriptParser.js +4 -411
  285. package/dist/infrastructure/parser/implementations/TypeScriptParser.js.map +1 -1
  286. package/dist/infrastructure/parser/index.d.ts +2 -0
  287. package/dist/infrastructure/parser/index.d.ts.map +1 -1
  288. package/dist/infrastructure/parser/index.js +9 -6
  289. package/dist/infrastructure/parser/index.js.map +1 -1
  290. package/dist/infrastructure/parser/interfaces/ParserBase.d.ts.map +1 -1
  291. package/dist/infrastructure/parser/interfaces/ParserBase.js +1 -0
  292. package/dist/infrastructure/parser/interfaces/ParserBase.js.map +1 -1
  293. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.d.ts +2 -0
  294. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.d.ts.map +1 -1
  295. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.js +4 -0
  296. package/dist/infrastructure/repositories/CodeGraphRepositoryImpl.js.map +1 -1
  297. package/dist/infrastructure/storage/StorageFactory.d.ts +5 -18
  298. package/dist/infrastructure/storage/StorageFactory.d.ts.map +1 -1
  299. package/dist/infrastructure/storage/StorageFactory.js +30 -98
  300. package/dist/infrastructure/storage/StorageFactory.js.map +1 -1
  301. package/dist/infrastructure/storage/adapters/SQLiteStorage.d.ts +13 -1
  302. package/dist/infrastructure/storage/adapters/SQLiteStorage.d.ts.map +1 -1
  303. package/dist/infrastructure/storage/adapters/SQLiteStorage.js +321 -75
  304. package/dist/infrastructure/storage/adapters/SQLiteStorage.js.map +1 -1
  305. package/dist/infrastructure/storage/adapters/sqlite-loader.d.ts +22 -0
  306. package/dist/infrastructure/storage/adapters/sqlite-loader.d.ts.map +1 -1
  307. package/dist/infrastructure/storage/adapters/sqlite-loader.js +78 -22
  308. package/dist/infrastructure/storage/adapters/sqlite-loader.js.map +1 -1
  309. package/dist/infrastructure/storage/community-helpers.d.ts +4 -0
  310. package/dist/infrastructure/storage/community-helpers.d.ts.map +1 -0
  311. package/dist/infrastructure/storage/community-helpers.js +392 -0
  312. package/dist/infrastructure/storage/community-helpers.js.map +1 -0
  313. package/dist/infrastructure/storage/graph-helpers.d.ts +22 -5
  314. package/dist/infrastructure/storage/graph-helpers.d.ts.map +1 -1
  315. package/dist/infrastructure/storage/graph-helpers.js +496 -91
  316. package/dist/infrastructure/storage/graph-helpers.js.map +1 -1
  317. package/dist/infrastructure/storage/index.d.ts +1 -1
  318. package/dist/infrastructure/storage/index.d.ts.map +1 -1
  319. package/dist/infrastructure/storage/index.js +1 -1
  320. package/dist/infrastructure/storage/index.js.map +1 -1
  321. package/dist/infrastructure/storage/interfaces/StorageBase.d.ts +2 -2
  322. package/dist/infrastructure/storage/interfaces/StorageBase.d.ts.map +1 -1
  323. package/dist/infrastructure/storage/interfaces/StorageBase.js.map +1 -1
  324. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.d.ts +2 -0
  325. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.d.ts.map +1 -1
  326. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.js +52 -12
  327. package/dist/infrastructure/storage/sqlite/GovernanceGraphCache.js.map +1 -1
  328. package/dist/infrastructure/storage/sqlite/schema.d.ts +2 -2
  329. package/dist/infrastructure/storage/sqlite/schema.d.ts.map +1 -1
  330. package/dist/infrastructure/storage/sqlite/schema.js +49 -1
  331. package/dist/infrastructure/storage/sqlite/schema.js.map +1 -1
  332. package/dist/interface/config/index.d.ts +5 -3
  333. package/dist/interface/config/index.d.ts.map +1 -1
  334. package/dist/interface/types/index.d.ts +37 -6
  335. package/dist/interface/types/index.d.ts.map +1 -1
  336. package/dist/interface/types/parser.d.ts +85 -0
  337. package/dist/interface/types/parser.d.ts.map +1 -1
  338. package/dist/interface/types/storage.d.ts +227 -10
  339. package/dist/interface/types/storage.d.ts.map +1 -1
  340. package/dist/orchestrator/agent-metrics-service.d.ts +126 -0
  341. package/dist/orchestrator/agent-metrics-service.d.ts.map +1 -0
  342. package/dist/orchestrator/agent-metrics-service.js +444 -0
  343. package/dist/orchestrator/agent-metrics-service.js.map +1 -0
  344. package/dist/parser/enhancers/PythonTypeEnhancer.d.ts +26 -0
  345. package/dist/parser/enhancers/PythonTypeEnhancer.d.ts.map +1 -0
  346. package/dist/parser/enhancers/PythonTypeEnhancer.js +440 -0
  347. package/dist/parser/enhancers/PythonTypeEnhancer.js.map +1 -0
  348. package/dist/parser/implementations/smart-parser.d.ts.map +1 -1
  349. package/dist/parser/implementations/smart-parser.js +7 -69
  350. package/dist/parser/implementations/smart-parser.js.map +1 -1
  351. package/dist/parser/implementations/tree-sitter-loader.d.ts +2 -0
  352. package/dist/parser/implementations/tree-sitter-loader.d.ts.map +1 -1
  353. package/dist/parser/implementations/tree-sitter-loader.js +46 -15
  354. package/dist/parser/implementations/tree-sitter-loader.js.map +1 -1
  355. package/dist/parser/index.d.ts +5 -3
  356. package/dist/parser/index.d.ts.map +1 -1
  357. package/dist/parser/index.js +68 -6
  358. package/dist/parser/index.js.map +1 -1
  359. package/dist/parser/interfaces/IParser.d.ts +19 -6
  360. package/dist/parser/interfaces/IParser.d.ts.map +1 -1
  361. package/dist/parser/interfaces/IParser.js +2 -3
  362. package/dist/parser/interfaces/IParser.js.map +1 -1
  363. package/dist/server/handlers/AnalysisHandler.d.ts +13 -2
  364. package/dist/server/handlers/AnalysisHandler.d.ts.map +1 -1
  365. package/dist/server/handlers/AnalysisHandler.js +24 -0
  366. package/dist/server/handlers/AnalysisHandler.js.map +1 -1
  367. package/dist/server/handlers/QueryHandler.d.ts.map +1 -1
  368. package/dist/server/handlers/QueryHandler.js +11 -30
  369. package/dist/server/handlers/QueryHandler.js.map +1 -1
  370. package/dist/server/mcp/context-tool.d.ts +9 -0
  371. package/dist/server/mcp/context-tool.d.ts.map +1 -0
  372. package/dist/server/mcp/context-tool.js +257 -0
  373. package/dist/server/mcp/context-tool.js.map +1 -0
  374. package/dist/server/mcp/schema-adapter.d.ts +11 -1
  375. package/dist/server/mcp/schema-adapter.d.ts.map +1 -1
  376. package/dist/server/mcp/schema-adapter.js +126 -7
  377. package/dist/server/mcp/schema-adapter.js.map +1 -1
  378. package/dist/server/mcp/server.d.ts +3 -3
  379. package/dist/server/mcp/server.d.ts.map +1 -1
  380. package/dist/server/mcp/server.js +114 -30
  381. package/dist/server/mcp/server.js.map +1 -1
  382. package/dist/server/mcp/service.d.ts +6 -2
  383. package/dist/server/mcp/service.d.ts.map +1 -1
  384. package/dist/server/mcp/service.js +138 -36
  385. package/dist/server/mcp/service.js.map +1 -1
  386. package/dist/server/mcp/stdio-transport.d.ts +23 -0
  387. package/dist/server/mcp/stdio-transport.d.ts.map +1 -0
  388. package/dist/server/mcp/stdio-transport.js +101 -0
  389. package/dist/server/mcp/stdio-transport.js.map +1 -0
  390. package/dist/server/mcp/types.d.ts +133 -8
  391. package/dist/server/mcp/types.d.ts.map +1 -1
  392. package/dist/server/routes/api.d.ts.map +1 -1
  393. package/dist/server/routes/api.js +11 -2
  394. package/dist/server/routes/api.js.map +1 -1
  395. package/docs/AI_ASSISTANT_SETUP.md +112 -0
  396. package/docs/API.md +170 -0
  397. package/docs/CONFIGURATION.md +141 -0
  398. package/docs/DEVELOPMENT.md +96 -0
  399. package/docs/GETTING-STARTED.md +114 -0
  400. package/docs/SETUP_GUIDE.md +49 -0
  401. package/docs/TESTING.md +81 -0
  402. package/docs/ai-guide/OUTPUT.md +51 -8
  403. package/docs/backlog.md +232 -144
  404. package/docs/brainstorms/2026-05-10-agent-effectiveness-validation-requirements.md +112 -0
  405. package/docs/generated/phase-58/subagent-evidence/claude-hook-example.json +15 -0
  406. package/docs/generated/phase-58/subagent-evidence/claude-session.md +146 -0
  407. package/docs/generated/phase-58/subagent-evidence/claude-subagent.json +28 -0
  408. package/docs/generated/phase-58/subagent-evidence/codex-agent-example.toml +19 -0
  409. package/docs/generated/phase-58/subagent-evidence/codex-session.md +150 -0
  410. package/docs/generated/phase-58/subagent-evidence/codex-subagent.json +20 -0
  411. package/docs/generated/phase-58/subagent-evidence/negative-no-retrieval.json +12 -0
  412. package/docs/generated/phase-58/subagent-evidence/verification-manifest.json +19 -0
  413. package/docs/ideation/2026-05-02-subagent-environment-contract-injection-ideation.md +183 -0
  414. package/docs/ideation/2026-05-04-subagent-hooks-deep-dive-ideation.md +133 -0
  415. package/docs/ideation/2026-05-10-agent-effectiveness-validation-ideation.md +219 -0
  416. package/package.json +8 -3
  417. package/scripts/copy-build-assets.mjs +23 -0
  418. package/scripts/hooks/templates/pre-commit +33 -2
  419. package/scripts/tests/test_rule_control_workflow.py +15 -1
  420. package/scripts/verify-subagent-env-contract.mjs +279 -0
  421. package/dist/parser/implementations/tree-sitter-parser.d.ts +0 -60
  422. package/dist/parser/implementations/tree-sitter-parser.d.ts.map +0 -1
  423. package/dist/parser/implementations/tree-sitter-parser.js +0 -380
  424. package/dist/parser/implementations/tree-sitter-parser.js.map +0 -1
@@ -1,5 +1,8 @@
1
1
  // [META] since:2026-03-24 | owner:architecture-team | stable:false
2
2
  // [WHY] Share CodeGraph clone/query/analysis helpers across storage backends to keep contract behavior consistent
3
+ function cloneDependencyList(dependencies) {
4
+ return dependencies.map((dependency) => ({ ...dependency }));
5
+ }
3
6
  export function cloneCodeGraph(graph) {
4
7
  return globalThis.structuredClone(graph);
5
8
  }
@@ -19,6 +22,7 @@ export function deserializeCodeGraphSnapshot(snapshot, projectPath = '') {
19
22
  graphStatus: parsedGraph.graphStatus ?? 'complete',
20
23
  failedFileCount: parsedGraph.failedFileCount ?? 0,
21
24
  parseFailureFiles: parsedGraph.parseFailureFiles ?? [],
25
+ lastRefresh: parsedGraph.lastRefresh,
22
26
  };
23
27
  }
24
28
  export function createEmptyCodeGraph(projectPath = '') {
@@ -37,6 +41,7 @@ export function createEmptyCodeGraph(projectPath = '') {
37
41
  graphStatus: 'complete',
38
42
  failedFileCount: 0,
39
43
  parseFailureFiles: [],
44
+ lastRefresh: undefined,
40
45
  };
41
46
  }
42
47
  export function getGraphMetadataFromGraph(graph, generatedAt = null) {
@@ -50,6 +55,7 @@ export function getGraphMetadataFromGraph(graph, generatedAt = null) {
50
55
  parseFailureFiles: [...(graph.parseFailureFiles ?? [])],
51
56
  moduleCount: graph.modules.length,
52
57
  symbolCount: graph.symbols.length,
58
+ lastRefresh: graph.lastRefresh,
53
59
  };
54
60
  }
55
61
  export function upsertModuleInGraph(graph, module) {
@@ -70,6 +76,447 @@ export function deleteModuleFromGraph(graph, moduleId) {
70
76
  nextGraph.dependencies = nextGraph.dependencies.filter(dependency => dependency.sourceId !== moduleId && dependency.targetId !== moduleId);
71
77
  return nextGraph;
72
78
  }
79
+ function normalizePath(filePath) {
80
+ return filePath.replace(/\\/gu, '/');
81
+ }
82
+ function matchesRequestedPath(candidatePath, requestedPath) {
83
+ const normalizedCandidate = normalizePath(candidatePath);
84
+ const normalizedRequested = normalizePath(requestedPath);
85
+ return normalizedCandidate === normalizedRequested
86
+ || normalizedCandidate.endsWith(`/${normalizedRequested}`)
87
+ || normalizedRequested.endsWith(`/${normalizedCandidate}`);
88
+ }
89
+ function isConservativeConfidence(confidence) {
90
+ return confidence === 'INFERRED' || confidence === 'AMBIGUOUS';
91
+ }
92
+ function createEmptyImpactResult(request, graphStatus, overrides) {
93
+ return {
94
+ status: overrides.status,
95
+ confidence: overrides.confidence,
96
+ graphStatus,
97
+ entrypoint: {
98
+ kind: request.kind,
99
+ name: request.kind === 'file' ? request.filePath : request.symbol,
100
+ filePath: request.filePath,
101
+ ...overrides.entrypoint,
102
+ },
103
+ summary: {
104
+ requestedDepth: request.depth,
105
+ directCount: 0,
106
+ transitiveCount: 0,
107
+ totalCount: 0,
108
+ maxDepth: 0,
109
+ truncated: false,
110
+ },
111
+ direct: [],
112
+ transitiveLayers: [],
113
+ warnings: overrides.warnings ?? [],
114
+ truncated: false,
115
+ remediation: overrides.remediation,
116
+ error: overrides.error,
117
+ };
118
+ }
119
+ export function createGraphReadIndex(graph) {
120
+ const dependenciesBySourceId = new Map();
121
+ const dependenciesByTargetId = new Map();
122
+ for (const dependency of graph.dependencies) {
123
+ const sourceDependencies = dependenciesBySourceId.get(dependency.sourceId) ?? [];
124
+ sourceDependencies.push(dependency);
125
+ dependenciesBySourceId.set(dependency.sourceId, sourceDependencies);
126
+ const targetDependencies = dependenciesByTargetId.get(dependency.targetId) ?? [];
127
+ targetDependencies.push(dependency);
128
+ dependenciesByTargetId.set(dependency.targetId, targetDependencies);
129
+ }
130
+ return {
131
+ moduleById: new Map(graph.modules.map((module) => [module.id, module])),
132
+ symbolById: new Map(graph.symbols.map((symbol) => [symbol.id, symbol])),
133
+ dependenciesBySourceId,
134
+ dependenciesByTargetId,
135
+ moduleReverseAdjacency: buildModuleReverseAdjacency(graph),
136
+ symbolReverseAdjacency: buildSymbolReverseAdjacency(graph),
137
+ };
138
+ }
139
+ function toImpactCandidate(moduleOrSymbol) {
140
+ if ('moduleId' in moduleOrSymbol) {
141
+ return {
142
+ id: moduleOrSymbol.id,
143
+ kind: 'symbol',
144
+ name: moduleOrSymbol.name,
145
+ filePath: moduleOrSymbol.location.file,
146
+ line: moduleOrSymbol.location.line,
147
+ };
148
+ }
149
+ return {
150
+ id: moduleOrSymbol.id,
151
+ kind: 'module',
152
+ name: moduleOrSymbol.path,
153
+ filePath: moduleOrSymbol.path,
154
+ };
155
+ }
156
+ function resolveImpactEntrypointInGraph(graph, request) {
157
+ const graphStatus = graph.modules.length > 0 || graph.symbols.length > 0
158
+ ? (graph.graphStatus ?? 'complete')
159
+ : 'missing';
160
+ if (graphStatus === 'missing') {
161
+ return {
162
+ ok: false,
163
+ result: createEmptyImpactResult(request, 'missing', {
164
+ status: 'unavailable',
165
+ confidence: 'unavailable',
166
+ error: {
167
+ code: 'GRAPH_NOT_FOUND',
168
+ message: 'Code graph not found. Run `mycodemap generate --symbol-level` first.',
169
+ },
170
+ remediation: 'Run `mycodemap generate --symbol-level` to rebuild graph truth before querying impact.',
171
+ }),
172
+ };
173
+ }
174
+ if (request.kind === 'file') {
175
+ const matches = graph.modules.filter((module) => matchesRequestedPath(module.path, request.filePath));
176
+ if (matches.length === 1) {
177
+ return {
178
+ ok: true,
179
+ rootId: matches[0].id,
180
+ entrypoint: {
181
+ kind: 'file',
182
+ id: matches[0].id,
183
+ name: matches[0].path,
184
+ filePath: matches[0].path,
185
+ },
186
+ };
187
+ }
188
+ if (matches.length > 1) {
189
+ return {
190
+ ok: false,
191
+ result: createEmptyImpactResult(request, graphStatus, {
192
+ status: 'ambiguous',
193
+ confidence: 'ambiguous',
194
+ error: {
195
+ code: 'AMBIGUOUS_ENTRYPOINT',
196
+ message: `File "${request.filePath}" resolves to multiple modules.`,
197
+ details: {
198
+ candidates: matches.map(toImpactCandidate),
199
+ },
200
+ },
201
+ entrypoint: {
202
+ candidates: matches.map(toImpactCandidate),
203
+ },
204
+ }),
205
+ };
206
+ }
207
+ return {
208
+ ok: false,
209
+ result: createEmptyImpactResult(request, graphStatus, {
210
+ status: 'not_found',
211
+ confidence: 'unavailable',
212
+ error: {
213
+ code: 'FILE_NOT_FOUND',
214
+ message: `File "${request.filePath}" not found in the persisted graph.`,
215
+ },
216
+ remediation: 'Use a repo-relative path and regenerate graph truth if the file is newly added.',
217
+ }),
218
+ };
219
+ }
220
+ const matches = graph.symbols
221
+ .filter((symbol) => symbol.name === request.symbol)
222
+ .filter((symbol) => request.filePath ? matchesRequestedPath(symbol.location.file, request.filePath) : true);
223
+ if (matches.length === 1) {
224
+ return {
225
+ ok: true,
226
+ rootId: matches[0].id,
227
+ entrypoint: {
228
+ kind: 'symbol',
229
+ id: matches[0].id,
230
+ name: matches[0].name,
231
+ filePath: matches[0].location.file,
232
+ line: matches[0].location.line,
233
+ },
234
+ };
235
+ }
236
+ if (matches.length > 1) {
237
+ return {
238
+ ok: false,
239
+ result: createEmptyImpactResult(request, graphStatus, {
240
+ status: 'ambiguous',
241
+ confidence: 'ambiguous',
242
+ error: {
243
+ code: 'AMBIGUOUS_ENTRYPOINT',
244
+ message: `Symbol "${request.symbol}" resolves to multiple candidates.`,
245
+ details: {
246
+ candidates: matches.map(toImpactCandidate),
247
+ },
248
+ },
249
+ entrypoint: {
250
+ candidates: matches.map(toImpactCandidate),
251
+ },
252
+ }),
253
+ };
254
+ }
255
+ return {
256
+ ok: false,
257
+ result: createEmptyImpactResult(request, graphStatus, {
258
+ status: 'not_found',
259
+ confidence: 'unavailable',
260
+ error: {
261
+ code: 'SYMBOL_NOT_FOUND',
262
+ message: request.filePath
263
+ ? `Symbol "${request.symbol}" not found in "${request.filePath}".`
264
+ : `Symbol "${request.symbol}" not found.`,
265
+ },
266
+ remediation: 'Use an exact symbol name and optionally pass filePath to disambiguate.',
267
+ }),
268
+ };
269
+ }
270
+ function buildModuleReverseAdjacency(graph) {
271
+ const adjacency = new Map();
272
+ const symbolToModuleId = new Map(graph.symbols.map((symbol) => [symbol.id, symbol.moduleId]));
273
+ for (const dependency of graph.dependencies) {
274
+ const sourceModuleId = dependency.sourceEntityType === 'symbol'
275
+ ? symbolToModuleId.get(dependency.sourceId)
276
+ : dependency.sourceId;
277
+ const targetModuleId = dependency.targetEntityType === 'symbol'
278
+ ? symbolToModuleId.get(dependency.targetId)
279
+ : dependency.targetId;
280
+ if (!sourceModuleId || !targetModuleId || sourceModuleId === targetModuleId) {
281
+ continue;
282
+ }
283
+ if (!adjacency.has(targetModuleId)) {
284
+ adjacency.set(targetModuleId, new Set());
285
+ }
286
+ adjacency.get(targetModuleId)?.add(sourceModuleId);
287
+ }
288
+ return new Map(Array.from(adjacency.entries()).map(([key, values]) => [key, Array.from(values)]));
289
+ }
290
+ function buildSymbolReverseAdjacency(graph) {
291
+ const adjacency = new Map();
292
+ for (const dependency of graph.dependencies) {
293
+ if (dependency.type !== 'call'
294
+ || dependency.sourceEntityType !== 'symbol'
295
+ || dependency.targetEntityType !== 'symbol') {
296
+ continue;
297
+ }
298
+ if (!adjacency.has(dependency.targetId)) {
299
+ adjacency.set(dependency.targetId, new Set());
300
+ }
301
+ adjacency.get(dependency.targetId)?.add(dependency.sourceId);
302
+ }
303
+ return new Map(Array.from(adjacency.entries()).map(([key, values]) => [key, Array.from(values)]));
304
+ }
305
+ function collectImpactTraversal(rootId, depth, limit, adjacency, resolveNode) {
306
+ const direct = [];
307
+ const transitiveLayerMap = new Map();
308
+ const visited = new Set([rootId]);
309
+ const queue = [{ id: rootId, depth: 0, path: [rootId] }];
310
+ let impactedCount = 0;
311
+ let truncated = false;
312
+ while (queue.length > 0) {
313
+ const current = queue.shift();
314
+ if (!current || current.depth >= depth) {
315
+ continue;
316
+ }
317
+ const neighbors = adjacency.get(current.id) ?? [];
318
+ for (const neighborId of neighbors) {
319
+ if (visited.has(neighborId)) {
320
+ continue;
321
+ }
322
+ if (impactedCount >= limit) {
323
+ truncated = true;
324
+ queue.length = 0;
325
+ break;
326
+ }
327
+ const nextDepth = current.depth + 1;
328
+ const nextPath = [...current.path, neighborId];
329
+ const node = resolveNode(neighborId, nextDepth, nextPath);
330
+ if (!node) {
331
+ continue;
332
+ }
333
+ visited.add(neighborId);
334
+ impactedCount += 1;
335
+ if (nextDepth === 1) {
336
+ direct.push(node);
337
+ }
338
+ else {
339
+ const layer = transitiveLayerMap.get(nextDepth) ?? [];
340
+ layer.push(node);
341
+ transitiveLayerMap.set(nextDepth, layer);
342
+ }
343
+ queue.push({
344
+ id: neighborId,
345
+ depth: nextDepth,
346
+ path: nextPath,
347
+ });
348
+ }
349
+ }
350
+ return {
351
+ direct,
352
+ transitiveLayers: Array.from(transitiveLayerMap.entries())
353
+ .sort((left, right) => left[0] - right[0])
354
+ .map(([layerDepth, nodes]) => ({
355
+ depth: layerDepth,
356
+ nodes,
357
+ })),
358
+ truncated,
359
+ };
360
+ }
361
+ function buildSharedImpactResult(graph, request, resolved, traversal) {
362
+ const graphStatus = graph.graphStatus ?? 'complete';
363
+ const warnings = [];
364
+ let confidence = 'high';
365
+ if (graphStatus === 'partial') {
366
+ warnings.push({
367
+ code: 'GRAPH_PARTIAL',
368
+ message: 'Graph truth is partial; parse failures may hide affected files or symbols.',
369
+ });
370
+ confidence = 'reduced';
371
+ }
372
+ if (traversal.truncated) {
373
+ warnings.push({
374
+ code: 'TRAVERSAL_TRUNCATED',
375
+ message: 'Impact traversal hit the configured depth/limit boundary before exhaustion.',
376
+ });
377
+ confidence = 'reduced';
378
+ }
379
+ const transitiveCount = traversal.transitiveLayers.reduce((sum, layer) => sum + layer.nodes.length, 0);
380
+ return {
381
+ status: 'ok',
382
+ confidence,
383
+ graphStatus,
384
+ entrypoint: resolved.entrypoint,
385
+ summary: {
386
+ requestedDepth: request.depth,
387
+ directCount: traversal.direct.length,
388
+ transitiveCount,
389
+ totalCount: traversal.direct.length + transitiveCount,
390
+ maxDepth: traversal.transitiveLayers.at(-1)?.depth ?? (traversal.direct.length > 0 ? 1 : 0),
391
+ truncated: traversal.truncated,
392
+ },
393
+ direct: traversal.direct,
394
+ transitiveLayers: traversal.transitiveLayers,
395
+ warnings,
396
+ truncated: traversal.truncated,
397
+ };
398
+ }
399
+ function toModuleImpactNode(module, depth, path) {
400
+ return {
401
+ id: module.id,
402
+ kind: 'module',
403
+ name: module.path,
404
+ filePath: module.path,
405
+ depth,
406
+ path,
407
+ };
408
+ }
409
+ function toSymbolImpactNode(symbol, depth, path) {
410
+ return {
411
+ id: symbol.id,
412
+ kind: 'symbol',
413
+ name: symbol.name,
414
+ filePath: symbol.location.file,
415
+ depth,
416
+ path,
417
+ symbol: { ...symbol },
418
+ };
419
+ }
420
+ export function analyzeImpactInGraph(graph, request, index) {
421
+ const resolved = resolveImpactEntrypointInGraph(graph, request);
422
+ if (!resolved.ok) {
423
+ return resolved.result;
424
+ }
425
+ if (request.kind === 'file') {
426
+ const moduleMap = index?.moduleById ?? new Map(graph.modules.map((module) => [module.id, module]));
427
+ const traversal = collectImpactTraversal(resolved.rootId, request.depth, request.limit ?? Number.MAX_SAFE_INTEGER, index?.moduleReverseAdjacency ?? buildModuleReverseAdjacency(graph), (id, hop, traversalPath) => {
428
+ const module = moduleMap.get(id);
429
+ return module ? toModuleImpactNode(module, hop, traversalPath) : null;
430
+ });
431
+ return buildSharedImpactResult(graph, request, resolved, traversal);
432
+ }
433
+ const symbolMap = index?.symbolById ?? new Map(graph.symbols.map((symbol) => [symbol.id, symbol]));
434
+ const traversal = collectImpactTraversal(resolved.rootId, request.depth, request.limit, index?.symbolReverseAdjacency ?? buildSymbolReverseAdjacency(graph), (id, hop, traversalPath) => {
435
+ const symbol = symbolMap.get(id);
436
+ return symbol ? toSymbolImpactNode(symbol, hop, traversalPath) : null;
437
+ });
438
+ return buildSharedImpactResult(graph, request, resolved, traversal);
439
+ }
440
+ export function collectIncrementalNeighborhood(graph, changedModulePaths) {
441
+ const normalizedChangedPaths = changedModulePaths.map(normalizePath);
442
+ const moduleById = new Map(graph.modules.map((module) => [module.id, module]));
443
+ const moduleIdByPath = new Map(graph.modules.map((module) => [normalizePath(module.path), module.id]));
444
+ const symbolToModuleId = new Map(graph.symbols.map((symbol) => [symbol.id, symbol.moduleId]));
445
+ const adjacency = new Map();
446
+ const reasonMap = new Map();
447
+ const addEdge = (fromId, toId, reason) => {
448
+ if (!adjacency.has(fromId)) {
449
+ adjacency.set(fromId, new Set());
450
+ }
451
+ adjacency.get(fromId)?.add(toId);
452
+ if (!reasonMap.has(`${fromId}->${toId}`)) {
453
+ reasonMap.set(`${fromId}->${toId}`, reason);
454
+ }
455
+ };
456
+ for (const dependency of graph.dependencies) {
457
+ const sourceModuleId = dependency.sourceEntityType === 'symbol'
458
+ ? symbolToModuleId.get(dependency.sourceId)
459
+ : dependency.sourceId;
460
+ const targetModuleId = dependency.targetEntityType === 'symbol'
461
+ ? symbolToModuleId.get(dependency.targetId)
462
+ : dependency.targetId;
463
+ if (!sourceModuleId || !targetModuleId || sourceModuleId === targetModuleId) {
464
+ continue;
465
+ }
466
+ const conservativeSuffix = isConservativeConfidence(dependency.confidence)
467
+ ? '(保守扩张)'
468
+ : '';
469
+ const reason = `${dependency.type} ${sourceModuleId} -> ${targetModuleId}${conservativeSuffix}`;
470
+ addEdge(sourceModuleId, targetModuleId, reason);
471
+ addEdge(targetModuleId, sourceModuleId, reason);
472
+ }
473
+ const queue = [];
474
+ const visited = new Set();
475
+ const reasons = [];
476
+ for (const changedPath of normalizedChangedPaths) {
477
+ const changedModuleId = moduleIdByPath.get(changedPath);
478
+ if (!changedModuleId) {
479
+ continue;
480
+ }
481
+ queue.push({ moduleId: changedModuleId, depth: 0 });
482
+ reasons.push({
483
+ path: changedPath,
484
+ reason: 'changed file seed',
485
+ });
486
+ }
487
+ while (queue.length > 0) {
488
+ const current = queue.shift();
489
+ if (!current || visited.has(current.moduleId) || current.depth > 2) {
490
+ continue;
491
+ }
492
+ visited.add(current.moduleId);
493
+ const neighbors = adjacency.get(current.moduleId) ?? new Set();
494
+ for (const neighborId of neighbors) {
495
+ if (visited.has(neighborId)) {
496
+ continue;
497
+ }
498
+ const neighbor = moduleById.get(neighborId);
499
+ if (!neighbor) {
500
+ continue;
501
+ }
502
+ reasons.push({
503
+ path: normalizePath(neighbor.path),
504
+ reason: `2-hop invalidation: ${reasonMap.get(`${current.moduleId}->${neighborId}`) ?? 'dependency edge'}`,
505
+ });
506
+ queue.push({ moduleId: neighborId, depth: current.depth + 1 });
507
+ }
508
+ }
509
+ const invalidatedModuleIds = Array.from(visited);
510
+ const invalidatedModulePaths = invalidatedModuleIds
511
+ .map((moduleId) => moduleById.get(moduleId)?.path)
512
+ .filter((value) => Boolean(value))
513
+ .map(normalizePath);
514
+ return {
515
+ invalidatedModuleIds,
516
+ invalidatedModulePaths,
517
+ reasons,
518
+ };
519
+ }
73
520
  export function findCallersInGraph(graph, functionId) {
74
521
  const callerIds = new Set();
75
522
  for (const dependency of graph.dependencies) {
@@ -92,12 +539,18 @@ export function findCalleesInGraph(graph, functionId) {
92
539
  .filter(symbol => calleeIds.has(symbol.id))
93
540
  .map(symbol => ({ ...symbol }));
94
541
  }
95
- export function findDependenciesInGraph(graph, moduleId) {
542
+ export function findDependenciesInGraph(graph, moduleId, index) {
543
+ if (index) {
544
+ return cloneDependencyList(index.dependenciesBySourceId.get(moduleId) ?? []);
545
+ }
96
546
  return graph.dependencies
97
547
  .filter(dependency => dependency.sourceId === moduleId)
98
548
  .map(dependency => ({ ...dependency }));
99
549
  }
100
- export function findDependentsInGraph(graph, moduleId) {
550
+ export function findDependentsInGraph(graph, moduleId, index) {
551
+ if (index) {
552
+ return cloneDependencyList(index.dependenciesByTargetId.get(moduleId) ?? []);
553
+ }
101
554
  return graph.dependencies
102
555
  .filter(dependency => dependency.targetId === moduleId)
103
556
  .map(dependency => ({ ...dependency }));
@@ -135,107 +588,59 @@ export function detectCyclesInGraph(graph) {
135
588
  }
136
589
  return cycles;
137
590
  }
138
- export function calculateImpactInGraph(graph, moduleId, depth) {
139
- const affectedModules = [];
140
- const visited = new Set();
141
- const queue = [{ id: moduleId, level: 0 }];
142
- while (queue.length > 0) {
143
- const current = queue.shift();
144
- if (!current) {
145
- continue;
146
- }
147
- const { id, level } = current;
148
- if (visited.has(id) || level > depth) {
149
- continue;
150
- }
151
- visited.add(id);
152
- if (level > 0) {
153
- const module = graph.modules.find(candidate => candidate.id === id);
154
- if (module) {
155
- affectedModules.push({ ...module });
156
- }
157
- }
158
- for (const dependency of graph.dependencies) {
159
- if (dependency.targetId === id && !visited.has(dependency.sourceId)) {
160
- queue.push({ id: dependency.sourceId, level: level + 1 });
161
- }
162
- }
163
- }
591
+ export function calculateImpactInGraph(graph, moduleId, depth, index) {
592
+ const module = index?.moduleById.get(moduleId)
593
+ ?? graph.modules.find((candidate) => candidate.id === moduleId);
594
+ const shared = module
595
+ ? analyzeImpactInGraph(graph, { kind: 'file', filePath: module.path, depth }, index)
596
+ : createEmptyImpactResult({ kind: 'file', filePath: moduleId, depth }, graph.graphStatus ?? 'complete', {
597
+ status: 'not_found',
598
+ confidence: 'unavailable',
599
+ error: {
600
+ code: 'FILE_NOT_FOUND',
601
+ message: `Module "${moduleId}" not found in the persisted graph.`,
602
+ },
603
+ });
164
604
  return {
605
+ ...shared,
165
606
  rootModule: moduleId,
166
- affectedModules,
607
+ affectedModules: [...shared.direct, ...shared.transitiveLayers.flatMap((layer) => layer.nodes)]
608
+ .map((node) => graph.modules.find((candidate) => candidate.id === node.id))
609
+ .filter((candidate) => Boolean(candidate))
610
+ .map((candidate) => ({ ...candidate })),
167
611
  depth,
168
612
  };
169
613
  }
170
- export function calculateSymbolImpactInGraph(graph, symbolId, depth, limit) {
171
- const rootSymbol = graph.symbols.find(symbol => symbol.id === symbolId);
614
+ export function calculateSymbolImpactInGraph(graph, symbolId, depth, limit, index) {
615
+ const rootSymbol = index?.symbolById.get(symbolId)
616
+ ?? graph.symbols.find(symbol => symbol.id === symbolId);
172
617
  if (!rootSymbol) {
173
618
  throw new Error(`Symbol ${symbolId} not found`);
174
619
  }
175
- const symbolMap = new Map(graph.symbols.map(symbol => [symbol.id, symbol]));
176
- const callerMap = new Map();
177
- for (const dependency of graph.dependencies) {
178
- if (dependency.type !== 'call'
179
- || dependency.sourceEntityType !== 'symbol'
180
- || dependency.targetEntityType !== 'symbol') {
181
- continue;
182
- }
183
- const existing = callerMap.get(dependency.targetId) ?? [];
184
- existing.push(dependency);
185
- callerMap.set(dependency.targetId, existing);
186
- }
187
- const affectedSymbols = [];
188
- const visited = new Set([symbolId]);
189
- const queue = [{
190
- id: symbolId,
191
- level: 0,
192
- path: [symbolId],
193
- }];
194
- let truncated = false;
195
- while (queue.length > 0) {
196
- const current = queue.shift();
197
- if (!current) {
198
- continue;
199
- }
200
- if (current.level >= depth) {
201
- continue;
202
- }
203
- const callers = callerMap.get(current.id) ?? [];
204
- for (const dependency of callers) {
205
- if (affectedSymbols.length >= limit) {
206
- truncated = true;
207
- queue.length = 0;
208
- break;
209
- }
210
- const callerId = dependency.sourceId;
211
- if (visited.has(callerId)) {
212
- continue;
213
- }
214
- const callerSymbol = symbolMap.get(callerId);
215
- if (!callerSymbol) {
216
- continue;
217
- }
218
- visited.add(callerId);
219
- const nextPath = [...current.path, callerId];
220
- const nextLevel = current.level + 1;
221
- affectedSymbols.push({
222
- symbol: { ...callerSymbol },
223
- depth: nextLevel,
224
- path: nextPath,
225
- });
226
- queue.push({
227
- id: callerId,
228
- level: nextLevel,
229
- path: nextPath,
230
- });
231
- }
232
- }
620
+ const shared = analyzeImpactInGraph(graph, {
621
+ kind: 'symbol',
622
+ symbol: rootSymbol.name,
623
+ filePath: rootSymbol.location.file,
624
+ depth,
625
+ limit,
626
+ }, index);
627
+ const flattenedNodes = [
628
+ ...shared.direct,
629
+ ...shared.transitiveLayers.flatMap((layer) => layer.nodes),
630
+ ];
233
631
  return {
632
+ ...shared,
234
633
  rootSymbol: { ...rootSymbol },
235
- affectedSymbols,
634
+ affectedSymbols: flattenedNodes
635
+ .map((node) => graph.symbols.find((candidate) => candidate.id === node.id))
636
+ .filter((candidate) => Boolean(candidate))
637
+ .map((candidate, index) => {
638
+ const flattenedNode = flattenedNodes[index];
639
+ return toSymbolImpactNode(candidate, flattenedNode.depth, flattenedNode.path);
640
+ }),
236
641
  depth,
237
642
  limit,
238
- truncated,
643
+ truncated: shared.truncated,
239
644
  };
240
645
  }
241
646
  export function getProjectStatisticsFromGraph(graph) {