codesift-mcp 0.14.0 → 0.15.1

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 (458) hide show
  1. package/README.md +5 -1
  2. package/dist/cli/commands-admin.d.ts +18 -0
  3. package/dist/cli/commands-admin.d.ts.map +1 -0
  4. package/dist/cli/commands-admin.js +187 -0
  5. package/dist/cli/commands-admin.js.map +1 -0
  6. package/dist/cli/commands-daemon.d.ts +42 -0
  7. package/dist/cli/commands-daemon.d.ts.map +1 -0
  8. package/dist/cli/commands-daemon.js +163 -0
  9. package/dist/cli/commands-daemon.js.map +1 -0
  10. package/dist/cli/commands-index.d.ts +12 -0
  11. package/dist/cli/commands-index.d.ts.map +1 -0
  12. package/dist/cli/commands-index.js +133 -0
  13. package/dist/cli/commands-index.js.map +1 -0
  14. package/dist/cli/commands-maintenance.d.ts +12 -0
  15. package/dist/cli/commands-maintenance.d.ts.map +1 -0
  16. package/dist/cli/commands-maintenance.js +409 -0
  17. package/dist/cli/commands-maintenance.js.map +1 -0
  18. package/dist/cli/commands-query.d.ts +21 -0
  19. package/dist/cli/commands-query.d.ts.map +1 -0
  20. package/dist/cli/commands-query.js +270 -0
  21. package/dist/cli/commands-query.js.map +1 -0
  22. package/dist/cli/commands.d.ts +2 -36
  23. package/dist/cli/commands.d.ts.map +1 -1
  24. package/dist/cli/commands.js +8 -867
  25. package/dist/cli/commands.js.map +1 -1
  26. package/dist/cli/embed-child.js +13 -2
  27. package/dist/cli/embed-child.js.map +1 -1
  28. package/dist/instructions.d.ts +1 -1
  29. package/dist/instructions.d.ts.map +1 -1
  30. package/dist/instructions.js +5 -2
  31. package/dist/instructions.js.map +1 -1
  32. package/dist/parser/extractors/php-class-metadata.d.ts +10 -0
  33. package/dist/parser/extractors/php-class-metadata.d.ts.map +1 -0
  34. package/dist/parser/extractors/php-class-metadata.js +65 -0
  35. package/dist/parser/extractors/php-class-metadata.js.map +1 -0
  36. package/dist/parser/extractors/php-doc.d.ts +13 -0
  37. package/dist/parser/extractors/php-doc.d.ts.map +1 -0
  38. package/dist/parser/extractors/php-doc.js +39 -0
  39. package/dist/parser/extractors/php-doc.js.map +1 -0
  40. package/dist/parser/extractors/php-node-metadata.d.ts +26 -0
  41. package/dist/parser/extractors/php-node-metadata.d.ts.map +1 -0
  42. package/dist/parser/extractors/php-node-metadata.js +132 -0
  43. package/dist/parser/extractors/php-node-metadata.js.map +1 -0
  44. package/dist/parser/extractors/php-symbol-builders.d.ts +13 -0
  45. package/dist/parser/extractors/php-symbol-builders.d.ts.map +1 -0
  46. package/dist/parser/extractors/php-symbol-builders.js +58 -0
  47. package/dist/parser/extractors/php-symbol-builders.js.map +1 -0
  48. package/dist/parser/extractors/php-walker.d.ts +4 -0
  49. package/dist/parser/extractors/php-walker.d.ts.map +1 -0
  50. package/dist/parser/extractors/php-walker.js +238 -0
  51. package/dist/parser/extractors/php-walker.js.map +1 -0
  52. package/dist/parser/extractors/php.d.ts +2 -33
  53. package/dist/parser/extractors/php.d.ts.map +1 -1
  54. package/dist/parser/extractors/php.js +2 -747
  55. package/dist/parser/extractors/php.js.map +1 -1
  56. package/dist/register-tool-loaders.d.ts +11 -11
  57. package/dist/register-tool-loaders.d.ts.map +1 -1
  58. package/dist/register-tools/runtime.d.ts +11 -0
  59. package/dist/register-tools/runtime.d.ts.map +1 -1
  60. package/dist/register-tools/runtime.js +40 -0
  61. package/dist/register-tools/runtime.js.map +1 -1
  62. package/dist/register-tools.d.ts.map +1 -1
  63. package/dist/register-tools.js +5 -1
  64. package/dist/register-tools.js.map +1 -1
  65. package/dist/retrieval/semantic-handlers.d.ts.map +1 -1
  66. package/dist/retrieval/semantic-handlers.js +10 -3
  67. package/dist/retrieval/semantic-handlers.js.map +1 -1
  68. package/dist/search/semantic.d.ts +2 -0
  69. package/dist/search/semantic.d.ts.map +1 -1
  70. package/dist/search/semantic.js +41 -9
  71. package/dist/search/semantic.js.map +1 -1
  72. package/dist/storage/chunk-store.d.ts +14 -2
  73. package/dist/storage/chunk-store.d.ts.map +1 -1
  74. package/dist/storage/chunk-store.js +214 -34
  75. package/dist/storage/chunk-store.js.map +1 -1
  76. package/dist/storage/embedding-store.d.ts +0 -12
  77. package/dist/storage/embedding-store.d.ts.map +1 -1
  78. package/dist/storage/embedding-store.js +69 -9
  79. package/dist/storage/embedding-store.js.map +1 -1
  80. package/dist/storage/index-cache.d.ts +12 -0
  81. package/dist/storage/index-cache.d.ts.map +1 -0
  82. package/dist/storage/index-cache.js +89 -0
  83. package/dist/storage/index-cache.js.map +1 -0
  84. package/dist/storage/index-json-mutations.d.ts +11 -0
  85. package/dist/storage/index-json-mutations.d.ts.map +1 -0
  86. package/dist/storage/index-json-mutations.js +93 -0
  87. package/dist/storage/index-json-mutations.js.map +1 -0
  88. package/dist/storage/index-migration.d.ts +22 -0
  89. package/dist/storage/index-migration.d.ts.map +1 -0
  90. package/dist/storage/index-migration.js +80 -0
  91. package/dist/storage/index-migration.js.map +1 -0
  92. package/dist/storage/index-store.d.ts +5 -61
  93. package/dist/storage/index-store.d.ts.map +1 -1
  94. package/dist/storage/index-store.js +33 -414
  95. package/dist/storage/index-store.js.map +1 -1
  96. package/dist/storage/index-version.d.ts +39 -0
  97. package/dist/storage/index-version.d.ts.map +1 -0
  98. package/dist/storage/index-version.js +87 -0
  99. package/dist/storage/index-version.js.map +1 -0
  100. package/dist/storage/registry.d.ts +9 -1
  101. package/dist/storage/registry.d.ts.map +1 -1
  102. package/dist/storage/registry.js +169 -8
  103. package/dist/storage/registry.js.map +1 -1
  104. package/dist/storage/shared-embedding-cache.d.ts +23 -3
  105. package/dist/storage/shared-embedding-cache.d.ts.map +1 -1
  106. package/dist/storage/shared-embedding-cache.js +300 -45
  107. package/dist/storage/shared-embedding-cache.js.map +1 -1
  108. package/dist/storage/telemetry/config.d.ts.map +1 -1
  109. package/dist/storage/telemetry/config.js +3 -2
  110. package/dist/storage/telemetry/config.js.map +1 -1
  111. package/dist/storage/telemetry/retro-aggregator.d.ts +21 -0
  112. package/dist/storage/telemetry/retro-aggregator.d.ts.map +1 -1
  113. package/dist/storage/telemetry/retro-aggregator.js +58 -16
  114. package/dist/storage/telemetry/retro-aggregator.js.map +1 -1
  115. package/dist/storage/telemetry/sanitizer.d.ts +16 -0
  116. package/dist/storage/telemetry/sanitizer.d.ts.map +1 -1
  117. package/dist/storage/telemetry/sanitizer.js +2 -0
  118. package/dist/storage/telemetry/sanitizer.js.map +1 -1
  119. package/dist/storage/telemetry/uploader.d.ts +3 -1
  120. package/dist/storage/telemetry/uploader.d.ts.map +1 -1
  121. package/dist/storage/telemetry/uploader.js +158 -21
  122. package/dist/storage/telemetry/uploader.js.map +1 -1
  123. package/dist/storage/usage-tracker.d.ts +8 -12
  124. package/dist/storage/usage-tracker.d.ts.map +1 -1
  125. package/dist/storage/usage-tracker.js +74 -1
  126. package/dist/storage/usage-tracker.js.map +1 -1
  127. package/dist/tools/cross-repo-contract-adapters.d.ts +39 -0
  128. package/dist/tools/cross-repo-contract-adapters.d.ts.map +1 -0
  129. package/dist/tools/cross-repo-contract-adapters.js +70 -0
  130. package/dist/tools/cross-repo-contract-adapters.js.map +1 -0
  131. package/dist/tools/cross-repo-contract-group.d.ts +17 -0
  132. package/dist/tools/cross-repo-contract-group.d.ts.map +1 -0
  133. package/dist/tools/cross-repo-contract-group.js +89 -0
  134. package/dist/tools/cross-repo-contract-group.js.map +1 -0
  135. package/dist/tools/cross-repo-contract-matcher.d.ts +24 -0
  136. package/dist/tools/cross-repo-contract-matcher.d.ts.map +1 -0
  137. package/dist/tools/cross-repo-contract-matcher.js +134 -0
  138. package/dist/tools/cross-repo-contract-matcher.js.map +1 -0
  139. package/dist/tools/cross-repo-contract-resolver.d.ts +9 -0
  140. package/dist/tools/cross-repo-contract-resolver.d.ts.map +1 -0
  141. package/dist/tools/cross-repo-contract-resolver.js +86 -0
  142. package/dist/tools/cross-repo-contract-resolver.js.map +1 -0
  143. package/dist/tools/cross-repo-contract-tools.d.ts +12 -135
  144. package/dist/tools/cross-repo-contract-tools.d.ts.map +1 -1
  145. package/dist/tools/cross-repo-contract-tools.js +8 -589
  146. package/dist/tools/cross-repo-contract-tools.js.map +1 -1
  147. package/dist/tools/cross-repo-contract-types.d.ts +30 -0
  148. package/dist/tools/cross-repo-contract-types.d.ts.map +1 -0
  149. package/dist/tools/cross-repo-contract-types.js +3 -0
  150. package/dist/tools/cross-repo-contract-types.js.map +1 -0
  151. package/dist/tools/cross-repo-outbound-calls.d.ts +28 -0
  152. package/dist/tools/cross-repo-outbound-calls.d.ts.map +1 -0
  153. package/dist/tools/cross-repo-outbound-calls.js +347 -0
  154. package/dist/tools/cross-repo-outbound-calls.js.map +1 -0
  155. package/dist/tools/cross-repo-outbound-lexer/call-detectors.d.ts.map +1 -1
  156. package/dist/tools/cross-repo-outbound-lexer/call-detectors.js +2 -0
  157. package/dist/tools/cross-repo-outbound-lexer/call-detectors.js.map +1 -1
  158. package/dist/tools/cross-repo-outbound-lexer/types.d.ts +2 -0
  159. package/dist/tools/cross-repo-outbound-lexer/types.d.ts.map +1 -1
  160. package/dist/tools/index-tools/file-indexer.js +3 -3
  161. package/dist/tools/index-tools/file-indexer.js.map +1 -1
  162. package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -1
  163. package/dist/tools/index-tools/folder-indexer.js +47 -2
  164. package/dist/tools/index-tools/folder-indexer.js.map +1 -1
  165. package/dist/tools/index-tools/parse.d.ts +12 -3
  166. package/dist/tools/index-tools/parse.d.ts.map +1 -1
  167. package/dist/tools/index-tools/parse.js +33 -8
  168. package/dist/tools/index-tools/parse.js.map +1 -1
  169. package/dist/tools/index-tools/registry.d.ts +19 -0
  170. package/dist/tools/index-tools/registry.d.ts.map +1 -1
  171. package/dist/tools/index-tools/registry.js +88 -2
  172. package/dist/tools/index-tools/registry.js.map +1 -1
  173. package/dist/tools/index-tools/state.d.ts +31 -0
  174. package/dist/tools/index-tools/state.d.ts.map +1 -1
  175. package/dist/tools/index-tools/state.js +53 -0
  176. package/dist/tools/index-tools/state.js.map +1 -1
  177. package/dist/tools/index-tools/types.d.ts +9 -0
  178. package/dist/tools/index-tools/types.d.ts.map +1 -1
  179. package/dist/tools/index-tools/watcher.js +3 -3
  180. package/dist/tools/index-tools/watcher.js.map +1 -1
  181. package/dist/tools/index-tools/worktree-seed.d.ts +44 -0
  182. package/dist/tools/index-tools/worktree-seed.d.ts.map +1 -0
  183. package/dist/tools/index-tools/worktree-seed.js +302 -0
  184. package/dist/tools/index-tools/worktree-seed.js.map +1 -0
  185. package/dist/tools/index-tools.d.ts.map +1 -1
  186. package/dist/tools/index-tools.js +3 -1
  187. package/dist/tools/index-tools.js.map +1 -1
  188. package/dist/tools/nest-ext-tools/graphql.d.ts +17 -0
  189. package/dist/tools/nest-ext-tools/graphql.d.ts.map +1 -0
  190. package/dist/tools/nest-ext-tools/graphql.js +54 -0
  191. package/dist/tools/nest-ext-tools/graphql.js.map +1 -0
  192. package/dist/tools/nest-ext-tools/microservice.d.ts +17 -0
  193. package/dist/tools/nest-ext-tools/microservice.d.ts.map +1 -0
  194. package/dist/tools/nest-ext-tools/microservice.js +51 -0
  195. package/dist/tools/nest-ext-tools/microservice.js.map +1 -0
  196. package/dist/tools/nest-ext-tools/openapi.d.ts +81 -0
  197. package/dist/tools/nest-ext-tools/openapi.d.ts.map +1 -0
  198. package/dist/tools/nest-ext-tools/openapi.js +254 -0
  199. package/dist/tools/nest-ext-tools/openapi.js.map +1 -0
  200. package/dist/tools/nest-ext-tools/queue.d.ts +27 -0
  201. package/dist/tools/nest-ext-tools/queue.d.ts.map +1 -0
  202. package/dist/tools/nest-ext-tools/queue.js +95 -0
  203. package/dist/tools/nest-ext-tools/queue.js.map +1 -0
  204. package/dist/tools/nest-ext-tools/schedule.d.ts +19 -0
  205. package/dist/tools/nest-ext-tools/schedule.d.ts.map +1 -0
  206. package/dist/tools/nest-ext-tools/schedule.js +89 -0
  207. package/dist/tools/nest-ext-tools/schedule.js.map +1 -0
  208. package/dist/tools/nest-ext-tools/scope.d.ts +19 -0
  209. package/dist/tools/nest-ext-tools/scope.d.ts.map +1 -0
  210. package/dist/tools/nest-ext-tools/scope.js +151 -0
  211. package/dist/tools/nest-ext-tools/scope.js.map +1 -0
  212. package/dist/tools/nest-ext-tools/shared.d.ts +33 -0
  213. package/dist/tools/nest-ext-tools/shared.d.ts.map +1 -0
  214. package/dist/tools/nest-ext-tools/shared.js +279 -0
  215. package/dist/tools/nest-ext-tools/shared.js.map +1 -0
  216. package/dist/tools/nest-ext-tools/typeorm.d.ts +22 -0
  217. package/dist/tools/nest-ext-tools/typeorm.d.ts.map +1 -0
  218. package/dist/tools/nest-ext-tools/typeorm.js +59 -0
  219. package/dist/tools/nest-ext-tools/typeorm.js.map +1 -0
  220. package/dist/tools/nest-ext-tools/websocket.d.ts +21 -0
  221. package/dist/tools/nest-ext-tools/websocket.d.ts.map +1 -0
  222. package/dist/tools/nest-ext-tools/websocket.js +70 -0
  223. package/dist/tools/nest-ext-tools/websocket.js.map +1 -0
  224. package/dist/tools/nest-ext-tools.d.ts +10 -204
  225. package/dist/tools/nest-ext-tools.d.ts.map +1 -1
  226. package/dist/tools/nest-ext-tools.js +10 -749
  227. package/dist/tools/nest-ext-tools.js.map +1 -1
  228. package/dist/tools/perf-tools.js +2 -2
  229. package/dist/tools/python-audit/checks/dead-code.d.ts +1 -1
  230. package/dist/tools/python-audit/checks/dead-code.d.ts.map +1 -1
  231. package/dist/tools/python-constants/constant-match.d.ts +5 -0
  232. package/dist/tools/python-constants/constant-match.d.ts.map +1 -0
  233. package/dist/tools/python-constants/constant-match.js +24 -0
  234. package/dist/tools/python-constants/constant-match.js.map +1 -0
  235. package/dist/tools/python-constants/file-context.d.ts +5 -0
  236. package/dist/tools/python-constants/file-context.d.ts.map +1 -0
  237. package/dist/tools/python-constants/file-context.js +91 -0
  238. package/dist/tools/python-constants/file-context.js.map +1 -0
  239. package/dist/tools/python-constants/function-defaults.d.ts +5 -0
  240. package/dist/tools/python-constants/function-defaults.d.ts.map +1 -0
  241. package/dist/tools/python-constants/function-defaults.js +98 -0
  242. package/dist/tools/python-constants/function-defaults.js.map +1 -0
  243. package/dist/tools/python-constants/model.d.ts +78 -0
  244. package/dist/tools/python-constants/model.d.ts.map +1 -0
  245. package/dist/tools/python-constants/model.js +2 -0
  246. package/dist/tools/python-constants/model.js.map +1 -0
  247. package/dist/tools/python-constants/syntax.d.ts +22 -0
  248. package/dist/tools/python-constants/syntax.d.ts.map +1 -0
  249. package/dist/tools/python-constants/syntax.js +93 -0
  250. package/dist/tools/python-constants/syntax.js.map +1 -0
  251. package/dist/tools/python-constants/value-resolver.d.ts +6 -0
  252. package/dist/tools/python-constants/value-resolver.d.ts.map +1 -0
  253. package/dist/tools/python-constants/value-resolver.js +320 -0
  254. package/dist/tools/python-constants/value-resolver.js.map +1 -0
  255. package/dist/tools/python-constants-tools.d.ts +3 -45
  256. package/dist/tools/python-constants-tools.d.ts.map +1 -1
  257. package/dist/tools/python-constants-tools.js +2 -505
  258. package/dist/tools/python-constants-tools.js.map +1 -1
  259. package/dist/tools/route-tools/django.d.ts +8 -0
  260. package/dist/tools/route-tools/django.d.ts.map +1 -0
  261. package/dist/tools/route-tools/django.js +52 -0
  262. package/dist/tools/route-tools/django.js.map +1 -0
  263. package/dist/tools/route-tools/express.d.ts +5 -0
  264. package/dist/tools/route-tools/express.d.ts.map +1 -0
  265. package/dist/tools/route-tools/express.js +33 -0
  266. package/dist/tools/route-tools/express.js.map +1 -0
  267. package/dist/tools/route-tools/file-sources.d.ts +7 -0
  268. package/dist/tools/route-tools/file-sources.d.ts.map +1 -0
  269. package/dist/tools/route-tools/file-sources.js +15 -0
  270. package/dist/tools/route-tools/file-sources.js.map +1 -0
  271. package/dist/tools/route-tools/handler-discovery.d.ts +4 -0
  272. package/dist/tools/route-tools/handler-discovery.d.ts.map +1 -0
  273. package/dist/tools/route-tools/handler-discovery.js +38 -0
  274. package/dist/tools/route-tools/handler-discovery.js.map +1 -0
  275. package/dist/tools/route-tools/hono.d.ts +5 -0
  276. package/dist/tools/route-tools/hono.d.ts.map +1 -0
  277. package/dist/tools/route-tools/hono.js +61 -0
  278. package/dist/tools/route-tools/hono.js.map +1 -0
  279. package/dist/tools/route-tools/ktor.d.ts +5 -0
  280. package/dist/tools/route-tools/ktor.d.ts.map +1 -0
  281. package/dist/tools/route-tools/ktor.js +76 -0
  282. package/dist/tools/route-tools/ktor.js.map +1 -0
  283. package/dist/tools/route-tools/laravel.d.ts +5 -0
  284. package/dist/tools/route-tools/laravel.d.ts.map +1 -0
  285. package/dist/tools/route-tools/laravel.js +45 -0
  286. package/dist/tools/route-tools/laravel.js.map +1 -0
  287. package/dist/tools/route-tools/mermaid-call-chain.d.ts +3 -0
  288. package/dist/tools/route-tools/mermaid-call-chain.d.ts.map +1 -0
  289. package/dist/tools/route-tools/mermaid-call-chain.js +50 -0
  290. package/dist/tools/route-tools/mermaid-call-chain.js.map +1 -0
  291. package/dist/tools/route-tools/nest.d.ts +5 -0
  292. package/dist/tools/route-tools/nest.d.ts.map +1 -0
  293. package/dist/tools/route-tools/nest.js +75 -0
  294. package/dist/tools/route-tools/nest.js.map +1 -0
  295. package/dist/tools/route-tools/next-trace.d.ts +4 -0
  296. package/dist/tools/route-tools/next-trace.d.ts.map +1 -0
  297. package/dist/tools/route-tools/next-trace.js +48 -0
  298. package/dist/tools/route-tools/next-trace.js.map +1 -0
  299. package/dist/tools/route-tools/next.d.ts +7 -0
  300. package/dist/tools/route-tools/next.d.ts.map +1 -0
  301. package/dist/tools/route-tools/next.js +77 -0
  302. package/dist/tools/route-tools/next.js.map +1 -0
  303. package/dist/tools/route-tools/python-decorators.d.ts +7 -0
  304. package/dist/tools/route-tools/python-decorators.d.ts.map +1 -0
  305. package/dist/tools/route-tools/python-decorators.js +53 -0
  306. package/dist/tools/route-tools/python-decorators.js.map +1 -0
  307. package/dist/tools/route-tools/route-mermaid.d.ts +4 -0
  308. package/dist/tools/route-tools/route-mermaid.d.ts.map +1 -0
  309. package/dist/tools/route-tools/route-mermaid.js +53 -0
  310. package/dist/tools/route-tools/route-mermaid.js.map +1 -0
  311. package/dist/tools/route-tools/spring-kotlin.d.ts +5 -0
  312. package/dist/tools/route-tools/spring-kotlin.d.ts.map +1 -0
  313. package/dist/tools/route-tools/spring-kotlin.js +52 -0
  314. package/dist/tools/route-tools/spring-kotlin.js.map +1 -0
  315. package/dist/tools/route-tools/trace-analysis.d.ts +4 -0
  316. package/dist/tools/route-tools/trace-analysis.d.ts.map +1 -0
  317. package/dist/tools/route-tools/trace-analysis.js +37 -0
  318. package/dist/tools/route-tools/trace-analysis.js.map +1 -0
  319. package/dist/tools/route-tools/trace-route.d.ts +6 -0
  320. package/dist/tools/route-tools/trace-route.d.ts.map +1 -0
  321. package/dist/tools/route-tools/trace-route.js +53 -0
  322. package/dist/tools/route-tools/trace-route.js.map +1 -0
  323. package/dist/tools/route-tools/types.d.ts +35 -0
  324. package/dist/tools/route-tools/types.d.ts.map +1 -0
  325. package/dist/tools/route-tools/types.js +2 -0
  326. package/dist/tools/route-tools/types.js.map +1 -0
  327. package/dist/tools/route-tools/yii2.d.ts +5 -0
  328. package/dist/tools/route-tools/yii2.d.ts.map +1 -0
  329. package/dist/tools/route-tools/yii2.js +73 -0
  330. package/dist/tools/route-tools/yii2.js.map +1 -0
  331. package/dist/tools/route-tools.d.ts +7 -49
  332. package/dist/tools/route-tools.d.ts.map +1 -1
  333. package/dist/tools/route-tools.js +5 -978
  334. package/dist/tools/route-tools.js.map +1 -1
  335. package/dist/tools/symbol-analysis-tools.d.ts +81 -0
  336. package/dist/tools/symbol-analysis-tools.d.ts.map +1 -0
  337. package/dist/tools/symbol-analysis-tools.js +327 -0
  338. package/dist/tools/symbol-analysis-tools.js.map +1 -0
  339. package/dist/tools/symbol-context-tools.d.ts +68 -0
  340. package/dist/tools/symbol-context-tools.d.ts.map +1 -0
  341. package/dist/tools/symbol-context-tools.js +232 -0
  342. package/dist/tools/symbol-context-tools.js.map +1 -0
  343. package/dist/tools/symbol-lookup-tools.d.ts +77 -0
  344. package/dist/tools/symbol-lookup-tools.d.ts.map +1 -0
  345. package/dist/tools/symbol-lookup-tools.js +305 -0
  346. package/dist/tools/symbol-lookup-tools.js.map +1 -0
  347. package/dist/tools/symbol-reference-tools.d.ts +38 -0
  348. package/dist/tools/symbol-reference-tools.d.ts.map +1 -0
  349. package/dist/tools/symbol-reference-tools.js +253 -0
  350. package/dist/tools/symbol-reference-tools.js.map +1 -0
  351. package/dist/tools/symbol-tool-internals.d.ts +9 -0
  352. package/dist/tools/symbol-tool-internals.d.ts.map +1 -0
  353. package/dist/tools/symbol-tool-internals.js +47 -0
  354. package/dist/tools/symbol-tool-internals.js.map +1 -0
  355. package/dist/tools/symbol-tools.d.ts +11 -270
  356. package/dist/tools/symbol-tools.d.ts.map +1 -1
  357. package/dist/tools/symbol-tools.js +7 -1131
  358. package/dist/tools/symbol-tools.js.map +1 -1
  359. package/dist/tools/taint/python-context.d.ts +10 -0
  360. package/dist/tools/taint/python-context.d.ts.map +1 -0
  361. package/dist/tools/taint/python-context.js +150 -0
  362. package/dist/tools/taint/python-context.js.map +1 -0
  363. package/dist/tools/taint/taint-analyzer.d.ts +2 -0
  364. package/dist/tools/taint/taint-analyzer.d.ts.map +1 -0
  365. package/dist/tools/taint/taint-analyzer.js +2 -0
  366. package/dist/tools/taint/taint-analyzer.js.map +1 -0
  367. package/dist/tools/taint/taint-expression.d.ts +18 -0
  368. package/dist/tools/taint/taint-expression.d.ts.map +1 -0
  369. package/dist/tools/taint/taint-expression.js +265 -0
  370. package/dist/tools/taint/taint-expression.js.map +1 -0
  371. package/dist/tools/taint/taint-flow.d.ts +10 -0
  372. package/dist/tools/taint/taint-flow.d.ts.map +1 -0
  373. package/dist/tools/taint/taint-flow.js +178 -0
  374. package/dist/tools/taint/taint-flow.js.map +1 -0
  375. package/dist/tools/taint/taint-model.d.ts +113 -0
  376. package/dist/tools/taint/taint-model.d.ts.map +1 -0
  377. package/dist/tools/taint/taint-model.js +277 -0
  378. package/dist/tools/taint/taint-model.js.map +1 -0
  379. package/dist/tools/taint-tools.d.ts +2 -34
  380. package/dist/tools/taint-tools.d.ts.map +1 -1
  381. package/dist/tools/taint-tools.js +2 -852
  382. package/dist/tools/taint-tools.js.map +1 -1
  383. package/dist/tools/typescript-constants/file-context.d.ts +7 -0
  384. package/dist/tools/typescript-constants/file-context.d.ts.map +1 -0
  385. package/dist/tools/typescript-constants/file-context.js +219 -0
  386. package/dist/tools/typescript-constants/file-context.js.map +1 -0
  387. package/dist/tools/typescript-constants/symbol-resolver.d.ts +7 -0
  388. package/dist/tools/typescript-constants/symbol-resolver.d.ts.map +1 -0
  389. package/dist/tools/typescript-constants/symbol-resolver.js +165 -0
  390. package/dist/tools/typescript-constants/symbol-resolver.js.map +1 -0
  391. package/dist/tools/typescript-constants/types.d.ts +44 -0
  392. package/dist/tools/typescript-constants/types.d.ts.map +1 -0
  393. package/dist/tools/typescript-constants/types.js +2 -0
  394. package/dist/tools/typescript-constants/types.js.map +1 -0
  395. package/dist/tools/typescript-constants/value-evaluator.d.ts +8 -0
  396. package/dist/tools/typescript-constants/value-evaluator.d.ts.map +1 -0
  397. package/dist/tools/typescript-constants/value-evaluator.js +404 -0
  398. package/dist/tools/typescript-constants/value-evaluator.js.map +1 -0
  399. package/dist/tools/typescript-constants-tools.d.ts.map +1 -1
  400. package/dist/tools/typescript-constants-tools.js +19 -709
  401. package/dist/tools/typescript-constants-tools.js.map +1 -1
  402. package/dist/utils/import-graph/collect.d.ts +5 -0
  403. package/dist/utils/import-graph/collect.d.ts.map +1 -0
  404. package/dist/utils/import-graph/collect.js +47 -0
  405. package/dist/utils/import-graph/collect.js.map +1 -0
  406. package/dist/utils/import-graph/edge-accumulator.d.ts +7 -0
  407. package/dist/utils/import-graph/edge-accumulator.d.ts.map +1 -0
  408. package/dist/utils/import-graph/edge-accumulator.js +47 -0
  409. package/dist/utils/import-graph/edge-accumulator.js.map +1 -0
  410. package/dist/utils/import-graph/language-imports.d.ts +6 -0
  411. package/dist/utils/import-graph/language-imports.d.ts.map +1 -0
  412. package/dist/utils/import-graph/language-imports.js +84 -0
  413. package/dist/utils/import-graph/language-imports.js.map +1 -0
  414. package/dist/utils/import-graph/metrics.d.ts +6 -0
  415. package/dist/utils/import-graph/metrics.d.ts.map +1 -0
  416. package/dist/utils/import-graph/metrics.js +51 -0
  417. package/dist/utils/import-graph/metrics.js.map +1 -0
  418. package/dist/utils/import-graph/path-map.d.ts +7 -0
  419. package/dist/utils/import-graph/path-map.d.ts.map +1 -0
  420. package/dist/utils/import-graph/path-map.js +56 -0
  421. package/dist/utils/import-graph/path-map.js.map +1 -0
  422. package/dist/utils/import-graph/python-php-edge-collectors.d.ts +5 -0
  423. package/dist/utils/import-graph/python-php-edge-collectors.d.ts.map +1 -0
  424. package/dist/utils/import-graph/python-php-edge-collectors.js +56 -0
  425. package/dist/utils/import-graph/python-php-edge-collectors.js.map +1 -0
  426. package/dist/utils/import-graph/source-edge-collector.d.ts +13 -0
  427. package/dist/utils/import-graph/source-edge-collector.d.ts.map +1 -0
  428. package/dist/utils/import-graph/source-edge-collector.js +42 -0
  429. package/dist/utils/import-graph/source-edge-collector.js.map +1 -0
  430. package/dist/utils/import-graph/source-imports.d.ts +5 -0
  431. package/dist/utils/import-graph/source-imports.d.ts.map +1 -0
  432. package/dist/utils/import-graph/source-imports.js +33 -0
  433. package/dist/utils/import-graph/source-imports.js.map +1 -0
  434. package/dist/utils/import-graph/types.d.ts +15 -0
  435. package/dist/utils/import-graph/types.d.ts.map +1 -0
  436. package/dist/utils/import-graph/types.js +2 -0
  437. package/dist/utils/import-graph/types.js.map +1 -0
  438. package/dist/utils/import-graph/typescript-edge-collector.d.ts +7 -0
  439. package/dist/utils/import-graph/typescript-edge-collector.d.ts.map +1 -0
  440. package/dist/utils/import-graph/typescript-edge-collector.js +58 -0
  441. package/dist/utils/import-graph/typescript-edge-collector.js.map +1 -0
  442. package/dist/utils/import-graph/workspace-alias.d.ts +7 -0
  443. package/dist/utils/import-graph/workspace-alias.d.ts.map +1 -0
  444. package/dist/utils/import-graph/workspace-alias.js +95 -0
  445. package/dist/utils/import-graph/workspace-alias.js.map +1 -0
  446. package/dist/utils/import-graph/workspace-entry.d.ts +3 -0
  447. package/dist/utils/import-graph/workspace-entry.d.ts.map +1 -0
  448. package/dist/utils/import-graph/workspace-entry.js +81 -0
  449. package/dist/utils/import-graph/workspace-entry.js.map +1 -0
  450. package/dist/utils/import-graph.d.ts +10 -94
  451. package/dist/utils/import-graph.d.ts.map +1 -1
  452. package/dist/utils/import-graph.js +6 -702
  453. package/dist/utils/import-graph.js.map +1 -1
  454. package/package.json +1 -1
  455. package/rules/codesift.md +11 -2
  456. package/rules/codesift.mdc +11 -2
  457. package/rules/codex.md +11 -2
  458. package/rules/gemini.md +11 -2
