codesift-mcp 0.13.1 → 0.15.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 (546) 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 -854
  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/cli/hooks/pre-tool-use.d.ts +1 -0
  29. package/dist/cli/hooks/pre-tool-use.d.ts.map +1 -1
  30. package/dist/cli/hooks/pre-tool-use.js +11 -2
  31. package/dist/cli/hooks/pre-tool-use.js.map +1 -1
  32. package/dist/config.d.ts +13 -0
  33. package/dist/config.d.ts.map +1 -1
  34. package/dist/config.js +21 -0
  35. package/dist/config.js.map +1 -1
  36. package/dist/formatters-core.d.ts +7 -0
  37. package/dist/formatters-core.d.ts.map +1 -1
  38. package/dist/formatters-core.js +14 -3
  39. package/dist/formatters-core.js.map +1 -1
  40. package/dist/instructions.d.ts +1 -1
  41. package/dist/instructions.d.ts.map +1 -1
  42. package/dist/instructions.js +5 -2
  43. package/dist/instructions.js.map +1 -1
  44. package/dist/parser/extractors/hono-inline-analyzer.js +2 -2
  45. package/dist/parser/extractors/hono-inline-analyzer.js.map +1 -1
  46. package/dist/parser/extractors/php-class-metadata.d.ts +10 -0
  47. package/dist/parser/extractors/php-class-metadata.d.ts.map +1 -0
  48. package/dist/parser/extractors/php-class-metadata.js +65 -0
  49. package/dist/parser/extractors/php-class-metadata.js.map +1 -0
  50. package/dist/parser/extractors/php-doc.d.ts +13 -0
  51. package/dist/parser/extractors/php-doc.d.ts.map +1 -0
  52. package/dist/parser/extractors/php-doc.js +39 -0
  53. package/dist/parser/extractors/php-doc.js.map +1 -0
  54. package/dist/parser/extractors/php-node-metadata.d.ts +26 -0
  55. package/dist/parser/extractors/php-node-metadata.d.ts.map +1 -0
  56. package/dist/parser/extractors/php-node-metadata.js +132 -0
  57. package/dist/parser/extractors/php-node-metadata.js.map +1 -0
  58. package/dist/parser/extractors/php-symbol-builders.d.ts +13 -0
  59. package/dist/parser/extractors/php-symbol-builders.d.ts.map +1 -0
  60. package/dist/parser/extractors/php-symbol-builders.js +58 -0
  61. package/dist/parser/extractors/php-symbol-builders.js.map +1 -0
  62. package/dist/parser/extractors/php-walker.d.ts +4 -0
  63. package/dist/parser/extractors/php-walker.d.ts.map +1 -0
  64. package/dist/parser/extractors/php-walker.js +238 -0
  65. package/dist/parser/extractors/php-walker.js.map +1 -0
  66. package/dist/parser/extractors/php.d.ts +2 -33
  67. package/dist/parser/extractors/php.d.ts.map +1 -1
  68. package/dist/parser/extractors/php.js +2 -747
  69. package/dist/parser/extractors/php.js.map +1 -1
  70. package/dist/register-tool-groups/core/search.d.ts.map +1 -1
  71. package/dist/register-tool-groups/core/search.js +14 -0
  72. package/dist/register-tool-groups/core/search.js.map +1 -1
  73. package/dist/register-tool-groups/core/symbols.d.ts.map +1 -1
  74. package/dist/register-tool-groups/core/symbols.js +50 -5
  75. package/dist/register-tool-groups/core/symbols.js.map +1 -1
  76. package/dist/register-tool-loaders.d.ts +11 -11
  77. package/dist/register-tool-loaders.d.ts.map +1 -1
  78. package/dist/register-tools/runtime.d.ts +11 -0
  79. package/dist/register-tools/runtime.d.ts.map +1 -1
  80. package/dist/register-tools/runtime.js +40 -0
  81. package/dist/register-tools/runtime.js.map +1 -1
  82. package/dist/register-tools.d.ts.map +1 -1
  83. package/dist/register-tools.js +5 -1
  84. package/dist/register-tools.js.map +1 -1
  85. package/dist/retrieval/semantic-handlers.d.ts.map +1 -1
  86. package/dist/retrieval/semantic-handlers.js +10 -3
  87. package/dist/retrieval/semantic-handlers.js.map +1 -1
  88. package/dist/search/semantic.d.ts +2 -0
  89. package/dist/search/semantic.d.ts.map +1 -1
  90. package/dist/search/semantic.js +41 -9
  91. package/dist/search/semantic.js.map +1 -1
  92. package/dist/server.d.ts.map +1 -1
  93. package/dist/server.js +54 -2
  94. package/dist/server.js.map +1 -1
  95. package/dist/storage/_shared.d.ts +21 -0
  96. package/dist/storage/_shared.d.ts.map +1 -1
  97. package/dist/storage/_shared.js +36 -0
  98. package/dist/storage/_shared.js.map +1 -1
  99. package/dist/storage/chunk-store.d.ts +14 -2
  100. package/dist/storage/chunk-store.d.ts.map +1 -1
  101. package/dist/storage/chunk-store.js +214 -34
  102. package/dist/storage/chunk-store.js.map +1 -1
  103. package/dist/storage/embedding-store.d.ts +0 -12
  104. package/dist/storage/embedding-store.d.ts.map +1 -1
  105. package/dist/storage/embedding-store.js +69 -9
  106. package/dist/storage/embedding-store.js.map +1 -1
  107. package/dist/storage/index-cache.d.ts +12 -0
  108. package/dist/storage/index-cache.d.ts.map +1 -0
  109. package/dist/storage/index-cache.js +89 -0
  110. package/dist/storage/index-cache.js.map +1 -0
  111. package/dist/storage/index-footprint.d.ts +12 -0
  112. package/dist/storage/index-footprint.d.ts.map +1 -0
  113. package/dist/storage/index-footprint.js +41 -0
  114. package/dist/storage/index-footprint.js.map +1 -0
  115. package/dist/storage/index-json-mutations.d.ts +11 -0
  116. package/dist/storage/index-json-mutations.d.ts.map +1 -0
  117. package/dist/storage/index-json-mutations.js +93 -0
  118. package/dist/storage/index-json-mutations.js.map +1 -0
  119. package/dist/storage/index-migration.d.ts +22 -0
  120. package/dist/storage/index-migration.d.ts.map +1 -0
  121. package/dist/storage/index-migration.js +80 -0
  122. package/dist/storage/index-migration.js.map +1 -0
  123. package/dist/storage/index-store.d.ts +26 -55
  124. package/dist/storage/index-store.d.ts.map +1 -1
  125. package/dist/storage/index-store.js +82 -350
  126. package/dist/storage/index-store.js.map +1 -1
  127. package/dist/storage/index-version.d.ts +39 -0
  128. package/dist/storage/index-version.d.ts.map +1 -0
  129. package/dist/storage/index-version.js +87 -0
  130. package/dist/storage/index-version.js.map +1 -0
  131. package/dist/storage/registry.d.ts +9 -1
  132. package/dist/storage/registry.d.ts.map +1 -1
  133. package/dist/storage/registry.js +233 -9
  134. package/dist/storage/registry.js.map +1 -1
  135. package/dist/storage/shared-embedding-cache.d.ts +23 -3
  136. package/dist/storage/shared-embedding-cache.d.ts.map +1 -1
  137. package/dist/storage/shared-embedding-cache.js +300 -45
  138. package/dist/storage/shared-embedding-cache.js.map +1 -1
  139. package/dist/storage/sqlite/accessors.d.ts +34 -0
  140. package/dist/storage/sqlite/accessors.d.ts.map +1 -0
  141. package/dist/storage/sqlite/accessors.js +178 -0
  142. package/dist/storage/sqlite/accessors.js.map +1 -0
  143. package/dist/storage/sqlite/connection.d.ts +43 -0
  144. package/dist/storage/sqlite/connection.d.ts.map +1 -0
  145. package/dist/storage/sqlite/connection.js +241 -0
  146. package/dist/storage/sqlite/connection.js.map +1 -0
  147. package/dist/storage/sqlite/errors.d.ts +38 -0
  148. package/dist/storage/sqlite/errors.d.ts.map +1 -0
  149. package/dist/storage/sqlite/errors.js +150 -0
  150. package/dist/storage/sqlite/errors.js.map +1 -0
  151. package/dist/storage/sqlite/index-io.d.ts +49 -0
  152. package/dist/storage/sqlite/index-io.d.ts.map +1 -0
  153. package/dist/storage/sqlite/index-io.js +268 -0
  154. package/dist/storage/sqlite/index-io.js.map +1 -0
  155. package/dist/storage/sqlite/meta.d.ts +41 -0
  156. package/dist/storage/sqlite/meta.d.ts.map +1 -0
  157. package/dist/storage/sqlite/meta.js +28 -0
  158. package/dist/storage/sqlite/meta.js.map +1 -0
  159. package/dist/storage/sqlite/rows.d.ts +64 -0
  160. package/dist/storage/sqlite/rows.d.ts.map +1 -0
  161. package/dist/storage/sqlite/rows.js +186 -0
  162. package/dist/storage/sqlite/rows.js.map +1 -0
  163. package/dist/storage/sqlite/runtime.d.ts +6 -0
  164. package/dist/storage/sqlite/runtime.d.ts.map +1 -0
  165. package/dist/storage/sqlite/runtime.js +31 -0
  166. package/dist/storage/sqlite/runtime.js.map +1 -0
  167. package/dist/storage/sqlite/schema.d.ts +34 -0
  168. package/dist/storage/sqlite/schema.d.ts.map +1 -0
  169. package/dist/storage/sqlite/schema.js +98 -0
  170. package/dist/storage/sqlite/schema.js.map +1 -0
  171. package/dist/storage/sqlite-index-store.d.ts +40 -80
  172. package/dist/storage/sqlite-index-store.d.ts.map +1 -1
  173. package/dist/storage/sqlite-index-store.js +32 -577
  174. package/dist/storage/sqlite-index-store.js.map +1 -1
  175. package/dist/storage/telemetry/config.d.ts.map +1 -1
  176. package/dist/storage/telemetry/config.js +15 -3
  177. package/dist/storage/telemetry/config.js.map +1 -1
  178. package/dist/storage/telemetry/payload.d.ts.map +1 -1
  179. package/dist/storage/telemetry/payload.js +4 -1
  180. package/dist/storage/telemetry/payload.js.map +1 -1
  181. package/dist/storage/telemetry/retro-aggregator.d.ts +48 -0
  182. package/dist/storage/telemetry/retro-aggregator.d.ts.map +1 -0
  183. package/dist/storage/telemetry/retro-aggregator.js +221 -0
  184. package/dist/storage/telemetry/retro-aggregator.js.map +1 -0
  185. package/dist/storage/telemetry/sanitizer.d.ts +46 -0
  186. package/dist/storage/telemetry/sanitizer.d.ts.map +1 -1
  187. package/dist/storage/telemetry/sanitizer.js +25 -0
  188. package/dist/storage/telemetry/sanitizer.js.map +1 -1
  189. package/dist/storage/telemetry/uploader.d.ts +3 -1
  190. package/dist/storage/telemetry/uploader.d.ts.map +1 -1
  191. package/dist/storage/telemetry/uploader.js +161 -18
  192. package/dist/storage/telemetry/uploader.js.map +1 -1
  193. package/dist/storage/workspace-resolver.js +1 -1
  194. package/dist/storage/workspace-resolver.js.map +1 -1
  195. package/dist/tools/cross-repo-contract-adapters.d.ts +39 -0
  196. package/dist/tools/cross-repo-contract-adapters.d.ts.map +1 -0
  197. package/dist/tools/cross-repo-contract-adapters.js +70 -0
  198. package/dist/tools/cross-repo-contract-adapters.js.map +1 -0
  199. package/dist/tools/cross-repo-contract-group.d.ts +17 -0
  200. package/dist/tools/cross-repo-contract-group.d.ts.map +1 -0
  201. package/dist/tools/cross-repo-contract-group.js +89 -0
  202. package/dist/tools/cross-repo-contract-group.js.map +1 -0
  203. package/dist/tools/cross-repo-contract-matcher.d.ts +24 -0
  204. package/dist/tools/cross-repo-contract-matcher.d.ts.map +1 -0
  205. package/dist/tools/cross-repo-contract-matcher.js +134 -0
  206. package/dist/tools/cross-repo-contract-matcher.js.map +1 -0
  207. package/dist/tools/cross-repo-contract-resolver.d.ts +9 -0
  208. package/dist/tools/cross-repo-contract-resolver.d.ts.map +1 -0
  209. package/dist/tools/cross-repo-contract-resolver.js +86 -0
  210. package/dist/tools/cross-repo-contract-resolver.js.map +1 -0
  211. package/dist/tools/cross-repo-contract-tools.d.ts +12 -135
  212. package/dist/tools/cross-repo-contract-tools.d.ts.map +1 -1
  213. package/dist/tools/cross-repo-contract-tools.js +8 -589
  214. package/dist/tools/cross-repo-contract-tools.js.map +1 -1
  215. package/dist/tools/cross-repo-contract-types.d.ts +30 -0
  216. package/dist/tools/cross-repo-contract-types.d.ts.map +1 -0
  217. package/dist/tools/cross-repo-contract-types.js +3 -0
  218. package/dist/tools/cross-repo-contract-types.js.map +1 -0
  219. package/dist/tools/cross-repo-outbound-calls.d.ts +28 -0
  220. package/dist/tools/cross-repo-outbound-calls.d.ts.map +1 -0
  221. package/dist/tools/cross-repo-outbound-calls.js +347 -0
  222. package/dist/tools/cross-repo-outbound-calls.js.map +1 -0
  223. package/dist/tools/cross-repo-outbound-lexer/call-detectors.d.ts.map +1 -1
  224. package/dist/tools/cross-repo-outbound-lexer/call-detectors.js +2 -0
  225. package/dist/tools/cross-repo-outbound-lexer/call-detectors.js.map +1 -1
  226. package/dist/tools/cross-repo-outbound-lexer/types.d.ts +2 -0
  227. package/dist/tools/cross-repo-outbound-lexer/types.d.ts.map +1 -1
  228. package/dist/tools/index-tools/file-indexer.js +3 -3
  229. package/dist/tools/index-tools/file-indexer.js.map +1 -1
  230. package/dist/tools/index-tools/folder-indexer.d.ts.map +1 -1
  231. package/dist/tools/index-tools/folder-indexer.js +51 -3
  232. package/dist/tools/index-tools/folder-indexer.js.map +1 -1
  233. package/dist/tools/index-tools/parse.d.ts +12 -3
  234. package/dist/tools/index-tools/parse.d.ts.map +1 -1
  235. package/dist/tools/index-tools/parse.js +33 -8
  236. package/dist/tools/index-tools/parse.js.map +1 -1
  237. package/dist/tools/index-tools/registry.d.ts +35 -0
  238. package/dist/tools/index-tools/registry.d.ts.map +1 -1
  239. package/dist/tools/index-tools/registry.js +167 -3
  240. package/dist/tools/index-tools/registry.js.map +1 -1
  241. package/dist/tools/index-tools/state.d.ts +31 -0
  242. package/dist/tools/index-tools/state.d.ts.map +1 -1
  243. package/dist/tools/index-tools/state.js +53 -0
  244. package/dist/tools/index-tools/state.js.map +1 -1
  245. package/dist/tools/index-tools/types.d.ts +9 -0
  246. package/dist/tools/index-tools/types.d.ts.map +1 -1
  247. package/dist/tools/index-tools/watcher.js +3 -3
  248. package/dist/tools/index-tools/watcher.js.map +1 -1
  249. package/dist/tools/index-tools/worktree-seed.d.ts +44 -0
  250. package/dist/tools/index-tools/worktree-seed.d.ts.map +1 -0
  251. package/dist/tools/index-tools/worktree-seed.js +302 -0
  252. package/dist/tools/index-tools/worktree-seed.js.map +1 -0
  253. package/dist/tools/index-tools.d.ts +2 -2
  254. package/dist/tools/index-tools.d.ts.map +1 -1
  255. package/dist/tools/index-tools.js +5 -3
  256. package/dist/tools/index-tools.js.map +1 -1
  257. package/dist/tools/nest-ext-tools/graphql.d.ts +17 -0
  258. package/dist/tools/nest-ext-tools/graphql.d.ts.map +1 -0
  259. package/dist/tools/nest-ext-tools/graphql.js +54 -0
  260. package/dist/tools/nest-ext-tools/graphql.js.map +1 -0
  261. package/dist/tools/nest-ext-tools/microservice.d.ts +17 -0
  262. package/dist/tools/nest-ext-tools/microservice.d.ts.map +1 -0
  263. package/dist/tools/nest-ext-tools/microservice.js +51 -0
  264. package/dist/tools/nest-ext-tools/microservice.js.map +1 -0
  265. package/dist/tools/nest-ext-tools/openapi.d.ts +81 -0
  266. package/dist/tools/nest-ext-tools/openapi.d.ts.map +1 -0
  267. package/dist/tools/nest-ext-tools/openapi.js +254 -0
  268. package/dist/tools/nest-ext-tools/openapi.js.map +1 -0
  269. package/dist/tools/nest-ext-tools/queue.d.ts +27 -0
  270. package/dist/tools/nest-ext-tools/queue.d.ts.map +1 -0
  271. package/dist/tools/nest-ext-tools/queue.js +95 -0
  272. package/dist/tools/nest-ext-tools/queue.js.map +1 -0
  273. package/dist/tools/nest-ext-tools/schedule.d.ts +19 -0
  274. package/dist/tools/nest-ext-tools/schedule.d.ts.map +1 -0
  275. package/dist/tools/nest-ext-tools/schedule.js +89 -0
  276. package/dist/tools/nest-ext-tools/schedule.js.map +1 -0
  277. package/dist/tools/nest-ext-tools/scope.d.ts +19 -0
  278. package/dist/tools/nest-ext-tools/scope.d.ts.map +1 -0
  279. package/dist/tools/nest-ext-tools/scope.js +151 -0
  280. package/dist/tools/nest-ext-tools/scope.js.map +1 -0
  281. package/dist/tools/nest-ext-tools/shared.d.ts +33 -0
  282. package/dist/tools/nest-ext-tools/shared.d.ts.map +1 -0
  283. package/dist/tools/nest-ext-tools/shared.js +279 -0
  284. package/dist/tools/nest-ext-tools/shared.js.map +1 -0
  285. package/dist/tools/nest-ext-tools/typeorm.d.ts +22 -0
  286. package/dist/tools/nest-ext-tools/typeorm.d.ts.map +1 -0
  287. package/dist/tools/nest-ext-tools/typeorm.js +59 -0
  288. package/dist/tools/nest-ext-tools/typeorm.js.map +1 -0
  289. package/dist/tools/nest-ext-tools/websocket.d.ts +21 -0
  290. package/dist/tools/nest-ext-tools/websocket.d.ts.map +1 -0
  291. package/dist/tools/nest-ext-tools/websocket.js +70 -0
  292. package/dist/tools/nest-ext-tools/websocket.js.map +1 -0
  293. package/dist/tools/nest-ext-tools.d.ts +10 -204
  294. package/dist/tools/nest-ext-tools.d.ts.map +1 -1
  295. package/dist/tools/nest-ext-tools.js +10 -749
  296. package/dist/tools/nest-ext-tools.js.map +1 -1
  297. package/dist/tools/perf-tools.js +2 -2
  298. package/dist/tools/plan-turn/stale-index.d.ts +32 -0
  299. package/dist/tools/plan-turn/stale-index.d.ts.map +1 -1
  300. package/dist/tools/plan-turn/stale-index.js +42 -5
  301. package/dist/tools/plan-turn/stale-index.js.map +1 -1
  302. package/dist/tools/python-audit/checks/dead-code.d.ts +1 -1
  303. package/dist/tools/python-audit/checks/dead-code.d.ts.map +1 -1
  304. package/dist/tools/python-constants/constant-match.d.ts +5 -0
  305. package/dist/tools/python-constants/constant-match.d.ts.map +1 -0
  306. package/dist/tools/python-constants/constant-match.js +24 -0
  307. package/dist/tools/python-constants/constant-match.js.map +1 -0
  308. package/dist/tools/python-constants/file-context.d.ts +5 -0
  309. package/dist/tools/python-constants/file-context.d.ts.map +1 -0
  310. package/dist/tools/python-constants/file-context.js +91 -0
  311. package/dist/tools/python-constants/file-context.js.map +1 -0
  312. package/dist/tools/python-constants/function-defaults.d.ts +5 -0
  313. package/dist/tools/python-constants/function-defaults.d.ts.map +1 -0
  314. package/dist/tools/python-constants/function-defaults.js +98 -0
  315. package/dist/tools/python-constants/function-defaults.js.map +1 -0
  316. package/dist/tools/python-constants/model.d.ts +78 -0
  317. package/dist/tools/python-constants/model.d.ts.map +1 -0
  318. package/dist/tools/python-constants/model.js +2 -0
  319. package/dist/tools/python-constants/model.js.map +1 -0
  320. package/dist/tools/python-constants/syntax.d.ts +22 -0
  321. package/dist/tools/python-constants/syntax.d.ts.map +1 -0
  322. package/dist/tools/python-constants/syntax.js +93 -0
  323. package/dist/tools/python-constants/syntax.js.map +1 -0
  324. package/dist/tools/python-constants/value-resolver.d.ts +6 -0
  325. package/dist/tools/python-constants/value-resolver.d.ts.map +1 -0
  326. package/dist/tools/python-constants/value-resolver.js +320 -0
  327. package/dist/tools/python-constants/value-resolver.js.map +1 -0
  328. package/dist/tools/python-constants-tools.d.ts +3 -45
  329. package/dist/tools/python-constants-tools.d.ts.map +1 -1
  330. package/dist/tools/python-constants-tools.js +2 -505
  331. package/dist/tools/python-constants-tools.js.map +1 -1
  332. package/dist/tools/route-tools/django.d.ts +8 -0
  333. package/dist/tools/route-tools/django.d.ts.map +1 -0
  334. package/dist/tools/route-tools/django.js +52 -0
  335. package/dist/tools/route-tools/django.js.map +1 -0
  336. package/dist/tools/route-tools/express.d.ts +5 -0
  337. package/dist/tools/route-tools/express.d.ts.map +1 -0
  338. package/dist/tools/route-tools/express.js +33 -0
  339. package/dist/tools/route-tools/express.js.map +1 -0
  340. package/dist/tools/route-tools/file-sources.d.ts +7 -0
  341. package/dist/tools/route-tools/file-sources.d.ts.map +1 -0
  342. package/dist/tools/route-tools/file-sources.js +15 -0
  343. package/dist/tools/route-tools/file-sources.js.map +1 -0
  344. package/dist/tools/route-tools/handler-discovery.d.ts +4 -0
  345. package/dist/tools/route-tools/handler-discovery.d.ts.map +1 -0
  346. package/dist/tools/route-tools/handler-discovery.js +38 -0
  347. package/dist/tools/route-tools/handler-discovery.js.map +1 -0
  348. package/dist/tools/route-tools/hono.d.ts +5 -0
  349. package/dist/tools/route-tools/hono.d.ts.map +1 -0
  350. package/dist/tools/route-tools/hono.js +61 -0
  351. package/dist/tools/route-tools/hono.js.map +1 -0
  352. package/dist/tools/route-tools/ktor.d.ts +5 -0
  353. package/dist/tools/route-tools/ktor.d.ts.map +1 -0
  354. package/dist/tools/route-tools/ktor.js +76 -0
  355. package/dist/tools/route-tools/ktor.js.map +1 -0
  356. package/dist/tools/route-tools/laravel.d.ts +5 -0
  357. package/dist/tools/route-tools/laravel.d.ts.map +1 -0
  358. package/dist/tools/route-tools/laravel.js +45 -0
  359. package/dist/tools/route-tools/laravel.js.map +1 -0
  360. package/dist/tools/route-tools/mermaid-call-chain.d.ts +3 -0
  361. package/dist/tools/route-tools/mermaid-call-chain.d.ts.map +1 -0
  362. package/dist/tools/route-tools/mermaid-call-chain.js +50 -0
  363. package/dist/tools/route-tools/mermaid-call-chain.js.map +1 -0
  364. package/dist/tools/route-tools/nest.d.ts +5 -0
  365. package/dist/tools/route-tools/nest.d.ts.map +1 -0
  366. package/dist/tools/route-tools/nest.js +75 -0
  367. package/dist/tools/route-tools/nest.js.map +1 -0
  368. package/dist/tools/route-tools/next-trace.d.ts +4 -0
  369. package/dist/tools/route-tools/next-trace.d.ts.map +1 -0
  370. package/dist/tools/route-tools/next-trace.js +48 -0
  371. package/dist/tools/route-tools/next-trace.js.map +1 -0
  372. package/dist/tools/route-tools/next.d.ts +7 -0
  373. package/dist/tools/route-tools/next.d.ts.map +1 -0
  374. package/dist/tools/route-tools/next.js +77 -0
  375. package/dist/tools/route-tools/next.js.map +1 -0
  376. package/dist/tools/route-tools/python-decorators.d.ts +7 -0
  377. package/dist/tools/route-tools/python-decorators.d.ts.map +1 -0
  378. package/dist/tools/route-tools/python-decorators.js +53 -0
  379. package/dist/tools/route-tools/python-decorators.js.map +1 -0
  380. package/dist/tools/route-tools/route-mermaid.d.ts +4 -0
  381. package/dist/tools/route-tools/route-mermaid.d.ts.map +1 -0
  382. package/dist/tools/route-tools/route-mermaid.js +53 -0
  383. package/dist/tools/route-tools/route-mermaid.js.map +1 -0
  384. package/dist/tools/route-tools/spring-kotlin.d.ts +5 -0
  385. package/dist/tools/route-tools/spring-kotlin.d.ts.map +1 -0
  386. package/dist/tools/route-tools/spring-kotlin.js +52 -0
  387. package/dist/tools/route-tools/spring-kotlin.js.map +1 -0
  388. package/dist/tools/route-tools/trace-analysis.d.ts +4 -0
  389. package/dist/tools/route-tools/trace-analysis.d.ts.map +1 -0
  390. package/dist/tools/route-tools/trace-analysis.js +37 -0
  391. package/dist/tools/route-tools/trace-analysis.js.map +1 -0
  392. package/dist/tools/route-tools/trace-route.d.ts +6 -0
  393. package/dist/tools/route-tools/trace-route.d.ts.map +1 -0
  394. package/dist/tools/route-tools/trace-route.js +53 -0
  395. package/dist/tools/route-tools/trace-route.js.map +1 -0
  396. package/dist/tools/route-tools/types.d.ts +35 -0
  397. package/dist/tools/route-tools/types.d.ts.map +1 -0
  398. package/dist/tools/route-tools/types.js +2 -0
  399. package/dist/tools/route-tools/types.js.map +1 -0
  400. package/dist/tools/route-tools/yii2.d.ts +5 -0
  401. package/dist/tools/route-tools/yii2.d.ts.map +1 -0
  402. package/dist/tools/route-tools/yii2.js +73 -0
  403. package/dist/tools/route-tools/yii2.js.map +1 -0
  404. package/dist/tools/route-tools.d.ts +7 -49
  405. package/dist/tools/route-tools.d.ts.map +1 -1
  406. package/dist/tools/route-tools.js +5 -978
  407. package/dist/tools/route-tools.js.map +1 -1
  408. package/dist/tools/search-tools/types.d.ts +20 -0
  409. package/dist/tools/search-tools/types.d.ts.map +1 -1
  410. package/dist/tools/search-tools/zero-hit.d.ts.map +1 -1
  411. package/dist/tools/search-tools/zero-hit.js +0 -0
  412. package/dist/tools/search-tools/zero-hit.js.map +1 -1
  413. package/dist/tools/status-tools.d.ts +10 -0
  414. package/dist/tools/status-tools.d.ts.map +1 -1
  415. package/dist/tools/status-tools.js +14 -4
  416. package/dist/tools/status-tools.js.map +1 -1
  417. package/dist/tools/symbol-analysis-tools.d.ts +81 -0
  418. package/dist/tools/symbol-analysis-tools.d.ts.map +1 -0
  419. package/dist/tools/symbol-analysis-tools.js +327 -0
  420. package/dist/tools/symbol-analysis-tools.js.map +1 -0
  421. package/dist/tools/symbol-context-tools.d.ts +68 -0
  422. package/dist/tools/symbol-context-tools.d.ts.map +1 -0
  423. package/dist/tools/symbol-context-tools.js +232 -0
  424. package/dist/tools/symbol-context-tools.js.map +1 -0
  425. package/dist/tools/symbol-lookup-tools.d.ts +77 -0
  426. package/dist/tools/symbol-lookup-tools.d.ts.map +1 -0
  427. package/dist/tools/symbol-lookup-tools.js +305 -0
  428. package/dist/tools/symbol-lookup-tools.js.map +1 -0
  429. package/dist/tools/symbol-reference-tools.d.ts +38 -0
  430. package/dist/tools/symbol-reference-tools.d.ts.map +1 -0
  431. package/dist/tools/symbol-reference-tools.js +253 -0
  432. package/dist/tools/symbol-reference-tools.js.map +1 -0
  433. package/dist/tools/symbol-tool-internals.d.ts +9 -0
  434. package/dist/tools/symbol-tool-internals.d.ts.map +1 -0
  435. package/dist/tools/symbol-tool-internals.js +47 -0
  436. package/dist/tools/symbol-tool-internals.js.map +1 -0
  437. package/dist/tools/symbol-tools.d.ts +11 -176
  438. package/dist/tools/symbol-tools.d.ts.map +1 -1
  439. package/dist/tools/symbol-tools.js +7 -975
  440. package/dist/tools/symbol-tools.js.map +1 -1
  441. package/dist/tools/taint/python-context.d.ts +10 -0
  442. package/dist/tools/taint/python-context.d.ts.map +1 -0
  443. package/dist/tools/taint/python-context.js +150 -0
  444. package/dist/tools/taint/python-context.js.map +1 -0
  445. package/dist/tools/taint/taint-analyzer.d.ts +2 -0
  446. package/dist/tools/taint/taint-analyzer.d.ts.map +1 -0
  447. package/dist/tools/taint/taint-analyzer.js +2 -0
  448. package/dist/tools/taint/taint-analyzer.js.map +1 -0
  449. package/dist/tools/taint/taint-expression.d.ts +18 -0
  450. package/dist/tools/taint/taint-expression.d.ts.map +1 -0
  451. package/dist/tools/taint/taint-expression.js +265 -0
  452. package/dist/tools/taint/taint-expression.js.map +1 -0
  453. package/dist/tools/taint/taint-flow.d.ts +10 -0
  454. package/dist/tools/taint/taint-flow.d.ts.map +1 -0
  455. package/dist/tools/taint/taint-flow.js +178 -0
  456. package/dist/tools/taint/taint-flow.js.map +1 -0
  457. package/dist/tools/taint/taint-model.d.ts +113 -0
  458. package/dist/tools/taint/taint-model.d.ts.map +1 -0
  459. package/dist/tools/taint/taint-model.js +277 -0
  460. package/dist/tools/taint/taint-model.js.map +1 -0
  461. package/dist/tools/taint-tools.d.ts +2 -34
  462. package/dist/tools/taint-tools.d.ts.map +1 -1
  463. package/dist/tools/taint-tools.js +2 -852
  464. package/dist/tools/taint-tools.js.map +1 -1
  465. package/dist/tools/typescript-constants/file-context.d.ts +7 -0
  466. package/dist/tools/typescript-constants/file-context.d.ts.map +1 -0
  467. package/dist/tools/typescript-constants/file-context.js +219 -0
  468. package/dist/tools/typescript-constants/file-context.js.map +1 -0
  469. package/dist/tools/typescript-constants/symbol-resolver.d.ts +7 -0
  470. package/dist/tools/typescript-constants/symbol-resolver.d.ts.map +1 -0
  471. package/dist/tools/typescript-constants/symbol-resolver.js +165 -0
  472. package/dist/tools/typescript-constants/symbol-resolver.js.map +1 -0
  473. package/dist/tools/typescript-constants/types.d.ts +44 -0
  474. package/dist/tools/typescript-constants/types.d.ts.map +1 -0
  475. package/dist/tools/typescript-constants/types.js +2 -0
  476. package/dist/tools/typescript-constants/types.js.map +1 -0
  477. package/dist/tools/typescript-constants/value-evaluator.d.ts +8 -0
  478. package/dist/tools/typescript-constants/value-evaluator.d.ts.map +1 -0
  479. package/dist/tools/typescript-constants/value-evaluator.js +404 -0
  480. package/dist/tools/typescript-constants/value-evaluator.js.map +1 -0
  481. package/dist/tools/typescript-constants-tools.d.ts.map +1 -1
  482. package/dist/tools/typescript-constants-tools.js +19 -709
  483. package/dist/tools/typescript-constants-tools.js.map +1 -1
  484. package/dist/types.d.ts +6 -0
  485. package/dist/types.d.ts.map +1 -1
  486. package/dist/utils/git-head.d.ts +12 -0
  487. package/dist/utils/git-head.d.ts.map +1 -1
  488. package/dist/utils/git-head.js +25 -0
  489. package/dist/utils/git-head.js.map +1 -1
  490. package/dist/utils/import-graph/collect.d.ts +5 -0
  491. package/dist/utils/import-graph/collect.d.ts.map +1 -0
  492. package/dist/utils/import-graph/collect.js +47 -0
  493. package/dist/utils/import-graph/collect.js.map +1 -0
  494. package/dist/utils/import-graph/edge-accumulator.d.ts +7 -0
  495. package/dist/utils/import-graph/edge-accumulator.d.ts.map +1 -0
  496. package/dist/utils/import-graph/edge-accumulator.js +47 -0
  497. package/dist/utils/import-graph/edge-accumulator.js.map +1 -0
  498. package/dist/utils/import-graph/language-imports.d.ts +6 -0
  499. package/dist/utils/import-graph/language-imports.d.ts.map +1 -0
  500. package/dist/utils/import-graph/language-imports.js +84 -0
  501. package/dist/utils/import-graph/language-imports.js.map +1 -0
  502. package/dist/utils/import-graph/metrics.d.ts +6 -0
  503. package/dist/utils/import-graph/metrics.d.ts.map +1 -0
  504. package/dist/utils/import-graph/metrics.js +51 -0
  505. package/dist/utils/import-graph/metrics.js.map +1 -0
  506. package/dist/utils/import-graph/path-map.d.ts +7 -0
  507. package/dist/utils/import-graph/path-map.d.ts.map +1 -0
  508. package/dist/utils/import-graph/path-map.js +56 -0
  509. package/dist/utils/import-graph/path-map.js.map +1 -0
  510. package/dist/utils/import-graph/python-php-edge-collectors.d.ts +5 -0
  511. package/dist/utils/import-graph/python-php-edge-collectors.d.ts.map +1 -0
  512. package/dist/utils/import-graph/python-php-edge-collectors.js +56 -0
  513. package/dist/utils/import-graph/python-php-edge-collectors.js.map +1 -0
  514. package/dist/utils/import-graph/source-edge-collector.d.ts +13 -0
  515. package/dist/utils/import-graph/source-edge-collector.d.ts.map +1 -0
  516. package/dist/utils/import-graph/source-edge-collector.js +42 -0
  517. package/dist/utils/import-graph/source-edge-collector.js.map +1 -0
  518. package/dist/utils/import-graph/source-imports.d.ts +5 -0
  519. package/dist/utils/import-graph/source-imports.d.ts.map +1 -0
  520. package/dist/utils/import-graph/source-imports.js +33 -0
  521. package/dist/utils/import-graph/source-imports.js.map +1 -0
  522. package/dist/utils/import-graph/types.d.ts +15 -0
  523. package/dist/utils/import-graph/types.d.ts.map +1 -0
  524. package/dist/utils/import-graph/types.js +2 -0
  525. package/dist/utils/import-graph/types.js.map +1 -0
  526. package/dist/utils/import-graph/typescript-edge-collector.d.ts +7 -0
  527. package/dist/utils/import-graph/typescript-edge-collector.d.ts.map +1 -0
  528. package/dist/utils/import-graph/typescript-edge-collector.js +58 -0
  529. package/dist/utils/import-graph/typescript-edge-collector.js.map +1 -0
  530. package/dist/utils/import-graph/workspace-alias.d.ts +7 -0
  531. package/dist/utils/import-graph/workspace-alias.d.ts.map +1 -0
  532. package/dist/utils/import-graph/workspace-alias.js +95 -0
  533. package/dist/utils/import-graph/workspace-alias.js.map +1 -0
  534. package/dist/utils/import-graph/workspace-entry.d.ts +3 -0
  535. package/dist/utils/import-graph/workspace-entry.d.ts.map +1 -0
  536. package/dist/utils/import-graph/workspace-entry.js +81 -0
  537. package/dist/utils/import-graph/workspace-entry.js.map +1 -0
  538. package/dist/utils/import-graph.d.ts +10 -94
  539. package/dist/utils/import-graph.d.ts.map +1 -1
  540. package/dist/utils/import-graph.js +6 -702
  541. package/dist/utils/import-graph.js.map +1 -1
  542. package/package.json +6 -4
  543. package/rules/codesift.md +11 -2
  544. package/rules/codesift.mdc +11 -2
  545. package/rules/codex.md +11 -2
  546. package/rules/gemini.md +11 -2