@@ -1,748 +1,3 @@
1
- import { getNodeName, makeSymbol } from "./_shared.js";
2
- // --- PHPDoc tag parser ---
3
- /**
4
- * Parse `@property` and `@method` tags from a PHPDoc block.
5
- * Used to synthesize Yii2 ActiveRecord magic properties (which live only in
6
- * the docblock, not as real PHP fields).
7
- *
8
- * Supports forms:
9
- * @property int $id → { tag: "property", name: "id", type: "int" }
10
- * @property string $name → { tag: "property", name: "name", type: "string" }
11
- * @method getPosts() → { tag: "method", name: "getPosts" }
12
- * @method ActiveQuery getPosts() → { tag: "method", name: "getPosts", type: "ActiveQuery" }
13
- *
14
- * Returns [] for empty / undefined input. Tag order is preserved.
15
- */
16
- export function parsePhpDocTags(docstring) {
17
- if (!docstring)
18
- return [];
19
- const results = [];
20
- const propRe = /@property(?:-read|-write)?\s+(\S+)\s+\$(\w+)/g;
21
- let m;
22
- while ((m = propRe.exec(docstring)) !== null) {
23
- const entry = {
24
- tag: "property",
25
- name: m[2],
26
- };
27
- if (m[1])
28
- entry.type = m[1];
29
- results.push(entry);
30
- }
31
- // @method [returnType] name(args)
32
- // - With return type: @method ActiveQuery getPosts(int $limit)
33
- // - Without type: @method getPosts()
34
- const methodRe = /@method\s+(?:(\S+)\s+)?(\w+)\s*\(/g;
35
- while ((m = methodRe.exec(docstring)) !== null) {
36
- const entry = {
37
- tag: "method",
38
- name: m[2],
39
- };
40
- if (m[1])
41
- entry.type = m[1];
42
- results.push(entry);
43
- }
44
- return results;
45
- }
46
- /**
47
- * Extract a `@var T` type annotation from a PHPDoc block. Used for inferring
48
- * property types in pre-PHP-7.4 codebases that keep typing in docblocks
49
- * rather than as inline type hints. Returns the raw type string (no further
50
- * normalization) or undefined if no `@var` is present.
51
- *
52
- * Examples:
53
- * /** @var string *\/ → "string"
54
- * /** @var User|null *\/ → "User|null"
55
- * /** @var int[] *\/ → "int[]"
56
- */
57
- export function parsePhpDocVar(docstring) {
58
- if (!docstring)
59
- return undefined;
60
- const m = /@var\s+(\S+)/.exec(docstring);
61
- return m?.[1];
62
- }
63
- // --- Helpers ---
64
- /**
65
- * PHP docblocks are `comment` nodes starting with `/**` that precede a declaration.
66
- * Walk backwards through siblings collecting contiguous doc comments.
67
- */
68
- function getDocstring(node, source) {
69
- let prev = node.previousNamedSibling;
70
- // Skip visibility_modifier and other attributes to reach the comment
71
- while (prev && (prev.type === "visibility_modifier" || prev.type === "attribute_list")) {
72
- prev = prev.previousNamedSibling;
73
- }
74
- if (!prev || prev.type !== "comment")
75
- return undefined;
76
- const text = source.slice(prev.startIndex, prev.endIndex);
77
- if (!text.startsWith("/**"))
78
- return undefined;
79
- return text;
80
- }
81
- /**
82
- * Extract parameter list and optional return type.
83
- * e.g. "(string $name, int $age = 0): bool"
84
- */
85
- function getSignature(node, source) {
86
- const params = node.childForFieldName("parameters");
87
- if (!params)
88
- return undefined;
89
- let sig = source.slice(params.startIndex, params.endIndex);
90
- const returnType = node.childForFieldName("return_type");
91
- if (returnType) {
92
- sig += ": " + source.slice(returnType.startIndex, returnType.endIndex);
93
- }
94
- return sig;
95
- }
96
- /**
97
- * Test base classes that mark a class as a test suite. Includes PHPUnit
98
- * (TestCase) and Codeception (Unit, Cest, Cept) — the latter pair are the
99
- * canonical Codeception base classes used in panels like tgm-panel.
100
- */
101
- const TEST_BASE_NAMES = new Set([
102
- "TestCase",
103
- "Unit",
104
- "Cest",
105
- "Cept",
106
- ]);
107
- /**
108
- * Extract the list of base class names from a `base_clause` node. Returns
109
- * fully-qualified names exactly as written in source (e.g. ["BaseUser",
110
- * "\\yii\\db\\ActiveRecord", "Codeception\\Test\\Unit"]). Aliases stay as
111
- * source-side names — namespace resolution is the resolver's job, not the
112
- * extractor's.
113
- */
114
- function parseBaseClause(baseClause) {
115
- if (!baseClause)
116
- return [];
117
- const names = [];
118
- for (const child of baseClause.namedChildren) {
119
- if (child.type === "name" || child.type === "qualified_name") {
120
- const text = child.text.trim();
121
- if (text)
122
- names.push(text);
123
- }
124
- }
125
- // Fallback: tree-sitter-php sometimes flattens children. Strip the keyword
126
- // prefix and split on commas if no structured children were found.
127
- if (names.length === 0) {
128
- const stripped = baseClause.text.replace(/^extends\s+/, "").trim();
129
- if (stripped) {
130
- for (const n of stripped.split(/\s*,\s*/)) {
131
- if (n)
132
- names.push(n);
133
- }
134
- }
135
- }
136
- return names;
137
- }
138
- /**
139
- * Extract the list of interface names from a `class_interface_clause` node.
140
- * Mirrors `parseBaseClause` but strips the `implements` keyword.
141
- */
142
- function parseInterfaceClause(clause) {
143
- if (!clause)
144
- return [];
145
- const names = [];
146
- for (const child of clause.namedChildren) {
147
- if (child.type === "name" || child.type === "qualified_name") {
148
- const text = child.text.trim();
149
- if (text)
150
- names.push(text);
151
- }
152
- }
153
- if (names.length === 0) {
154
- const stripped = clause.text.replace(/^implements\s+/, "").trim();
155
- if (stripped) {
156
- for (const n of stripped.split(/\s*,\s*/)) {
157
- if (n)
158
- names.push(n);
159
- }
160
- }
161
- }
162
- return names;
163
- }
164
- /**
165
- * Walk a class/trait body and collect the names of traits used via
166
- * `use TraitName;` declarations. Returns FQ names as written.
167
- */
168
- function collectTraitUses(body) {
169
- if (!body)
170
- return [];
171
- const traits = [];
172
- for (const child of body.namedChildren) {
173
- if (child.type !== "use_declaration")
174
- continue;
175
- for (const grand of child.namedChildren) {
176
- if (grand.type === "name" || grand.type === "qualified_name") {
177
- const t = grand.text.trim();
178
- if (t)
179
- traits.push(t);
180
- }
181
- }
182
- }
183
- return traits;
184
- }
185
- /**
186
- * Look at a class/method/property declaration's children for modifier nodes.
187
- * tree-sitter-php emits these as siblings of the name, with types like
188
- * `abstract_modifier`, `final_modifier`, `readonly_modifier`, `static_modifier`,
189
- * and `visibility_modifier`. Returns a set of plain string flags.
190
- */
191
- function collectModifiers(node) {
192
- const out = {};
193
- for (const child of node.namedChildren) {
194
- const t = child.type;
195
- if (t === "visibility_modifier") {
196
- const txt = child.text.trim();
197
- if (txt === "public" || txt === "private" || txt === "protected") {
198
- out.visibility = txt;
199
- }
200
- }
201
- else if (t === "static_modifier" || (t === "modifier" && child.text === "static")) {
202
- out.is_static = true;
203
- }
204
- else if (t === "abstract_modifier" || (t === "modifier" && child.text === "abstract")) {
205
- out.is_abstract = true;
206
- }
207
- else if (t === "final_modifier" || (t === "modifier" && child.text === "final")) {
208
- out.is_final = true;
209
- }
210
- else if (t === "readonly_modifier" || (t === "modifier" && child.text === "readonly")) {
211
- out.is_readonly = true;
212
- }
213
- }
214
- return out;
215
- }
216
- /**
217
- * Extract PHP 8.0+ attribute list from a declaration. Attributes appear as
218
- * an `attribute_list` named child preceding the declaration; each contains
219
- * one or more `attribute_group` → `attribute` nodes.
220
- *
221
- * Returns shape suitable for storing in `meta.attributes`:
222
- * #[Route('/api', methods: ['GET'])] → { name: "Route", args: "'/api', methods: ['GET']" }
223
- */
224
- function parseAttributes(node) {
225
- const attrs = [];
226
- // Attributes precede the decl as a sibling; we walk the immediate previous
227
- // siblings until we hit something that is not an attribute_list.
228
- let prev = node.previousNamedSibling;
229
- while (prev && prev.type === "attribute_list") {
230
- walkAttributeList(prev, attrs);
231
- prev = prev.previousNamedSibling;
232
- }
233
- // tree-sitter-php sometimes nests attribute_list as a named child of the
234
- // declaration itself. Collect those too.
235
- for (const child of node.namedChildren) {
236
- if (child.type === "attribute_list") {
237
- walkAttributeList(child, attrs);
238
- }
239
- }
240
- return attrs;
241
- }
242
- function walkAttributeList(list, out) {
243
- for (const group of list.namedChildren) {
244
- if (group.type !== "attribute_group" && group.type !== "attribute")
245
- continue;
246
- const attrNodes = group.type === "attribute_group"
247
- ? group.namedChildren.filter((c) => c.type === "attribute")
248
- : [group];
249
- for (const attr of attrNodes) {
250
- // attribute → name + optional arguments
251
- const nameNode = attr.namedChildren.find((c) => c.type === "name" || c.type === "qualified_name");
252
- if (!nameNode)
253
- continue;
254
- const argsNode = attr.namedChildren.find((c) => c.type === "arguments");
255
- const entry = { name: nameNode.text };
256
- if (argsNode) {
257
- // Strip outer parens, trim — keep raw arg list as a string for cheap
258
- // pattern matching downstream (no need to AST-walk every literal).
259
- entry.args = argsNode.text.replace(/^\(/, "").replace(/\)$/, "").trim();
260
- }
261
- out.push(entry);
262
- }
263
- }
264
- }
265
- /**
266
- * Check if a class extends a known test-runner base class. Covers both
267
- * PHPUnit (`TestCase`) and Codeception (`Unit`, `Cest`, `Cept`). Match is
268
- * substring-based on the last name segment so namespace prefixes don't
269
- * matter (e.g. `Codeception\\Test\\Unit` ends with `Unit`).
270
- */
271
- function isTestCaseClass(node) {
272
- const bases = collectClassExtends(node);
273
- for (const b of bases) {
274
- const last = b.split(/[\\\\]+/).pop() ?? "";
275
- if (TEST_BASE_NAMES.has(last))
276
- return true;
277
- }
278
- return false;
279
- }
280
- /**
281
- * Helper: read the `extends` list from a class_declaration node, regardless
282
- * of whether the parser exposes it via `childForFieldName("base_clause")`
283
- * or as a named child of type `base_clause`.
284
- */
285
- function collectClassExtends(node) {
286
- let baseClause = node.childForFieldName("base_clause");
287
- if (!baseClause) {
288
- baseClause = node.namedChildren.find((c) => c.type === "base_clause") ?? null;
289
- }
290
- return parseBaseClause(baseClause);
291
- }
292
- /**
293
- * Helper: read the `implements` list from a class_declaration node.
294
- */
295
- function collectClassImplements(node) {
296
- let clause = node.childForFieldName("class_interface_clause");
297
- if (!clause) {
298
- clause =
299
- node.namedChildren.find((c) => c.type === "class_interface_clause") ??
300
- null;
301
- }
302
- return parseInterfaceClause(clause);
303
- }
304
- /**
305
- * Classify a method declaration based on PHPUnit patterns.
306
- */
307
- function classifyMethod(name, parentIsTest, docstring) {
308
- // Test hooks
309
- const hooks = ["setUp", "tearDown", "setUpBeforeClass", "tearDownAfterClass"];
310
- if (hooks.includes(name))
311
- return "test_hook";
312
- // Test case: method starts with "test" or has @test annotation
313
- if (parentIsTest) {
314
- if (name.startsWith("test"))
315
- return "test_case";
316
- if (docstring?.includes("@test"))
317
- return "test_case";
318
- }
319
- return "method";
320
- }
321
- /**
322
- * Extract name from a property_element node.
323
- * Property elements contain variable_name → name nodes.
324
- * Returns the name without the $ prefix.
325
- */
326
- function getPropertyName(node) {
327
- for (const child of node.namedChildren) {
328
- if (child.type === "property_element") {
329
- // variable_name → name
330
- const varName = child.namedChildren.find(c => c.type === "variable_name");
331
- if (varName) {
332
- const nameNode = varName.namedChildren.find(c => c.type === "name");
333
- return nameNode ? "$" + nameNode.text : null;
334
- }
335
- }
336
- }
337
- return null;
338
- }
339
- /**
340
- * Pull a type annotation off a property_declaration / parameter / promoted
341
- * parameter node. Walks named children looking for the first type-bearing
342
- * node. Returns the raw source text exactly as written.
343
- *
344
- * Type-bearing node types in tree-sitter-php:
345
- * primitive_type (string, int, bool, float, array, mixed, void, ...)
346
- * named_type (User, \\App\\Model)
347
- * optional_type (?T) — wraps the inner type
348
- * union_type (PHP 8.0+: A|B)
349
- * intersection_type (PHP 8.1+: A&B)
350
- * disjunctive_normal_form_type (PHP 8.2+: (A&B)|C)
351
- */
352
- function getInlineType(node) {
353
- const TYPE_NODES = new Set([
354
- "primitive_type",
355
- "named_type",
356
- "optional_type",
357
- "union_type",
358
- "intersection_type",
359
- "disjunctive_normal_form_type",
360
- ]);
361
- for (const child of node.namedChildren) {
362
- if (TYPE_NODES.has(child.type)) {
363
- return child.text.trim();
364
- }
365
- }
366
- return undefined;
367
- }
368
- /**
369
- * Build a Property metadata object from a property_declaration node.
370
- * Combines inline type (PHP 7.4+ typed property) with `@var T` from a
371
- * leading PHPDoc block. Inline type takes precedence; `@var` is used when
372
- * inline type is absent (legacy 7.2/7.3 code).
373
- */
374
- function buildPropertyMeta(node, docstring) {
375
- const meta = {};
376
- const modifiers = collectModifiers(node);
377
- if (modifiers.visibility)
378
- meta.visibility = modifiers.visibility;
379
- if (modifiers.is_static)
380
- meta.is_static = true;
381
- if (modifiers.is_readonly)
382
- meta.is_readonly = true;
383
- const inlineType = getInlineType(node);
384
- const docVar = parsePhpDocVar(docstring);
385
- if (inlineType) {
386
- meta.type = inlineType;
387
- meta.type_source = "inline";
388
- }
389
- else if (docVar) {
390
- meta.type = docVar;
391
- meta.type_source = "phpdoc";
392
- }
393
- const attrs = parseAttributes(node);
394
- if (attrs.length > 0)
395
- meta.attributes = attrs;
396
- return meta;
397
- }
398
- // --- Main extractor ---
399
- export function extractPhpSymbols(tree, filePath, source, repo) {
400
- const symbols = [];
401
- // Synthesize @property / @method tags from a declaration's docblock into
402
- // real CodeSymbols with meta.synthetic=true. Used by class/interface/trait
403
- // cases — any PHP declaration that can carry a PHPDoc block.
404
- // Dedup rule: if a real (non-synthetic) member with the same name+kind
405
- // already exists under the same parent, skip synthesis. Body walk must run
406
- // BEFORE this function so the real members are in the symbols array.
407
- function synthesizeDocstringTags(node, parent, docstring) {
408
- if (!docstring)
409
- return;
410
- const tags = parsePhpDocTags(docstring);
411
- for (const tag of tags) {
412
- const targetKind = tag.tag === "property" ? "field" : "method";
413
- const realExists = symbols.some((s) => s.parent === parent.id &&
414
- s.name === tag.name &&
415
- s.kind === targetKind &&
416
- !s.meta?.synthetic);
417
- if (realExists)
418
- continue;
419
- const synOpts = {
420
- parentId: parent.id,
421
- meta: { synthetic: true },
422
- };
423
- if (tag.type)
424
- synOpts.signature = tag.type;
425
- const synthetic = makeSymbol(node, tag.name, targetKind, filePath, source, repo, synOpts);
426
- symbols.push(synthetic);
427
- }
428
- }
429
- /**
430
- * Emit synthetic `field` symbols for PHP 8.0+ promoted constructor params.
431
- *
432
- * Promoted ctor params (`public readonly string $name` inside a __construct
433
- * signature) are real properties at runtime, but the property has no
434
- * separate `property_declaration` in the class body — only the parameter
435
- * inside `formal_parameters`. Without this, downstream tools see a class
436
- * with N parameters in its ctor and think the class has 0 properties.
437
- *
438
- * Each emitted symbol carries `meta.from_constructor: true` so callers
439
- * (e.g. analyzeActiveRecord, find_php_god_model) can distinguish promoted
440
- * fields from declared ones if they need to.
441
- */
442
- function emitPromotedCtorFields(methodNode, classId) {
443
- const params = methodNode.childForFieldName("parameters")
444
- ?? methodNode.namedChildren.find((c) => c.type === "formal_parameters");
445
- if (!params)
446
- return;
447
- for (const child of params.namedChildren) {
448
- if (child.type !== "property_promotion_parameter")
449
- continue;
450
- const varName = child.namedChildren.find((c) => c.type === "variable_name");
451
- if (!varName)
452
- continue;
453
- const nameNode = varName.namedChildren.find((c) => c.type === "name");
454
- if (!nameNode)
455
- continue;
456
- const propName = "$" + nameNode.text;
457
- const modifiers = collectModifiers(child);
458
- const inlineType = getInlineType(child);
459
- const attrs = parseAttributes(child);
460
- const meta = { from_constructor: true };
461
- if (modifiers.visibility)
462
- meta.visibility = modifiers.visibility;
463
- if (modifiers.is_readonly)
464
- meta.is_readonly = true;
465
- if (inlineType) {
466
- meta.type = inlineType;
467
- meta.type_source = "inline";
468
- }
469
- if (attrs.length > 0)
470
- meta.attributes = attrs;
471
- symbols.push(makeSymbol(child, propName, "field", filePath, source, repo, {
472
- parentId: classId,
473
- meta,
474
- }));
475
- }
476
- }
477
- function walk(node, parentId, parentIsTest = false) {
478
- switch (node.type) {
479
- case "namespace_definition": {
480
- const nameNode = node.childForFieldName("name");
481
- const name = nameNode?.text ?? "<anonymous>";
482
- const sym = makeSymbol(node, name, "namespace", filePath, source, repo, {
483
- parentId,
484
- });
485
- symbols.push(sym);
486
- // Walk body with namespace as parent
487
- const body = node.childForFieldName("body");
488
- if (body) {
489
- for (const child of body.namedChildren) {
490
- walk(child, sym.id, false);
491
- }
492
- }
493
- else {
494
- // Namespace without braces — remaining siblings are children
495
- // (tree-sitter handles this by putting declarations as siblings)
496
- // We continue walking at the parent level, but with namespace as parent
497
- // This is handled naturally since siblings follow after this node
498
- }
499
- return;
500
- }
501
- case "class_declaration": {
502
- const name = getNodeName(node) ?? "<anonymous>";
503
- const isTest = isTestCaseClass(node);
504
- const kind = isTest ? "test_suite" : "class";
505
- const docstring = getDocstring(node, source);
506
- const extendsList = collectClassExtends(node);
507
- const implementsList = collectClassImplements(node);
508
- const body = node.childForFieldName("body");
509
- const traitUses = collectTraitUses(body);
510
- const modifiers = collectModifiers(node);
511
- const attributes = parseAttributes(node);
512
- const meta = {};
513
- if (modifiers.is_abstract)
514
- meta.is_abstract = true;
515
- if (modifiers.is_final)
516
- meta.is_final = true;
517
- if (modifiers.is_readonly)
518
- meta.is_readonly = true;
519
- if (traitUses.length > 0)
520
- meta.uses_traits = traitUses;
521
- if (attributes.length > 0)
522
- meta.attributes = attributes;
523
- const opts = {
524
- parentId,
525
- docstring,
526
- };
527
- if (extendsList.length > 0)
528
- opts.extends = extendsList;
529
- if (implementsList.length > 0)
530
- opts.implements = implementsList;
531
- if (Object.keys(meta).length > 0)
532
- opts.meta = meta;
533
- const sym = makeSymbol(node, name, kind, filePath, source, repo, opts);
534
- symbols.push(sym);
535
- // Walk class body FIRST so real methods/fields are in `symbols`
536
- // before dedup runs for synthetic @property/@method tags.
537
- if (body) {
538
- for (const child of body.namedChildren) {
539
- walk(child, sym.id, isTest);
540
- }
541
- }
542
- synthesizeDocstringTags(node, sym, docstring);
543
- return;
544
- }
545
- case "interface_declaration": {
546
- const name = getNodeName(node) ?? "<anonymous>";
547
- const docstring = getDocstring(node, source);
548
- const extendsList = collectClassExtends(node);
549
- const attributes = parseAttributes(node);
550
- const meta = {};
551
- if (attributes.length > 0)
552
- meta.attributes = attributes;
553
- const opts = {
554
- parentId,
555
- docstring,
556
- };
557
- if (extendsList.length > 0)
558
- opts.extends = extendsList;
559
- if (Object.keys(meta).length > 0)
560
- opts.meta = meta;
561
- const sym = makeSymbol(node, name, "interface", filePath, source, repo, opts);
562
- symbols.push(sym);
563
- const body = node.childForFieldName("body");
564
- if (body) {
565
- for (const child of body.namedChildren) {
566
- walk(child, sym.id, false);
567
- }
568
- }
569
- synthesizeDocstringTags(node, sym, docstring);
570
- return;
571
- }
572
- case "trait_declaration": {
573
- const name = getNodeName(node) ?? "<anonymous>";
574
- const docstring = getDocstring(node, source);
575
- const body = node.childForFieldName("body");
576
- const traitUses = collectTraitUses(body);
577
- const attributes = parseAttributes(node);
578
- const meta = {};
579
- if (traitUses.length > 0)
580
- meta.uses_traits = traitUses;
581
- if (attributes.length > 0)
582
- meta.attributes = attributes;
583
- const opts = {
584
- parentId,
585
- docstring,
586
- };
587
- if (Object.keys(meta).length > 0)
588
- opts.meta = meta;
589
- const sym = makeSymbol(node, name, "type", filePath, source, repo, opts);
590
- symbols.push(sym);
591
- if (body) {
592
- for (const child of body.namedChildren) {
593
- walk(child, sym.id, false);
594
- }
595
- }
596
- synthesizeDocstringTags(node, sym, docstring);
597
- return;
598
- }
599
- case "enum_declaration": {
600
- const name = getNodeName(node) ?? "<anonymous>";
601
- // PHP 8.1 backed enum: `enum Status: string {…}`. The backing type
602
- // appears as a `primitive_type` direct child of enum_declaration,
603
- // sitting between the name and the body. Capture it so downstream
604
- // tools (e.g. M1 enum-from-class-consts migration assist) can tell
605
- // backed from pure enums.
606
- let backedType;
607
- for (const child of node.namedChildren) {
608
- if (child.type === "primitive_type") {
609
- backedType = child.text.trim();
610
- break;
611
- }
612
- }
613
- // PHP 8.1 enums can implement interfaces too.
614
- const implementsList = collectClassImplements(node);
615
- const attributes = parseAttributes(node);
616
- const meta = {};
617
- if (backedType)
618
- meta.backed_type = backedType;
619
- if (attributes.length > 0)
620
- meta.attributes = attributes;
621
- const opts = {
622
- parentId,
623
- docstring: getDocstring(node, source),
624
- };
625
- if (implementsList.length > 0)
626
- opts.implements = implementsList;
627
- if (Object.keys(meta).length > 0)
628
- opts.meta = meta;
629
- const sym = makeSymbol(node, name, "enum", filePath, source, repo, opts);
630
- symbols.push(sym);
631
- // tree-sitter-php uses `enum_declaration_list` for the body container,
632
- // not `body`. Try field name first for forward-compat, fall back to
633
- // the named child lookup.
634
- const body = node.childForFieldName("body") ??
635
- node.namedChildren.find((c) => c.type === "enum_declaration_list") ??
636
- null;
637
- if (body) {
638
- for (const child of body.namedChildren) {
639
- walk(child, sym.id, false);
640
- }
641
- }
642
- return;
643
- }
644
- case "function_definition": {
645
- const name = getNodeName(node);
646
- if (name) {
647
- const sym = makeSymbol(node, name, "function", filePath, source, repo, {
648
- parentId,
649
- docstring: getDocstring(node, source),
650
- signature: getSignature(node, source),
651
- });
652
- symbols.push(sym);
653
- }
654
- return;
655
- }
656
- case "method_declaration": {
657
- const name = getNodeName(node);
658
- if (name) {
659
- const docstring = getDocstring(node, source);
660
- const kind = classifyMethod(name, parentIsTest, docstring);
661
- const modifiers = collectModifiers(node);
662
- const attributes = parseAttributes(node);
663
- const meta = {};
664
- if (modifiers.visibility)
665
- meta.visibility = modifiers.visibility;
666
- if (modifiers.is_static)
667
- meta.is_static = true;
668
- if (modifiers.is_abstract)
669
- meta.is_abstract = true;
670
- if (modifiers.is_final)
671
- meta.is_final = true;
672
- if (attributes.length > 0)
673
- meta.attributes = attributes;
674
- const opts = {
675
- parentId,
676
- docstring,
677
- signature: getSignature(node, source),
678
- };
679
- if (Object.keys(meta).length > 0)
680
- opts.meta = meta;
681
- const sym = makeSymbol(node, name, kind, filePath, source, repo, opts);
682
- symbols.push(sym);
683
- // Promoted constructor params (PHP 8.0+): the body has no field
684
- // declarations for these, so synthesize them as `field` symbols
685
- // attached to the parent class. Only fires for __construct.
686
- if (name === "__construct" && parentId) {
687
- emitPromotedCtorFields(node, parentId);
688
- }
689
- }
690
- return;
691
- }
692
- case "property_declaration": {
693
- const propName = getPropertyName(node);
694
- if (propName) {
695
- const docstring = getDocstring(node, source);
696
- const meta = buildPropertyMeta(node, docstring);
697
- const opts = {
698
- parentId,
699
- docstring,
700
- };
701
- if (Object.keys(meta).length > 0)
702
- opts.meta = meta;
703
- const sym = makeSymbol(node, propName, "field", filePath, source, repo, opts);
704
- symbols.push(sym);
705
- }
706
- return;
707
- }
708
- case "const_declaration": {
709
- // Class constants or global constants: const FOO = 'bar';
710
- // May have multiple const_element children
711
- for (const child of node.namedChildren) {
712
- if (child.type === "const_element") {
713
- // const_element doesn't use named fields — name is first child of type "name"
714
- const nameNode = child.namedChildren.find(c => c.type === "name");
715
- const name = nameNode?.text;
716
- if (name) {
717
- const sym = makeSymbol(child, name, "constant", filePath, source, repo, {
718
- parentId,
719
- docstring: getDocstring(node, source),
720
- });
721
- symbols.push(sym);
722
- }
723
- }
724
- }
725
- return;
726
- }
727
- case "enum_case": {
728
- const name = getNodeName(node);
729
- if (name) {
730
- const sym = makeSymbol(node, name, "constant", filePath, source, repo, {
731
- parentId,
732
- });
733
- symbols.push(sym);
734
- }
735
- return;
736
- }
737
- default:
738
- break;
739
- }
740
- // Default: walk children
741
- for (const child of node.namedChildren) {
742
- walk(child, parentId, parentIsTest);
743
- }
744
- }
745
- walk(tree.rootNode);
746
- return symbols;
747
- }
1
+ export { parsePhpDocTags, parsePhpDocVar } from "./php-doc.js";
2
+ export { extractPhpSymbols } from "./php-walker.js";
748
3
  //# sourceMappingURL=php.js.map