@@ -1,858 +1,12 @@
1
1
  // ---------------------------------------------------------------------------
2
- // CLI command handlers
3
- // ---------------------------------------------------------------------------
4
- import { join } from "node:path";
5
- import { readFileSync, writeFileSync, mkdirSync, unlinkSync } from "node:fs";
6
- import { execFileSync } from "node:child_process";
7
- import { getFlag, getBoolFlag, getNumFlag, requireArg, requireFlag, parseCommaSeparated, output, die } from "./args.js";
8
- // ---------------------------------------------------------------------------
9
- // codesift serve — shared local daemon (one process for all editor windows)
10
- // ---------------------------------------------------------------------------
11
- /** Default daemon port — clients point here via `setup --http`. */
12
- export const DEFAULT_DAEMON_PORT = 7077;
13
- /** Lockfile paths for the daemon in a given data dir (~/.codesift). */
14
- export function daemonLockPaths(dataDir) {
15
- return { pidPath: join(dataDir, "daemon.pid"), portPath: join(dataDir, "daemon.port") };
16
- }
17
- /**
18
- * True if a process with `pid` is alive. `process.kill(pid, 0)` sends no signal
19
- * but performs the permission/existence check: ESRCH = dead, EPERM = alive but
20
- * owned by another user (still alive).
21
- */
22
- export function isProcessAlive(pid) {
23
- if (!Number.isInteger(pid) || pid <= 0)
24
- return false;
25
- try {
26
- process.kill(pid, 0);
27
- return true;
28
- }
29
- catch (e) {
30
- return e.code === "EPERM";
31
- }
32
- }
33
- /** Read the current daemon lock, or null if absent/unparseable. */
34
- export function readDaemonLock(dataDir) {
35
- const { pidPath, portPath } = daemonLockPaths(dataDir);
36
- try {
37
- const pid = parseInt(readFileSync(pidPath, "utf-8").trim(), 10);
38
- const port = parseInt(readFileSync(portPath, "utf-8").trim(), 10);
39
- if (!Number.isInteger(pid) || !Number.isInteger(port))
40
- return null;
41
- return { pid, port };
42
- }
43
- catch {
44
- return null;
45
- }
46
- }
47
- /**
48
- * Acquire the daemon lock and start the shared HTTP server.
49
- *
50
- * Refuses if a LIVE daemon already holds the lock (single-instance). A STALE
51
- * lock (pid no longer alive — kill -9, OOM, crash) is reclaimed so the daemon
52
- * can always restart; without this, a crashed daemon would wedge the lock and
53
- * coworkers would fall back to per-window stdio = the original OOM incident.
54
- *
55
- * `close()` removes the lockfiles, so a graceful SIGTERM leaves a clean slate.
56
- */
57
- export async function startDaemon(opts = {}) {
58
- const { loadConfig } = await import("../config.js");
59
- const dataDir = opts.dataDir ?? loadConfig().dataDir;
60
- const { pidPath, portPath } = daemonLockPaths(dataDir);
61
- const existing = readDaemonLock(dataDir);
62
- if (existing && isProcessAlive(existing.pid)) {
63
- throw new Error(`codesift serve already running (pid ${existing.pid}, port ${existing.port}). Stop it first.`);
64
- }
65
- mkdirSync(dataDir, { recursive: true });
66
- writeFileSync(pidPath, String(process.pid));
67
- const { startHttpServer } = await import("../server.js");
68
- const httpOpts = {};
69
- if (opts.port !== undefined)
70
- httpOpts.port = opts.port;
71
- if (opts.host !== undefined)
72
- httpOpts.host = opts.host;
73
- if (opts.token !== undefined)
74
- httpOpts.token = opts.token;
75
- const handle = await startHttpServer(httpOpts);
76
- writeFileSync(portPath, String(handle.port));
77
- const release = () => {
78
- try {
79
- unlinkSync(pidPath);
80
- }
81
- catch { /* already gone */ }
82
- try {
83
- unlinkSync(portPath);
84
- }
85
- catch { /* already gone */ }
86
- };
87
- const origClose = handle.close;
88
- return {
89
- ...handle,
90
- close: async () => {
91
- release();
92
- await origClose();
93
- },
94
- };
95
- }
96
- /**
97
- * `codesift serve` — boot the shared daemon and stay alive until SIGTERM/SIGINT.
98
- */
99
- async function handleServe(_args, flags) {
100
- const port = getNumFlag(flags, "port") ?? DEFAULT_DAEMON_PORT;
101
- const host = getFlag(flags, "host");
102
- let handle;
103
- try {
104
- handle = await startDaemon({ port, ...(host ? { host } : {}) });
105
- }
106
- catch (e) {
107
- die(`serve: ${e.message}`);
108
- return;
109
- }
110
- output({ status: "serving", url: handle.url, port: handle.port, pid: process.pid }, flags);
111
- const shutdown = () => {
112
- void handle.close().then(() => process.exit(0));
113
- };
114
- process.on("SIGTERM", shutdown);
115
- process.on("SIGINT", shutdown);
116
- }
117
- // ---------------------------------------------------------------------------
118
- // Constants
119
- // ---------------------------------------------------------------------------
120
- const VALID_SYMBOL_KINDS = new Set([
121
- "function", "method", "class", "interface", "type", "variable", "constant",
122
- "field", "enum", "namespace", "module", "section", "metadata",
123
- "test_suite", "test_case", "test_hook", "default_export", "unknown",
124
- ]);
125
- const EXCLUDE_TESTS_QUERY_TYPES = new Set(["semantic", "hybrid"]);
126
- // ---------------------------------------------------------------------------
127
- // Index commands
128
- // ---------------------------------------------------------------------------
129
- /**
130
- * Run the embedding phase in a separate process and wait for it.
131
- *
132
- * The child's EXIT CODE is deliberately not trusted. Once onnxruntime has run,
133
- * the process aborts during native teardown (`mutex lock failed`, exit 134)
134
- * even though every file was written correctly first — so the child prints a
135
- * marker after its last successful write and that marker, not the status, is
136
- * what decides success. See src/cli/embed-child.ts.
137
- *
138
- * Failures here are reported but never fatal: BM25 and symbol search work
139
- * without embeddings, and the index itself is already committed to disk.
140
- */
141
- async function runEmbeddingChild(repoName, rootPath) {
142
- const { getIndexPath } = await import("../storage/index-store.js");
143
- const { loadConfig } = await import("../config.js");
144
- const { spawn } = await import("node:child_process");
145
- const { fileURLToPath } = await import("node:url");
146
- const { dirname, join } = await import("node:path");
147
- const config = loadConfig();
148
- if (!config.embeddingProvider)
149
- return; // lite mode — nothing to embed
150
- const indexPath = getIndexPath(config.dataDir, rootPath);
151
- const childScript = join(dirname(fileURLToPath(import.meta.url)), "embed-child.js");
152
- const { EMBED_CHILD_OK_MARKER } = await import("./embed-child-marker.js");
153
- await new Promise((resolve) => {
154
- const child = spawn(process.execPath, [childScript, indexPath, repoName, rootPath], {
155
- stdio: ["ignore", "pipe", "inherit"],
156
- env: { ...process.env, CODESIFT_EMBED_OUT_OF_PROCESS: "0" },
157
- });
158
- let sawMarker = false;
159
- child.stdout.on("data", (buf) => {
160
- if (buf.toString().includes(EMBED_CHILD_OK_MARKER))
161
- sawMarker = true;
162
- });
163
- child.on("error", (err) => {
164
- process.stderr.write(`[codesift] embedding skipped: ${err.message}\n`);
165
- resolve();
166
- });
167
- child.on("close", (code, signal) => {
168
- if (!sawMarker) {
169
- process.stderr.write(`[codesift] embedding did not complete (exit ${code ?? signal}) — ` +
170
- `search falls back to BM25 for this repo.\n`);
171
- }
172
- resolve();
173
- });
174
- });
175
- }
176
- async function handleIndex(args, flags) {
177
- const path = requireArg(args, 0, "path");
178
- const { indexFolder } = await import("../tools/index-tools.js");
179
- // Keep onnxruntime out of THIS process; the embedding runs in a child below.
180
- process.env["CODESIFT_EMBED_OUT_OF_PROCESS"] = "1";
181
- const result = await indexFolder(path, {
182
- incremental: getBoolFlag(flags, "incremental"),
183
- include_paths: parseCommaSeparated(flags, "include-paths"),
184
- watch: getBoolFlag(flags, "no-watch") === true ? false : undefined,
185
- });
186
- // Any in-process embedding scheduled before the opt-out (or by another code
187
- // path) still has to finish before we exit, or the command reports success
188
- // having written nothing.
189
- const { awaitPendingEmbeddings } = await import("../tools/index-tools/folder-indexer.js");
190
- await awaitPendingEmbeddings();
191
- const repo = result?.repo;
192
- const root = result?.root;
193
- if (repo && root)
194
- await runEmbeddingChild(repo, root);
195
- output(result, flags);
196
- }
197
- async function handleIndexRepo(args, flags) {
198
- const url = requireArg(args, 0, "url");
199
- const { indexRepo } = await import("../tools/index-tools.js");
200
- // Same three protections as handleIndex. Without them this entry point still
201
- // exits while the fire-and-forget embedding chain is in flight, so the repo
202
- // ends up with partial or zero embeddings and the command reports success —
203
- // the exact bug handleIndex was fixed for, left behind on this path.
204
- process.env["CODESIFT_EMBED_OUT_OF_PROCESS"] = "1";
205
- const result = await indexRepo(url, {
206
- branch: getFlag(flags, "branch"),
207
- include_paths: parseCommaSeparated(flags, "include-paths"),
208
- });
209
- const { awaitPendingEmbeddings } = await import("../tools/index-tools/folder-indexer.js");
210
- await awaitPendingEmbeddings();
211
- const repo = result?.repo;
212
- const root = result?.root;
213
- if (repo && root)
214
- await runEmbeddingChild(repo, root);
215
- output(result, flags);
216
- }
217
- async function handleRepos(_args, flags) {
218
- const { listAllRepos } = await import("../tools/index-tools.js");
219
- const result = await listAllRepos();
220
- output(result, flags);
221
- }
222
- async function handleInvalidate(args, flags) {
223
- const repo = requireArg(args, 0, "repo");
224
- const { invalidateCache } = await import("../tools/index-tools.js");
225
- const result = await invalidateCache(repo);
226
- output({ invalidated: result, repo }, flags);
227
- }
228
- /**
229
- * Delete orphaned per-repo cache artifacts (embeddings/index/meta/bm25/graph)
230
- * whose hash stem is no longer in the registry. These accumulate from
231
- * re-indexes (hash changes) and ephemeral/test repos that were indexed then
232
- * deleted — each leaves multi-GB embedding files behind. Use --dry-run to
233
- * preview. Regenerable: re-indexing recreates anything still needed.
234
- */
235
- async function handlePrune(_args, flags) {
236
- const { readFileSync, readdirSync, statSync, unlinkSync } = await import("node:fs");
237
- const { join } = await import("node:path");
238
- const { loadConfig } = await import("../config.js");
239
- const dataDir = loadConfig().dataDir;
240
- const dryRun = getBoolFlag(flags, "dry-run");
241
- // Live index hashes from the registry — everything else is orphaned cache.
242
- //
243
- // A registry entry counted as live even when its `root` no longer existed, so
244
- // artifacts for deleted directories were protected indefinitely. Measured
245
- // here: 101 of 119 indexed worktrees pointed at directories that were gone,
246
- // holding 5.4 GB of embeddings for code that cannot be read. Task branches are
247
- // created and deleted constantly, so this accumulates without bound.
248
- //
249
- // Entries whose root is missing are de-registered first; their artifacts then
250
- // fall out as orphans through the sweep below.
251
- const live = new Set();
252
- const stale = [];
253
- let reg;
254
- try {
255
- reg = JSON.parse(readFileSync(join(dataDir, "registry.json"), "utf-8"));
256
- }
257
- catch {
258
- die("prune: cannot read registry.json — aborting so live data is never deleted.");
259
- return;
260
- }
261
- for (const [name, v] of Object.entries(reg.repos ?? {})) {
262
- const ip = v.index_path;
263
- const root = v.root;
264
- // Only a root that is definitively absent counts. An unreadable path (a
265
- // permissions error, an unmounted volume mid-check) throws and is treated
266
- // as present — the conservative direction, since the cost of keeping a dead
267
- // entry is disk, and the cost of dropping a live one is a re-index.
268
- let rootGone = false;
269
- if (typeof root === "string" && root.length > 0) {
270
- try {
271
- statSync(root);
272
- }
273
- catch {
274
- rootGone = true;
275
- }
276
- }
277
- if (rootGone) {
278
- stale.push({ name, root: root });
279
- continue; // deliberately NOT added to `live`
280
- }
281
- if (typeof ip === "string")
282
- live.add(ip.split("/").pop().replace(".index.json", ""));
283
- }
284
- // Safety: an empty live set would mark every artifact orphaned. Refuse rather
285
- // than risk nuking a valid (but momentarily empty-looking) data dir.
286
- if (live.size === 0) {
287
- die("prune: registry lists 0 repos — aborting (refusing to treat all artifacts as orphans).");
288
- }
289
- const re = /^([0-9a-f]{8,})\.(embeddings\.ndjson(\.tmp.*)?|index\.json|embeddings\.meta.*|bm25\.json|graph\.json)$/;
290
- let files = 0, bytes = 0, kept = 0;
291
- for (const name of readdirSync(dataDir)) {
292
- const m = re.exec(name);
293
- if (!m)
294
- continue;
295
- if (live.has(m[1])) {
296
- kept++;
297
- continue;
298
- }
299
- const full = join(dataDir, name);
300
- try {
301
- bytes += statSync(full).size;
302
- if (!dryRun)
303
- unlinkSync(full);
304
- files++;
305
- }
306
- catch { /* skip unreadable/already-gone */ }
307
- }
308
- // De-register the dead entries. After the sweep, so a failure above leaves the
309
- // registry untouched rather than half-cleaned.
310
- if (!dryRun && stale.length > 0) {
311
- const { removeRepo } = await import("../storage/registry.js");
312
- for (const s of stale)
313
- await removeRepo(join(dataDir, "registry.json"), s.name);
314
- }
315
- output({
316
- stale_repos: stale.length,
317
- stale_examples: stale.slice(0, 5).map((s) => s.name),
318
- pruned: !dryRun,
319
- dry_run: dryRun,
320
- orphan_files: files,
321
- freed_gb: +(bytes / 1e9).toFixed(2),
322
- kept_live_artifacts: kept,
323
- data_dir: dataDir,
324
- }, flags);
325
- }
326
- function listProcesses() {
327
- const raw = execFileSync("ps", ["-axo", "pid=,ppid=,rss=,command="], { encoding: "utf-8" });
328
- const rows = [];
329
- for (const line of raw.split("\n")) {
330
- const match = line.match(/^\s*(\d+)\s+(\d+)\s+(\d+)\s+(.+)$/);
331
- if (!match)
332
- continue;
333
- rows.push({
334
- pid: Number(match[1]),
335
- ppid: Number(match[2]),
336
- rssKb: Number(match[3]),
337
- command: match[4] ?? "",
338
- });
339
- }
340
- return rows;
341
- }
342
- function classifyCleanupTarget(command, includeGlobalCodesift) {
343
- if (command === "" || command.includes("codesift cleanup-processes"))
344
- return null;
345
- if (command.startsWith("node /Users/") && command.includes("/DEV/codesift-mcp/dist/server.js")) {
346
- return "legacy-dev-dist-server";
347
- }
348
- if (command.includes("npm exec chrome-devtools-mcp") || command === "chrome-devtools-mcp") {
349
- return "chrome-devtools-mcp";
350
- }
351
- if (command.includes("chrome-devtools-mcp/") && command.includes("/watchdog/main.js")) {
352
- return "chrome-devtools-watchdog";
353
- }
354
- if (command.includes("npm exec @sentry/mcp-server")) {
355
- return "sentry-mcp";
356
- }
357
- if (command.includes("npm exec @playwright/mcp")) {
358
- return "playwright-mcp";
359
- }
360
- if (includeGlobalCodesift && command.includes("/.npm-global/bin/codesift-mcp")) {
361
- return "global-codesift-mcp";
362
- }
363
- return null;
364
- }
365
- async function handleCleanupProcesses(_args, flags) {
366
- const dryRun = getBoolFlag(flags, "dry-run") === true;
367
- const includeGlobalCodesift = getBoolFlag(flags, "global-codesift") === true;
368
- const rows = listProcesses();
369
- const targets = rows
370
- .map((row) => ({ ...row, reason: classifyCleanupTarget(row.command, includeGlobalCodesift) }))
371
- .filter((row) => row.reason !== null);
372
- const beforeMb = targets.reduce((sum, row) => sum + row.rssKb, 0) / 1024;
373
- const killed = [];
374
- const failed = [];
375
- if (!dryRun) {
376
- for (const row of targets) {
377
- try {
378
- process.kill(row.pid, "SIGKILL");
379
- killed.push(row);
380
- }
381
- catch (err) {
382
- failed.push({ ...row, error: err instanceof Error ? err.message : String(err) });
383
- }
384
- }
385
- }
386
- const byReason = {};
387
- for (const row of targets) {
388
- byReason[row.reason] ??= { count: 0, rss_mb: 0 };
389
- byReason[row.reason].count += 1;
390
- byReason[row.reason].rss_mb += row.rssKb / 1024;
391
- }
392
- for (const value of Object.values(byReason)) {
393
- value.rss_mb = Number(value.rss_mb.toFixed(1));
394
- }
395
- output({
396
- dry_run: dryRun,
397
- include_global_codesift: includeGlobalCodesift,
398
- matched: targets.length,
399
- killed: dryRun ? 0 : killed.length,
400
- failed: failed.length,
401
- matched_rss_mb: Number(beforeMb.toFixed(1)),
402
- by_reason: byReason,
403
- failed_pids: failed.map((row) => ({ pid: row.pid, reason: row.reason, error: row.error })),
404
- }, flags);
405
- }
406
- async function handleIndexConversations(args, flags) {
407
- const projectPath = args[0];
408
- const { indexConversations } = await import("../tools/conversation-tools.js");
409
- const result = await indexConversations(projectPath);
410
- if (!getBoolFlag(flags, "quiet")) {
411
- output(result, flags);
412
- }
413
- }
414
- // ---------------------------------------------------------------------------
415
- // Search commands
416
- // ---------------------------------------------------------------------------
417
- async function handleSearch(args, flags) {
418
- const repo = requireArg(args, 0, "repo");
419
- const query = requireArg(args, 1, "query");
420
- const { searchText } = await import("../tools/search-tools.js");
421
- const result = await searchText(repo, query, {
422
- file_pattern: getFlag(flags, "file-pattern"),
423
- regex: getBoolFlag(flags, "regex"),
424
- context_lines: getNumFlag(flags, "context-lines"),
425
- max_results: getNumFlag(flags, "max-results"),
426
- group_by_file: getBoolFlag(flags, "group-by-file"),
427
- });
428
- output(result, flags);
429
- }
430
- async function handleSymbols(args, flags) {
431
- const repo = requireArg(args, 0, "repo");
432
- const query = requireArg(args, 1, "query");
433
- const { searchSymbols } = await import("../tools/search-tools.js");
434
- const kindRaw = getFlag(flags, "kind");
435
- if (kindRaw !== undefined && !VALID_SYMBOL_KINDS.has(kindRaw)) {
436
- die(`Invalid --kind: ${kindRaw}. Valid: ${Array.from(VALID_SYMBOL_KINDS).join(", ")}`);
437
- }
438
- const includeSource = getBoolFlag(flags, "include-source");
439
- const explicitTopK = getNumFlag(flags, "top-k");
440
- // When --include-source is set and no explicit --top-k, default to 5
441
- // instead of 50 to avoid returning 50 full function bodies
442
- const topK = explicitTopK ?? (includeSource ? 5 : undefined);
443
- const result = await searchSymbols(repo, query, {
444
- kind: kindRaw,
445
- file_pattern: getFlag(flags, "file-pattern"),
446
- include_source: includeSource,
447
- top_k: topK,
448
- source_chars: getNumFlag(flags, "source-chars"),
449
- });
450
- output(result, flags);
451
- }
452
- // ---------------------------------------------------------------------------
453
- // Outline commands
454
- // ---------------------------------------------------------------------------
455
- async function handleTree(args, flags) {
456
- const repo = requireArg(args, 0, "repo");
457
- const { getFileTree } = await import("../tools/outline-tools.js");
458
- const result = await getFileTree(repo, {
459
- path_prefix: getFlag(flags, "path") ?? args[1],
460
- name_pattern: getFlag(flags, "name-pattern"),
461
- depth: getNumFlag(flags, "depth"),
462
- compact: getBoolFlag(flags, "compact"),
463
- min_symbols: getNumFlag(flags, "min-symbols"),
464
- });
465
- output(result, flags);
466
- }
467
- async function handleOutline(args, flags) {
468
- const repo = requireArg(args, 0, "repo");
469
- const file = requireArg(args, 1, "file");
470
- const { getFileOutline } = await import("../tools/outline-tools.js");
471
- const result = await getFileOutline(repo, file);
472
- output(result, flags);
473
- }
474
- async function handleRepoOutline(args, flags) {
475
- const repo = requireArg(args, 0, "repo");
476
- const { getRepoOutline } = await import("../tools/outline-tools.js");
477
- const result = await getRepoOutline(repo);
478
- output(result, flags);
479
- }
480
- // ---------------------------------------------------------------------------
481
- // Symbol commands
482
- // ---------------------------------------------------------------------------
483
- async function handleSymbol(args, flags) {
484
- const repo = requireArg(args, 0, "repo");
485
- const id = requireArg(args, 1, "id");
486
- const { getSymbol } = await import("../tools/symbol-tools.js");
487
- const result = await getSymbol(repo, id);
488
- if (result === null) {
489
- die(`Symbol not found: ${id}`);
490
- }
491
- output(result.symbol, flags);
492
- }
493
- async function handleSymbolsBatch(args, flags) {
494
- const repo = requireArg(args, 0, "repo");
495
- const ids = args.slice(1);
496
- if (ids.length === 0) {
497
- die("Missing required argument: <ids...>");
498
- }
499
- const { getSymbols } = await import("../tools/symbol-tools.js");
500
- const result = await getSymbols(repo, ids);
501
- output(result, flags);
502
- }
503
- async function handleFind(args, flags) {
504
- const repo = requireArg(args, 0, "repo");
505
- const query = requireArg(args, 1, "query");
506
- const { findAndShow } = await import("../tools/symbol-tools.js");
507
- const result = await findAndShow(repo, query, getBoolFlag(flags, "include-refs"));
508
- if (result === null) {
509
- die(`No symbol found matching: ${query}`);
510
- }
511
- output(result, flags);
512
- }
513
- async function handleRefs(args, flags) {
514
- const repo = requireArg(args, 0, "repo");
515
- const name = requireArg(args, 1, "name");
516
- const { findReferences } = await import("../tools/symbol-tools.js");
517
- const result = await findReferences(repo, name, getFlag(flags, "file-pattern"));
518
- if (getBoolFlag(flags, "json")) {
519
- output(result, flags);
520
- }
521
- else {
522
- // Compact tabular output: file:line:col | context
523
- for (const ref of result) {
524
- const loc = `${ref.file}:${ref.line}${ref.col ? `:${ref.col}` : ""}`;
525
- process.stdout.write(`${loc} | ${ref.context}\n`);
526
- }
527
- process.stderr.write(`\n${result.length} references found\n`);
528
- }
529
- }
530
- // ---------------------------------------------------------------------------
531
- // Graph commands
532
- // ---------------------------------------------------------------------------
533
- function printTraceCompact(root) {
534
- function printNode(node, indent) {
535
- const prefix = indent === 0 ? "" : " ".repeat(indent) + "|- ";
536
- const sym = node.symbol;
537
- const sig = sym.signature ? ` ${sym.signature}` : "";
538
- const loc = `${sym.file}:${sym.start_line}`;
539
- process.stdout.write(`${prefix}${sym.kind} | ${sym.name}${sig} | ${loc}\n`);
540
- for (const child of node.children) {
541
- printNode(child, indent + 1);
542
- }
543
- }
544
- printNode(root, 0);
545
- function countNodes(node) {
546
- return 1 + node.children.reduce((sum, c) => sum + countNodes(c), 0);
547
- }
548
- process.stderr.write(`\n${countNodes(root)} symbols in trace\n`);
549
- }
550
- async function handleTrace(args, flags) {
551
- const repo = requireArg(args, 0, "repo");
552
- const name = requireArg(args, 1, "name");
553
- const { traceCallChain } = await import("../tools/graph-tools.js");
554
- const direction = (getFlag(flags, "direction") ?? "callers");
555
- if (direction !== "callers" && direction !== "callees") {
556
- die(`Invalid --direction: ${direction}. Must be "callers" or "callees".`);
557
- }
558
- const result = await traceCallChain(repo, name, direction, {
559
- depth: getNumFlag(flags, "depth"),
560
- include_source: getBoolFlag(flags, "include-source") ?? false,
561
- include_tests: getBoolFlag(flags, "include-tests") ?? false,
562
- });
563
- if (getBoolFlag(flags, "json")) {
564
- output(result, flags);
565
- }
566
- else {
567
- printTraceCompact(result);
568
- }
569
- }
570
- async function handleImpact(args, flags) {
571
- const repo = requireArg(args, 0, "repo");
572
- const since = requireFlag(flags, "since");
573
- const { impactAnalysis } = await import("../tools/impact-tools.js");
574
- const result = await impactAnalysis(repo, since, {
575
- depth: getNumFlag(flags, "depth"),
576
- until: getFlag(flags, "until"),
577
- include_source: getBoolFlag(flags, "include-source"),
578
- });
579
- output(result, flags);
580
- }
581
- // ---------------------------------------------------------------------------
582
- // Context commands
583
- // ---------------------------------------------------------------------------
584
- async function handleContext(args, flags) {
585
- const repo = requireArg(args, 0, "repo");
586
- const query = requireArg(args, 1, "query");
587
- const { assembleContext } = await import("../tools/context-tools.js");
588
- const result = await assembleContext(repo, query, getNumFlag(flags, "token-budget"));
589
- output(result, flags);
590
- }
591
- async function handleKnowledgeMap(args, flags) {
592
- const repo = requireArg(args, 0, "repo");
593
- const { getKnowledgeMap } = await import("../tools/context-tools.js");
594
- const result = await getKnowledgeMap(repo, getFlag(flags, "focus"), getNumFlag(flags, "depth"));
595
- output(result, flags);
596
- }
597
- // ---------------------------------------------------------------------------
598
- // Diff commands
599
- // ---------------------------------------------------------------------------
600
- async function handleDiff(args, flags) {
601
- const repo = requireArg(args, 0, "repo");
602
- const since = requireFlag(flags, "since");
603
- const { diffOutline } = await import("../tools/diff-tools.js");
604
- const result = await diffOutline(repo, since, getFlag(flags, "until"));
605
- output(result, flags);
606
- }
607
- async function handleChanged(args, flags) {
608
- const repo = requireArg(args, 0, "repo");
609
- const since = requireFlag(flags, "since");
610
- const { changedSymbols } = await import("../tools/diff-tools.js");
611
- const result = await changedSymbols(repo, since, getFlag(flags, "until"));
612
- output(result, flags);
613
- }
614
- // ---------------------------------------------------------------------------
615
- // Retrieval & utility commands
616
- // ---------------------------------------------------------------------------
617
- function parseRetrievalQueries(flags) {
618
- const queriesRaw = getFlag(flags, "queries");
619
- if (!queriesRaw) {
620
- die("Missing required flag: --queries <json>");
621
- }
622
- let parsed;
623
- try {
624
- parsed = JSON.parse(queriesRaw);
625
- }
626
- catch {
627
- die("Invalid JSON for --queries flag");
628
- }
629
- if (!Array.isArray(parsed)) {
630
- die("--queries must be a JSON array");
631
- }
632
- for (const item of parsed) {
633
- if (typeof item !== "object" || item === null || typeof item.type !== "string") {
634
- die("Each --queries entry must be an object with a \"type\" string field");
635
- }
636
- }
637
- const queries = parsed;
638
- // --exclude-tests (default: true) — inject into semantic/hybrid sub-queries
639
- const excludeTests = getBoolFlag(flags, "exclude-tests") !== false;
640
- for (const q of queries) {
641
- if (EXCLUDE_TESTS_QUERY_TYPES.has(q.type) && q["exclude_tests"] === undefined) {
642
- q["exclude_tests"] = excludeTests;
643
- }
644
- }
645
- return queries;
646
- }
647
- async function handleRetrieve(args, flags) {
648
- const repo = requireArg(args, 0, "repo");
649
- const queries = parseRetrievalQueries(flags);
650
- const { codebaseRetrieval } = await import("../retrieval/codebase-retrieval.js");
651
- const result = await codebaseRetrieval(repo, queries, getNumFlag(flags, "token-budget"));
652
- output(result, flags);
653
- }
654
- async function handleStats(_args, flags) {
655
- const { getUsageStats, formatUsageReport } = await import("../storage/usage-stats.js");
656
- const stats = await getUsageStats();
657
- // If --json flag is set (or default), output raw stats; otherwise formatted report
658
- if (getBoolFlag(flags, "json") === false) {
659
- const report = formatUsageReport(stats);
660
- process.stdout.write(report + "\n");
661
- }
662
- else {
663
- output(stats, flags);
664
- }
665
- }
666
- async function handleGenerateClaudeMd(args, flags) {
667
- const repo = requireArg(args, 0, "repo");
668
- const { generateClaudeMd } = await import("../tools/generate-tools.js");
669
- const result = await generateClaudeMd(repo, getFlag(flags, "output"));
670
- output(result, flags);
671
- }
672
- // ---------------------------------------------------------------------------
673
- // Analysis commands
674
- // ---------------------------------------------------------------------------
675
- async function handleComplexity(args, flags) {
676
- const repo = requireArg(args, 0, "repo");
677
- const { analyzeComplexity } = await import("../tools/complexity-tools.js");
678
- const result = await analyzeComplexity(repo, {
679
- file_pattern: getFlag(flags, "file-pattern"),
680
- top_n: getNumFlag(flags, "top-n"),
681
- min_complexity: getNumFlag(flags, "min-complexity"),
682
- include_tests: getBoolFlag(flags, "include-tests"),
683
- });
684
- output(result, flags);
685
- }
686
- async function handleDeadCode(args, flags) {
687
- const repo = requireArg(args, 0, "repo");
688
- const { findDeadCode } = await import("../tools/symbol-tools.js");
689
- const result = await findDeadCode(repo, {
690
- file_pattern: getFlag(flags, "file-pattern"),
691
- include_tests: getBoolFlag(flags, "include-tests"),
692
- });
693
- output(result, flags);
694
- }
695
- async function handleHotspots(args, flags) {
696
- const repo = requireArg(args, 0, "repo");
697
- const { analyzeHotspots } = await import("../tools/hotspot-tools.js");
698
- const result = await analyzeHotspots(repo, {
699
- since_days: getNumFlag(flags, "since-days"),
700
- top_n: getNumFlag(flags, "top-n"),
701
- file_pattern: getFlag(flags, "file-pattern"),
702
- });
703
- output(result, flags);
704
- }
705
- async function handleCommunities(args, flags) {
706
- const repo = requireArg(args, 0, "repo");
707
- const { detectCommunities } = await import("../tools/community-tools.js");
708
- const result = await detectCommunities(repo, getFlag(flags, "focus"), getNumFlag(flags, "resolution"), getFlag(flags, "output-format"));
709
- output(result, flags);
710
- }
711
- async function handlePatterns(args, flags) {
712
- const repo = requireArg(args, 0, "repo");
713
- const pattern = requireFlag(flags, "pattern");
714
- const { searchPatterns } = await import("../tools/pattern-tools.js");
715
- const result = await searchPatterns(repo, pattern, {
716
- file_pattern: getFlag(flags, "file-pattern"),
717
- include_tests: getBoolFlag(flags, "include-tests"),
718
- max_results: getNumFlag(flags, "max-results"),
719
- });
720
- output(result, flags);
721
- }
722
- async function handleSetup(args, flags) {
723
- const platform = args[0];
724
- const { formatSetupLines, SUPPORTED_PLATFORMS } = await import("./setup.js");
725
- if (!platform) {
726
- die(`Missing platform. Usage: codesift setup <${SUPPORTED_PLATFORMS.join("|")}|all>`);
727
- return;
728
- }
729
- const hooks = getBoolFlag(flags, "no-hooks")
730
- ? false
731
- : (getBoolFlag(flags, "hooks") ?? true);
732
- const rules = getBoolFlag(flags, "no-rules")
733
- ? false
734
- : (getBoolFlag(flags, "rules") ?? true);
735
- const force = getBoolFlag(flags, "force") ?? false;
736
- // `--no-git-hooks` is a standalone boolean flag (parseArgs stores "no-git-hooks", not "git-hooks": false).
737
- const gitHooks = getBoolFlag(flags, "no-git-hooks")
738
- ? false
739
- : (getBoolFlag(flags, "git-hooks") ?? hooks);
740
- // --http points the client at the shared `codesift serve` daemon (one process
741
- // per machine) instead of spawning a stdio server per editor window.
742
- const http = getBoolFlag(flags, "http") ?? false;
743
- const port = getNumFlag(flags, "port");
744
- // A SHARED daemon needs a host and a token; without these `--http` could only
745
- // ever mean "the daemon on this machine", which defeats the point of having
746
- // one process serve several.
747
- const daemonHost = getFlag(flags, "host");
748
- const daemonToken = getFlag(flags, "token") ?? process.env["CODESIFT_HTTP_TOKEN"];
749
- // A bearer token on a plaintext link to another machine is refused unless the operator either
750
- // asks for https or states that the transport is already encrypted (tailnet/VPN/SSH tunnel).
751
- const rawScheme = getFlag(flags, "scheme");
752
- const daemonScheme = rawScheme === "https" ? "https" : rawScheme === "http" ? "http" : undefined;
753
- const insecureTransport = getBoolFlag(flags, "insecure-transport") ?? false;
754
- const options = {
755
- hooks, rules, force, gitHooks, http,
756
- ...(port !== undefined ? { port } : {}),
757
- ...(daemonHost ? { host: daemonHost } : {}),
758
- ...(daemonToken ? { token: daemonToken } : {}),
759
- ...(daemonScheme ? { scheme: daemonScheme } : {}),
760
- ...(insecureTransport ? { insecureTransport } : {}),
761
- };
762
- /** Global post-commit backlog hook — wired here because `formatSetupLines` stays editor-setup only (see setup/setupAll for programmatic installs). */
763
- async function emitGlobalGitHooksIfRequested() {
764
- if (options.gitHooks === false)
765
- return;
766
- // Match setup(): git hooks accompany editor hooks by default; allow `--git-hooks` without `--hooks`.
767
- const wantGitHooks = options.hooks || getBoolFlag(flags, "git-hooks") === true;
768
- if (!wantGitHooks)
769
- return;
770
- const { installGitHooks } = await import("./git-hooks-installer.js");
771
- const result = await installGitHooks({ force });
772
- if (result.reason) {
773
- process.stdout.write(`⚠️ git hooks: ${result.reason}\n`);
774
- return;
775
- }
776
- process.stdout.write(`✓ git post-commit hook → ${result.hooksPath}\n`);
777
- if (result.hooksPathSkippedReason) {
778
- process.stdout.write(` (${result.hooksPathSkippedReason})\n`);
779
- }
780
- }
781
- if (platform === "all") {
782
- for (const p of SUPPORTED_PLATFORMS) {
783
- const lines = await formatSetupLines(p, options);
784
- for (const line of lines)
785
- process.stdout.write(line + "\n");
786
- }
787
- await emitGlobalGitHooksIfRequested();
788
- return;
789
- }
790
- const lines = await formatSetupLines(platform, options);
791
- for (const line of lines)
792
- process.stdout.write(line + "\n");
793
- await emitGlobalGitHooksIfRequested();
794
- }
795
- async function handleFindClones(args, flags) {
796
- const repo = requireArg(args, 0, "repo");
797
- const { findClones } = await import("../tools/clone-tools.js");
798
- const result = await findClones(repo, {
799
- file_pattern: getFlag(flags, "file-pattern"),
800
- min_similarity: getNumFlag(flags, "threshold"),
801
- min_lines: getNumFlag(flags, "min-lines"),
802
- include_tests: getBoolFlag(flags, "include-tests"),
803
- });
804
- output(result, flags);
805
- }
806
- /**
807
- * `codesift service install|uninstall|status` — supervise the shared daemon.
808
- *
809
- * `serve` alone dies with the terminal that started it and never comes back
810
- * after a crash or reboot, which is precisely the failure the shared-daemon
811
- * model cannot tolerate: every client is configured to talk to one process.
812
- */
813
- async function handleService(args, flags) {
814
- const { installService, uninstallService, serviceStatus, DEFAULT_SERVICE_PORT } = await import("./service.js");
815
- const { loadConfig } = await import("../config.js");
816
- const dataDir = loadConfig().dataDir;
817
- const sub = args[0] ?? "status";
818
- try {
819
- if (sub === "install") {
820
- const port = getNumFlag(flags, "port") ?? DEFAULT_SERVICE_PORT;
821
- const host = getFlag(flags, "host") ?? "127.0.0.1";
822
- // A routable bind needs a token; the server enforces the same rule.
823
- const token = getFlag(flags, "token") ?? process.env["CODESIFT_HTTP_TOKEN"];
824
- // Carry the caller's CODESIFT_* environment into the unit. A service gets
825
- // almost nothing from the shell, so an embedding provider set only in the
826
- // shell is silently lost and the daemon falls back to on-CPU ONNX.
827
- const inheritedEnv = {};
828
- for (const [k, v] of Object.entries(process.env)) {
829
- if (k.startsWith("CODESIFT_") && k !== "CODESIFT_HTTP_TOKEN" && typeof v === "string") {
830
- inheritedEnv[k] = v;
831
- }
832
- }
833
- output(installService({
834
- dataDir, port, host,
835
- ...(token ? { token } : {}),
836
- ...(Object.keys(inheritedEnv).length > 0 ? { env: inheritedEnv } : {}),
837
- force: getBoolFlag(flags, "force") === true,
838
- }), flags);
839
- return;
840
- }
841
- if (sub === "uninstall") {
842
- output(uninstallService({ dataDir }), flags);
843
- return;
844
- }
845
- if (sub === "status") {
846
- output(serviceStatus({ dataDir }), flags);
847
- return;
848
- }
849
- }
850
- catch (e) {
851
- die(`service: ${e.message}`);
852
- return;
853
- }
854
- die(`service: unknown subcommand "${sub}" (expected install, uninstall or status)`);
855
- }
2
+ // CLI command dispatch facade
3
+ // ---------------------------------------------------------------------------
4
+ import { handleServe } from "./commands-daemon.js";
5
+ import { handleIndex, handleIndexRepo, handleRepos, handleInvalidate, handleIndexConversations, } from "./commands-index.js";
6
+ import { handlePrune, handleCleanupProcesses } from "./commands-maintenance.js";
7
+ import { handleSearch, handleSymbols, handleTree, handleOutline, handleRepoOutline, handleSymbol, handleSymbolsBatch, handleFind, handleRefs, handleTrace, handleImpact, handleContext, handleKnowledgeMap, handleDiff, handleChanged, handleRetrieve, handleStats, handleGenerateClaudeMd, } from "./commands-query.js";
8
+ import { handleComplexity, handleDeadCode, handleHotspots, handleCommunities, handlePatterns, handleSetup, handleFindClones, handleService, } from "./commands-admin.js";
9
+ export { DEFAULT_DAEMON_PORT, daemonLockPaths, isProcessAlive, readDaemonLock, startDaemon, } from "./commands-daemon.js";
856
10
  // ---------------------------------------------------------------------------
857
11
  // Command dispatch map
858
12
  // ---------------------------------------------------------------------------