glancey 2.0.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 (336) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +435 -0
  3. package/dist/__tests__/ast-chunker.test.d.ts +2 -0
  4. package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
  5. package/dist/__tests__/ast-chunker.test.js +307 -0
  6. package/dist/__tests__/ast-chunker.test.js.map +1 -0
  7. package/dist/__tests__/config.test.d.ts +2 -0
  8. package/dist/__tests__/config.test.d.ts.map +1 -0
  9. package/dist/__tests__/config.test.js +242 -0
  10. package/dist/__tests__/config.test.js.map +1 -0
  11. package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
  12. package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
  13. package/dist/__tests__/dashboard/beads.test.js +151 -0
  14. package/dist/__tests__/dashboard/beads.test.js.map +1 -0
  15. package/dist/__tests__/dashboard/index.test.d.ts +2 -0
  16. package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
  17. package/dist/__tests__/dashboard/index.test.js +116 -0
  18. package/dist/__tests__/dashboard/index.test.js.map +1 -0
  19. package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
  20. package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
  21. package/dist/__tests__/dashboard/routes.test.js +125 -0
  22. package/dist/__tests__/dashboard/routes.test.js.map +1 -0
  23. package/dist/__tests__/dashboard/server.test.d.ts +2 -0
  24. package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
  25. package/dist/__tests__/dashboard/server.test.js +75 -0
  26. package/dist/__tests__/dashboard/server.test.js.map +1 -0
  27. package/dist/__tests__/dashboard/state.test.d.ts +2 -0
  28. package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
  29. package/dist/__tests__/dashboard/state.test.js +124 -0
  30. package/dist/__tests__/dashboard/state.test.js.map +1 -0
  31. package/dist/__tests__/dashboard/token-tracking.test.d.ts +2 -0
  32. package/dist/__tests__/dashboard/token-tracking.test.d.ts.map +1 -0
  33. package/dist/__tests__/dashboard/token-tracking.test.js +315 -0
  34. package/dist/__tests__/dashboard/token-tracking.test.js.map +1 -0
  35. package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
  36. package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
  37. package/dist/__tests__/embeddings/factory.test.js +157 -0
  38. package/dist/__tests__/embeddings/factory.test.js.map +1 -0
  39. package/dist/__tests__/embeddings/gemini.test.d.ts +2 -0
  40. package/dist/__tests__/embeddings/gemini.test.d.ts.map +1 -0
  41. package/dist/__tests__/embeddings/gemini.test.js +178 -0
  42. package/dist/__tests__/embeddings/gemini.test.js.map +1 -0
  43. package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
  44. package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
  45. package/dist/__tests__/embeddings/ollama.test.js +273 -0
  46. package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
  47. package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
  48. package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
  49. package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
  50. package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
  51. package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
  52. package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
  53. package/dist/__tests__/embeddings/retry.test.js +334 -0
  54. package/dist/__tests__/embeddings/retry.test.js.map +1 -0
  55. package/dist/__tests__/embeddings/types.test.d.ts +2 -0
  56. package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
  57. package/dist/__tests__/embeddings/types.test.js +31 -0
  58. package/dist/__tests__/embeddings/types.test.js.map +1 -0
  59. package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
  60. package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
  61. package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
  62. package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
  63. package/dist/__tests__/mocks/fetch.mock.d.ts +49 -0
  64. package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
  65. package/dist/__tests__/mocks/fetch.mock.js +102 -0
  66. package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
  67. package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
  68. package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
  69. package/dist/__tests__/mocks/lancedb.mock.js +63 -0
  70. package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
  71. package/dist/__tests__/search/clustering.test.d.ts +2 -0
  72. package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
  73. package/dist/__tests__/search/clustering.test.js +230 -0
  74. package/dist/__tests__/search/clustering.test.js.map +1 -0
  75. package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
  76. package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
  77. package/dist/__tests__/search/hybrid-search.test.js +279 -0
  78. package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
  79. package/dist/__tests__/search/indexer.test.d.ts +2 -0
  80. package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
  81. package/dist/__tests__/search/indexer.test.js +1305 -0
  82. package/dist/__tests__/search/indexer.test.js.map +1 -0
  83. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
  84. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
  85. package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
  86. package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
  87. package/dist/__tests__/setup.d.ts +2 -0
  88. package/dist/__tests__/setup.d.ts.map +1 -0
  89. package/dist/__tests__/setup.js +11 -0
  90. package/dist/__tests__/setup.js.map +1 -0
  91. package/dist/__tests__/tools/clustering-handlers.test.d.ts +2 -0
  92. package/dist/__tests__/tools/clustering-handlers.test.d.ts.map +1 -0
  93. package/dist/__tests__/tools/clustering-handlers.test.js +286 -0
  94. package/dist/__tests__/tools/clustering-handlers.test.js.map +1 -0
  95. package/dist/__tests__/tools/commit-handlers.test.d.ts +2 -0
  96. package/dist/__tests__/tools/commit-handlers.test.d.ts.map +1 -0
  97. package/dist/__tests__/tools/commit-handlers.test.js +153 -0
  98. package/dist/__tests__/tools/commit-handlers.test.js.map +1 -0
  99. package/dist/__tests__/tools/index-handlers.test.d.ts +2 -0
  100. package/dist/__tests__/tools/index-handlers.test.d.ts.map +1 -0
  101. package/dist/__tests__/tools/index-handlers.test.js +184 -0
  102. package/dist/__tests__/tools/index-handlers.test.js.map +1 -0
  103. package/dist/__tests__/tools/instructions-handlers.test.d.ts +2 -0
  104. package/dist/__tests__/tools/instructions-handlers.test.d.ts.map +1 -0
  105. package/dist/__tests__/tools/instructions-handlers.test.js +53 -0
  106. package/dist/__tests__/tools/instructions-handlers.test.js.map +1 -0
  107. package/dist/__tests__/tools/memory-handlers.test.d.ts +2 -0
  108. package/dist/__tests__/tools/memory-handlers.test.d.ts.map +1 -0
  109. package/dist/__tests__/tools/memory-handlers.test.js +175 -0
  110. package/dist/__tests__/tools/memory-handlers.test.js.map +1 -0
  111. package/dist/__tests__/tools/search-handlers.test.d.ts +2 -0
  112. package/dist/__tests__/tools/search-handlers.test.d.ts.map +1 -0
  113. package/dist/__tests__/tools/search-handlers.test.js +229 -0
  114. package/dist/__tests__/tools/search-handlers.test.js.map +1 -0
  115. package/dist/__tests__/tools/symbol-handlers.test.d.ts +2 -0
  116. package/dist/__tests__/tools/symbol-handlers.test.d.ts.map +1 -0
  117. package/dist/__tests__/tools/symbol-handlers.test.js +348 -0
  118. package/dist/__tests__/tools/symbol-handlers.test.js.map +1 -0
  119. package/dist/__tests__/tools/worktree-handlers.test.d.ts +2 -0
  120. package/dist/__tests__/tools/worktree-handlers.test.d.ts.map +1 -0
  121. package/dist/__tests__/tools/worktree-handlers.test.js +297 -0
  122. package/dist/__tests__/tools/worktree-handlers.test.js.map +1 -0
  123. package/dist/__tests__/utils/cache.test.d.ts +2 -0
  124. package/dist/__tests__/utils/cache.test.d.ts.map +1 -0
  125. package/dist/__tests__/utils/cache.test.js +147 -0
  126. package/dist/__tests__/utils/cache.test.js.map +1 -0
  127. package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
  128. package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
  129. package/dist/__tests__/utils/concurrency.test.js +83 -0
  130. package/dist/__tests__/utils/concurrency.test.js.map +1 -0
  131. package/dist/__tests__/utils/errors.test.d.ts +2 -0
  132. package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
  133. package/dist/__tests__/utils/errors.test.js +136 -0
  134. package/dist/__tests__/utils/errors.test.js.map +1 -0
  135. package/dist/__tests__/utils/logger.test.d.ts +2 -0
  136. package/dist/__tests__/utils/logger.test.d.ts.map +1 -0
  137. package/dist/__tests__/utils/logger.test.js +131 -0
  138. package/dist/__tests__/utils/logger.test.js.map +1 -0
  139. package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
  140. package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
  141. package/dist/__tests__/utils/type-guards.test.js +80 -0
  142. package/dist/__tests__/utils/type-guards.test.js.map +1 -0
  143. package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
  144. package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
  145. package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
  146. package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
  147. package/dist/config.d.ts +191 -0
  148. package/dist/config.d.ts.map +1 -0
  149. package/dist/config.js +788 -0
  150. package/dist/config.js.map +1 -0
  151. package/dist/dashboard/beads.d.ts +35 -0
  152. package/dist/dashboard/beads.d.ts.map +1 -0
  153. package/dist/dashboard/beads.js +102 -0
  154. package/dist/dashboard/beads.js.map +1 -0
  155. package/dist/dashboard/events.d.ts +64 -0
  156. package/dist/dashboard/events.d.ts.map +1 -0
  157. package/dist/dashboard/events.js +211 -0
  158. package/dist/dashboard/events.js.map +1 -0
  159. package/dist/dashboard/index.d.ts +69 -0
  160. package/dist/dashboard/index.d.ts.map +1 -0
  161. package/dist/dashboard/index.js +93 -0
  162. package/dist/dashboard/index.js.map +1 -0
  163. package/dist/dashboard/routes.d.ts +6 -0
  164. package/dist/dashboard/routes.d.ts.map +1 -0
  165. package/dist/dashboard/routes.js +505 -0
  166. package/dist/dashboard/routes.js.map +1 -0
  167. package/dist/dashboard/server.d.ts +27 -0
  168. package/dist/dashboard/server.d.ts.map +1 -0
  169. package/dist/dashboard/server.js +72 -0
  170. package/dist/dashboard/server.js.map +1 -0
  171. package/dist/dashboard/state.d.ts +172 -0
  172. package/dist/dashboard/state.d.ts.map +1 -0
  173. package/dist/dashboard/state.js +362 -0
  174. package/dist/dashboard/state.js.map +1 -0
  175. package/dist/dashboard/token-tracking.d.ts +143 -0
  176. package/dist/dashboard/token-tracking.d.ts.map +1 -0
  177. package/dist/dashboard/token-tracking.js +363 -0
  178. package/dist/dashboard/token-tracking.js.map +1 -0
  179. package/dist/dashboard/ui.d.ts +6 -0
  180. package/dist/dashboard/ui.d.ts.map +1 -0
  181. package/dist/dashboard/ui.js +2710 -0
  182. package/dist/dashboard/ui.js.map +1 -0
  183. package/dist/embeddings/gemini.d.ts +28 -0
  184. package/dist/embeddings/gemini.d.ts.map +1 -0
  185. package/dist/embeddings/gemini.js +165 -0
  186. package/dist/embeddings/gemini.js.map +1 -0
  187. package/dist/embeddings/index.d.ts +34 -0
  188. package/dist/embeddings/index.d.ts.map +1 -0
  189. package/dist/embeddings/index.js +120 -0
  190. package/dist/embeddings/index.js.map +1 -0
  191. package/dist/embeddings/ollama.d.ts +22 -0
  192. package/dist/embeddings/ollama.d.ts.map +1 -0
  193. package/dist/embeddings/ollama.js +179 -0
  194. package/dist/embeddings/ollama.js.map +1 -0
  195. package/dist/embeddings/rate-limiter.d.ts +75 -0
  196. package/dist/embeddings/rate-limiter.d.ts.map +1 -0
  197. package/dist/embeddings/rate-limiter.js +145 -0
  198. package/dist/embeddings/rate-limiter.js.map +1 -0
  199. package/dist/embeddings/retry.d.ts +20 -0
  200. package/dist/embeddings/retry.d.ts.map +1 -0
  201. package/dist/embeddings/retry.js +227 -0
  202. package/dist/embeddings/retry.js.map +1 -0
  203. package/dist/embeddings/types.d.ts +103 -0
  204. package/dist/embeddings/types.d.ts.map +1 -0
  205. package/dist/embeddings/types.js +23 -0
  206. package/dist/embeddings/types.js.map +1 -0
  207. package/dist/index.d.ts +12 -0
  208. package/dist/index.d.ts.map +1 -0
  209. package/dist/index.js +2028 -0
  210. package/dist/index.js.map +1 -0
  211. package/dist/memory/index.d.ts +63 -0
  212. package/dist/memory/index.d.ts.map +1 -0
  213. package/dist/memory/index.js +168 -0
  214. package/dist/memory/index.js.map +1 -0
  215. package/dist/search/ast-chunker.d.ts +29 -0
  216. package/dist/search/ast-chunker.d.ts.map +1 -0
  217. package/dist/search/ast-chunker.js +236 -0
  218. package/dist/search/ast-chunker.js.map +1 -0
  219. package/dist/search/chunk-utils.d.ts +24 -0
  220. package/dist/search/chunk-utils.d.ts.map +1 -0
  221. package/dist/search/chunk-utils.js +41 -0
  222. package/dist/search/chunk-utils.js.map +1 -0
  223. package/dist/search/clustering.d.ts +77 -0
  224. package/dist/search/clustering.d.ts.map +1 -0
  225. package/dist/search/clustering.js +455 -0
  226. package/dist/search/clustering.js.map +1 -0
  227. package/dist/search/indexer.d.ts +377 -0
  228. package/dist/search/indexer.d.ts.map +1 -0
  229. package/dist/search/indexer.js +1557 -0
  230. package/dist/search/indexer.js.map +1 -0
  231. package/dist/search/tree-sitter-chunker.d.ts +64 -0
  232. package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
  233. package/dist/search/tree-sitter-chunker.js +412 -0
  234. package/dist/search/tree-sitter-chunker.js.map +1 -0
  235. package/dist/symbols/index.d.ts +14 -0
  236. package/dist/symbols/index.d.ts.map +1 -0
  237. package/dist/symbols/index.js +19 -0
  238. package/dist/symbols/index.js.map +1 -0
  239. package/dist/symbols/name-path.d.ts +113 -0
  240. package/dist/symbols/name-path.d.ts.map +1 -0
  241. package/dist/symbols/name-path.js +194 -0
  242. package/dist/symbols/name-path.js.map +1 -0
  243. package/dist/symbols/pattern-search.d.ts +14 -0
  244. package/dist/symbols/pattern-search.d.ts.map +1 -0
  245. package/dist/symbols/pattern-search.js +224 -0
  246. package/dist/symbols/pattern-search.js.map +1 -0
  247. package/dist/symbols/reference-finder.d.ts +38 -0
  248. package/dist/symbols/reference-finder.d.ts.map +1 -0
  249. package/dist/symbols/reference-finder.js +376 -0
  250. package/dist/symbols/reference-finder.js.map +1 -0
  251. package/dist/symbols/symbol-editor.d.ts +81 -0
  252. package/dist/symbols/symbol-editor.d.ts.map +1 -0
  253. package/dist/symbols/symbol-editor.js +257 -0
  254. package/dist/symbols/symbol-editor.js.map +1 -0
  255. package/dist/symbols/symbol-extractor.d.ts +49 -0
  256. package/dist/symbols/symbol-extractor.d.ts.map +1 -0
  257. package/dist/symbols/symbol-extractor.js +593 -0
  258. package/dist/symbols/symbol-extractor.js.map +1 -0
  259. package/dist/symbols/symbol-renamer.d.ts +81 -0
  260. package/dist/symbols/symbol-renamer.d.ts.map +1 -0
  261. package/dist/symbols/symbol-renamer.js +204 -0
  262. package/dist/symbols/symbol-renamer.js.map +1 -0
  263. package/dist/symbols/types.d.ts +234 -0
  264. package/dist/symbols/types.d.ts.map +1 -0
  265. package/dist/symbols/types.js +106 -0
  266. package/dist/symbols/types.js.map +1 -0
  267. package/dist/tools/clustering-handlers.d.ts +70 -0
  268. package/dist/tools/clustering-handlers.d.ts.map +1 -0
  269. package/dist/tools/clustering-handlers.js +150 -0
  270. package/dist/tools/clustering-handlers.js.map +1 -0
  271. package/dist/tools/commit-handlers.d.ts +77 -0
  272. package/dist/tools/commit-handlers.d.ts.map +1 -0
  273. package/dist/tools/commit-handlers.js +251 -0
  274. package/dist/tools/commit-handlers.js.map +1 -0
  275. package/dist/tools/index-handlers.d.ts +31 -0
  276. package/dist/tools/index-handlers.d.ts.map +1 -0
  277. package/dist/tools/index-handlers.js +53 -0
  278. package/dist/tools/index-handlers.js.map +1 -0
  279. package/dist/tools/instructions-handlers.d.ts +25 -0
  280. package/dist/tools/instructions-handlers.d.ts.map +1 -0
  281. package/dist/tools/instructions-handlers.js +36 -0
  282. package/dist/tools/instructions-handlers.js.map +1 -0
  283. package/dist/tools/memory-handlers.d.ts +95 -0
  284. package/dist/tools/memory-handlers.d.ts.map +1 -0
  285. package/dist/tools/memory-handlers.js +126 -0
  286. package/dist/tools/memory-handlers.js.map +1 -0
  287. package/dist/tools/search-handlers.d.ts +51 -0
  288. package/dist/tools/search-handlers.d.ts.map +1 -0
  289. package/dist/tools/search-handlers.js +128 -0
  290. package/dist/tools/search-handlers.js.map +1 -0
  291. package/dist/tools/symbol-handlers.d.ts +171 -0
  292. package/dist/tools/symbol-handlers.d.ts.map +1 -0
  293. package/dist/tools/symbol-handlers.js +456 -0
  294. package/dist/tools/symbol-handlers.js.map +1 -0
  295. package/dist/tools/types.d.ts +32 -0
  296. package/dist/tools/types.d.ts.map +1 -0
  297. package/dist/tools/types.js +17 -0
  298. package/dist/tools/types.js.map +1 -0
  299. package/dist/tools/worktree-handlers.d.ts +96 -0
  300. package/dist/tools/worktree-handlers.d.ts.map +1 -0
  301. package/dist/tools/worktree-handlers.js +186 -0
  302. package/dist/tools/worktree-handlers.js.map +1 -0
  303. package/dist/utils/cache.d.ts +77 -0
  304. package/dist/utils/cache.d.ts.map +1 -0
  305. package/dist/utils/cache.js +134 -0
  306. package/dist/utils/cache.js.map +1 -0
  307. package/dist/utils/concurrency.d.ts +32 -0
  308. package/dist/utils/concurrency.d.ts.map +1 -0
  309. package/dist/utils/concurrency.js +57 -0
  310. package/dist/utils/concurrency.js.map +1 -0
  311. package/dist/utils/errors.d.ts +36 -0
  312. package/dist/utils/errors.d.ts.map +1 -0
  313. package/dist/utils/errors.js +91 -0
  314. package/dist/utils/errors.js.map +1 -0
  315. package/dist/utils/logger.d.ts +37 -0
  316. package/dist/utils/logger.d.ts.map +1 -0
  317. package/dist/utils/logger.js +114 -0
  318. package/dist/utils/logger.js.map +1 -0
  319. package/dist/utils/type-guards.d.ts +17 -0
  320. package/dist/utils/type-guards.d.ts.map +1 -0
  321. package/dist/utils/type-guards.js +25 -0
  322. package/dist/utils/type-guards.js.map +1 -0
  323. package/dist/worktree/index.d.ts +6 -0
  324. package/dist/worktree/index.d.ts.map +1 -0
  325. package/dist/worktree/index.js +6 -0
  326. package/dist/worktree/index.js.map +1 -0
  327. package/dist/worktree/types.d.ts +101 -0
  328. package/dist/worktree/types.d.ts.map +1 -0
  329. package/dist/worktree/types.js +6 -0
  330. package/dist/worktree/types.js.map +1 -0
  331. package/dist/worktree/worktree-manager.d.ts +80 -0
  332. package/dist/worktree/worktree-manager.d.ts.map +1 -0
  333. package/dist/worktree/worktree-manager.js +407 -0
  334. package/dist/worktree/worktree-manager.js.map +1 -0
  335. package/package.json +87 -0
  336. package/scripts/postinstall.js +48 -0
@@ -0,0 +1,286 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { handleSummarizeCodebase, handleListConcepts, handleSearchByConcept, parseSummarizeCodebaseArgs, parseListConceptsArgs, parseSearchByConceptArgs, formatCodebaseSummary, formatConceptClusters, formatConceptSearchResults, } from '../../tools/clustering-handlers.js';
3
+ import { GlanceyError } from '../../utils/errors.js';
4
+ // Helper to create a valid ConceptCluster
5
+ function createConceptCluster(overrides = {}) {
6
+ return {
7
+ id: 0,
8
+ label: 'Test Cluster',
9
+ size: 10,
10
+ keywords: ['test', 'keyword'],
11
+ representativeChunks: ['test.ts:1-10'],
12
+ centroid: [0.1, 0.2, 0.3],
13
+ ...overrides,
14
+ };
15
+ }
16
+ describe('clustering-handlers', () => {
17
+ let mockIndexer;
18
+ let context;
19
+ beforeEach(() => {
20
+ mockIndexer = {
21
+ summarizeCodebase: vi.fn(),
22
+ listConcepts: vi.fn(),
23
+ searchByConcept: vi.fn(),
24
+ };
25
+ context = {
26
+ indexer: mockIndexer,
27
+ toolGuidance: '\n---\nGuidance',
28
+ };
29
+ });
30
+ describe('parseSummarizeCodebaseArgs', () => {
31
+ it('should return defaults when no args provided', () => {
32
+ const result = parseSummarizeCodebaseArgs(undefined);
33
+ expect(result.numClusters).toBeUndefined();
34
+ });
35
+ it('should parse numClusters', () => {
36
+ const result = parseSummarizeCodebaseArgs({ numClusters: 5 });
37
+ expect(result.numClusters).toBe(5);
38
+ });
39
+ it('should ignore invalid numClusters', () => {
40
+ const result = parseSummarizeCodebaseArgs({ numClusters: 'invalid' });
41
+ expect(result.numClusters).toBeUndefined();
42
+ });
43
+ });
44
+ describe('formatCodebaseSummary', () => {
45
+ it('should format summary correctly', () => {
46
+ const summary = {
47
+ totalFiles: 100,
48
+ totalChunks: 500,
49
+ languages: [
50
+ { language: 'typescript', fileCount: 80, chunkCount: 400 },
51
+ { language: 'javascript', fileCount: 20, chunkCount: 100 },
52
+ ],
53
+ concepts: [
54
+ createConceptCluster({
55
+ id: 0,
56
+ label: 'Authentication',
57
+ size: 50,
58
+ keywords: ['auth', 'login', 'token', 'jwt', 'session'],
59
+ representativeChunks: ['auth.ts:1-20'],
60
+ }),
61
+ ],
62
+ clusteringQuality: 0.75,
63
+ generatedAt: '2024-01-15T00:00:00.000Z',
64
+ };
65
+ const formatted = formatCodebaseSummary(summary);
66
+ expect(formatted).toContain('# Codebase Summary');
67
+ expect(formatted).toContain('**Total Files**: 100');
68
+ expect(formatted).toContain('**Total Chunks**: 500');
69
+ expect(formatted).toContain('75.0% (silhouette score)');
70
+ expect(formatted).toContain('**typescript**: 80 files');
71
+ expect(formatted).toContain('**Cluster 0: Authentication**');
72
+ expect(formatted).toContain('auth, login, token, jwt, session');
73
+ });
74
+ });
75
+ describe('handleSummarizeCodebase', () => {
76
+ it('should call indexer.summarizeCodebase', async () => {
77
+ const summary = {
78
+ totalFiles: 10,
79
+ totalChunks: 50,
80
+ languages: [],
81
+ concepts: [],
82
+ clusteringQuality: 0.8,
83
+ generatedAt: '2024-01-15T00:00:00.000Z',
84
+ };
85
+ vi.mocked(mockIndexer.summarizeCodebase).mockResolvedValue(summary);
86
+ await handleSummarizeCodebase({}, context);
87
+ expect(mockIndexer.summarizeCodebase).toHaveBeenCalledWith(undefined);
88
+ });
89
+ it('should pass numClusters option when provided', async () => {
90
+ const summary = {
91
+ totalFiles: 10,
92
+ totalChunks: 50,
93
+ languages: [],
94
+ concepts: [],
95
+ clusteringQuality: 0.8,
96
+ generatedAt: '2024-01-15T00:00:00.000Z',
97
+ };
98
+ vi.mocked(mockIndexer.summarizeCodebase).mockResolvedValue(summary);
99
+ await handleSummarizeCodebase({ numClusters: 5 }, context);
100
+ expect(mockIndexer.summarizeCodebase).toHaveBeenCalledWith({ numClusters: 5 });
101
+ });
102
+ it('should append tool guidance', async () => {
103
+ const summary = {
104
+ totalFiles: 10,
105
+ totalChunks: 50,
106
+ languages: [],
107
+ concepts: [],
108
+ clusteringQuality: 0.8,
109
+ generatedAt: '2024-01-15T00:00:00.000Z',
110
+ };
111
+ vi.mocked(mockIndexer.summarizeCodebase).mockResolvedValue(summary);
112
+ const result = await handleSummarizeCodebase({}, context);
113
+ expect(result.content[0].text).toContain('Guidance');
114
+ });
115
+ });
116
+ describe('parseListConceptsArgs', () => {
117
+ it('should return defaults when no args provided', () => {
118
+ const result = parseListConceptsArgs(undefined);
119
+ expect(result.forceRecluster).toBe(false);
120
+ });
121
+ it('should parse forceRecluster', () => {
122
+ const result = parseListConceptsArgs({ forceRecluster: true });
123
+ expect(result.forceRecluster).toBe(true);
124
+ });
125
+ it('should default forceRecluster to false for invalid value', () => {
126
+ const result = parseListConceptsArgs({ forceRecluster: 'true' });
127
+ expect(result.forceRecluster).toBe(false);
128
+ });
129
+ });
130
+ describe('formatConceptClusters', () => {
131
+ it('should return message for empty list', () => {
132
+ expect(formatConceptClusters([])).toContain('No concept clusters found');
133
+ });
134
+ it('should format concepts correctly', () => {
135
+ const concepts = [
136
+ createConceptCluster({
137
+ id: 0,
138
+ label: 'API Handlers',
139
+ size: 25,
140
+ keywords: ['api', 'handler', 'request', 'response', 'route'],
141
+ representativeChunks: ['api.ts:1-20', 'handler.ts:1-15', 'routes.ts:1-30'],
142
+ }),
143
+ createConceptCluster({
144
+ id: 1,
145
+ label: 'Database',
146
+ size: 15,
147
+ keywords: ['db', 'query', 'model'],
148
+ representativeChunks: ['db.ts:1-50'],
149
+ }),
150
+ ];
151
+ const formatted = formatConceptClusters(concepts);
152
+ expect(formatted).toContain('# Concept Clusters');
153
+ expect(formatted).toContain('## Cluster 0: API Handlers');
154
+ expect(formatted).toContain('**Size**: 25 code chunks');
155
+ expect(formatted).toContain('api, handler, request, response, route');
156
+ expect(formatted).toContain('api.ts:1-20, handler.ts:1-15, routes.ts:1-30');
157
+ expect(formatted).toContain('## Cluster 1: Database');
158
+ });
159
+ });
160
+ describe('handleListConcepts', () => {
161
+ it('should call indexer.listConcepts', async () => {
162
+ vi.mocked(mockIndexer.listConcepts).mockResolvedValue([]);
163
+ await handleListConcepts({ forceRecluster: true }, context);
164
+ expect(mockIndexer.listConcepts).toHaveBeenCalledWith(true);
165
+ });
166
+ it('should return formatted concepts', async () => {
167
+ const concepts = [
168
+ createConceptCluster({
169
+ id: 0,
170
+ label: 'Test',
171
+ size: 10,
172
+ keywords: ['test'],
173
+ representativeChunks: ['test.ts:1-10'],
174
+ }),
175
+ ];
176
+ vi.mocked(mockIndexer.listConcepts).mockResolvedValue(concepts);
177
+ const result = await handleListConcepts({ forceRecluster: false }, context);
178
+ expect(result.content[0].text).toContain('Cluster 0: Test');
179
+ });
180
+ it('should append tool guidance', async () => {
181
+ vi.mocked(mockIndexer.listConcepts).mockResolvedValue([]);
182
+ const result = await handleListConcepts({ forceRecluster: false }, context);
183
+ expect(result.content[0].text).toContain('Guidance');
184
+ });
185
+ });
186
+ describe('parseSearchByConceptArgs', () => {
187
+ it('should throw when conceptId is missing', () => {
188
+ expect(() => parseSearchByConceptArgs({})).toThrow(GlanceyError);
189
+ expect(() => parseSearchByConceptArgs({})).toThrow('conceptId is required');
190
+ });
191
+ it('should throw when conceptId is negative', () => {
192
+ expect(() => parseSearchByConceptArgs({ conceptId: -1 })).toThrow(GlanceyError);
193
+ });
194
+ it('should parse valid conceptId', () => {
195
+ const result = parseSearchByConceptArgs({ conceptId: 5 });
196
+ expect(result.conceptId).toBe(5);
197
+ });
198
+ it('should use default limit of 10', () => {
199
+ const result = parseSearchByConceptArgs({ conceptId: 0 });
200
+ expect(result.limit).toBe(10);
201
+ });
202
+ it('should parse custom limit', () => {
203
+ const result = parseSearchByConceptArgs({ conceptId: 0, limit: 20 });
204
+ expect(result.limit).toBe(20);
205
+ });
206
+ it('should parse optional query', () => {
207
+ const result = parseSearchByConceptArgs({ conceptId: 0, query: 'authentication' });
208
+ expect(result.query).toBe('authentication');
209
+ });
210
+ });
211
+ describe('formatConceptSearchResults', () => {
212
+ it('should return message for empty results', () => {
213
+ const formatted = formatConceptSearchResults([], 5);
214
+ expect(formatted).toContain('No code found in concept cluster 5');
215
+ expect(formatted).toContain('list_concepts');
216
+ });
217
+ it('should format results with symbol info', () => {
218
+ const results = [
219
+ {
220
+ id: 'test.ts:1-20',
221
+ filepath: 'test.ts',
222
+ content: 'function authenticate() {}',
223
+ startLine: 1,
224
+ endLine: 20,
225
+ language: 'typescript',
226
+ symbolName: 'authenticate',
227
+ symbolType: 'function',
228
+ },
229
+ ];
230
+ const formatted = formatConceptSearchResults(results, 0);
231
+ expect(formatted).toContain('## Result 1: test.ts:1-20');
232
+ expect(formatted).toContain('**Symbol:** `authenticate`');
233
+ expect(formatted).toContain('(function)');
234
+ expect(formatted).toContain('```typescript');
235
+ expect(formatted).toContain('function authenticate()');
236
+ });
237
+ it('should format results without symbol info', () => {
238
+ const results = [
239
+ {
240
+ id: 'config.json:1-10',
241
+ filepath: 'config.json',
242
+ content: '{ "key": "value" }',
243
+ startLine: 1,
244
+ endLine: 10,
245
+ language: 'json',
246
+ },
247
+ ];
248
+ const formatted = formatConceptSearchResults(results, 0);
249
+ expect(formatted).toContain('## Result 1: config.json:1-10');
250
+ expect(formatted).not.toContain('**Symbol:**');
251
+ });
252
+ });
253
+ describe('handleSearchByConcept', () => {
254
+ it('should call indexer.searchByConcept with correct options', async () => {
255
+ vi.mocked(mockIndexer.searchByConcept).mockResolvedValue([]);
256
+ await handleSearchByConcept({ conceptId: 3, query: 'auth', limit: 5 }, context);
257
+ expect(mockIndexer.searchByConcept).toHaveBeenCalledWith(3, 'auth', 5);
258
+ });
259
+ it('should use default limit when not provided', async () => {
260
+ vi.mocked(mockIndexer.searchByConcept).mockResolvedValue([]);
261
+ await handleSearchByConcept({ conceptId: 0 }, context);
262
+ expect(mockIndexer.searchByConcept).toHaveBeenCalledWith(0, undefined, 10);
263
+ });
264
+ it('should return formatted results', async () => {
265
+ const results = [
266
+ {
267
+ id: 'result.ts:1-10',
268
+ filepath: 'result.ts',
269
+ content: 'code here',
270
+ startLine: 1,
271
+ endLine: 10,
272
+ language: 'typescript',
273
+ },
274
+ ];
275
+ vi.mocked(mockIndexer.searchByConcept).mockResolvedValue(results);
276
+ const result = await handleSearchByConcept({ conceptId: 0 }, context);
277
+ expect(result.content[0].text).toContain('result.ts:1-10');
278
+ });
279
+ it('should append tool guidance', async () => {
280
+ vi.mocked(mockIndexer.searchByConcept).mockResolvedValue([]);
281
+ const result = await handleSearchByConcept({ conceptId: 0 }, context);
282
+ expect(result.content[0].text).toContain('Guidance');
283
+ });
284
+ });
285
+ });
286
+ //# sourceMappingURL=clustering-handlers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clustering-handlers.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/clustering-handlers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=commit-handlers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-handlers.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/commit-handlers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,153 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { handleCommit, parseCommitArgs, validateCommit, formatValidationErrors, formatCommitSuccess, COMMIT_RULES, } from '../../tools/commit-handlers.js';
3
+ import { GlanceyError } from '../../utils/errors.js';
4
+ describe('commit-handlers', () => {
5
+ let mockGitOperations;
6
+ let context;
7
+ beforeEach(() => {
8
+ mockGitOperations = {
9
+ getCurrentBranch: vi.fn().mockResolvedValue('feature/test'),
10
+ stageFiles: vi.fn().mockResolvedValue(undefined),
11
+ getStagedFiles: vi.fn().mockResolvedValue(['file.ts']),
12
+ commit: vi.fn().mockResolvedValue('[feature/test abc123] Test commit'),
13
+ unstageFiles: vi.fn().mockResolvedValue(undefined),
14
+ writeMarkerFile: vi.fn(),
15
+ };
16
+ context = {
17
+ projectPath: '/test/project',
18
+ gitOperations: mockGitOperations,
19
+ };
20
+ });
21
+ describe('parseCommitArgs', () => {
22
+ it('should throw when message is missing', () => {
23
+ expect(() => parseCommitArgs({})).toThrow(GlanceyError);
24
+ expect(() => parseCommitArgs({})).toThrow('message is required');
25
+ });
26
+ it('should throw when message is empty', () => {
27
+ expect(() => parseCommitArgs({ message: '' })).toThrow(GlanceyError);
28
+ });
29
+ it('should parse valid message', () => {
30
+ const result = parseCommitArgs({ message: 'feat: add feature' });
31
+ expect(result.message).toBe('feat: add feature');
32
+ });
33
+ it('should parse files array', () => {
34
+ const result = parseCommitArgs({ message: 'test', files: ['a.ts', 'b.ts'] });
35
+ expect(result.files).toEqual(['a.ts', 'b.ts']);
36
+ });
37
+ it('should default files to empty array', () => {
38
+ const result = parseCommitArgs({ message: 'test' });
39
+ expect(result.files).toEqual([]);
40
+ });
41
+ });
42
+ describe('validateCommit', () => {
43
+ it('should pass for valid commit on feature branch', async () => {
44
+ const result = await validateCommit('feat: add feature', context);
45
+ expect(result.valid).toBe(true);
46
+ expect(result.errors).toHaveLength(0);
47
+ });
48
+ it('should fail when on main branch', async () => {
49
+ vi.mocked(mockGitOperations.getCurrentBranch).mockResolvedValue('main');
50
+ const result = await validateCommit('feat: add feature', context);
51
+ expect(result.valid).toBe(false);
52
+ expect(result.errors[0]).toContain('Cannot commit directly to main');
53
+ });
54
+ it('should fail when on master branch', async () => {
55
+ vi.mocked(mockGitOperations.getCurrentBranch).mockResolvedValue('master');
56
+ const result = await validateCommit('feat: add feature', context);
57
+ expect(result.valid).toBe(false);
58
+ expect(result.errors[0]).toContain('Cannot commit directly to master');
59
+ });
60
+ it('should fail for subject line over 72 characters', async () => {
61
+ const longMessage = 'a'.repeat(73);
62
+ const result = await validateCommit(longMessage, context);
63
+ expect(result.valid).toBe(false);
64
+ expect(result.errors).toContainEqual(expect.stringContaining('73 characters'));
65
+ });
66
+ it('should warn for past tense in message', async () => {
67
+ const result = await validateCommit('Added new feature', context);
68
+ expect(result.valid).toBe(true); // warnings don't block
69
+ expect(result.warnings[0]).toContain('imperative mood');
70
+ });
71
+ it('should fail for multi-responsibility message', async () => {
72
+ const result = await validateCommit('feat: add feature and fix bug', context);
73
+ expect(result.valid).toBe(false);
74
+ expect(result.errors[0]).toContain('multiple responsibilities');
75
+ });
76
+ it('should handle getCurrentBranch error', async () => {
77
+ vi.mocked(mockGitOperations.getCurrentBranch).mockRejectedValue(new Error('git error'));
78
+ const result = await validateCommit('feat: add feature', context);
79
+ expect(result.valid).toBe(false);
80
+ expect(result.errors[0]).toContain('Failed to determine current branch');
81
+ });
82
+ });
83
+ describe('formatValidationErrors', () => {
84
+ it('should format errors only', () => {
85
+ const formatted = formatValidationErrors(['Error 1', 'Error 2'], []);
86
+ expect(formatted).toContain('## Commit Blocked');
87
+ expect(formatted).toContain('- Error 1');
88
+ expect(formatted).toContain('- Error 2');
89
+ expect(formatted).not.toContain('**Warnings:**');
90
+ expect(formatted).toContain(COMMIT_RULES);
91
+ });
92
+ it('should format errors and warnings', () => {
93
+ const formatted = formatValidationErrors(['Error'], ['Warning']);
94
+ expect(formatted).toContain('**Errors:**');
95
+ expect(formatted).toContain('- Error');
96
+ expect(formatted).toContain('**Warnings:**');
97
+ expect(formatted).toContain('- Warning');
98
+ });
99
+ });
100
+ describe('formatCommitSuccess', () => {
101
+ it('should format success without warnings', () => {
102
+ const formatted = formatCommitSuccess('[abc123] Test commit', []);
103
+ expect(formatted).toContain('## Commit Successful');
104
+ expect(formatted).toContain('[abc123] Test commit');
105
+ expect(formatted).not.toContain('**Warnings:**');
106
+ expect(formatted).toContain(COMMIT_RULES);
107
+ });
108
+ it('should include warnings if present', () => {
109
+ const formatted = formatCommitSuccess('[abc123] Test', ['Warning here']);
110
+ expect(formatted).toContain('**Warnings:**');
111
+ expect(formatted).toContain('- Warning here');
112
+ });
113
+ });
114
+ describe('handleCommit', () => {
115
+ it('should return error for invalid commit', async () => {
116
+ vi.mocked(mockGitOperations.getCurrentBranch).mockResolvedValue('main');
117
+ const result = await handleCommit({ message: 'test' }, context);
118
+ expect(result.isError).toBe(true);
119
+ expect(result.content[0].text).toContain('Commit Blocked');
120
+ });
121
+ it('should stage files if provided', async () => {
122
+ await handleCommit({ message: 'test', files: ['a.ts', 'b.ts'] }, context);
123
+ expect(mockGitOperations.stageFiles).toHaveBeenCalledWith('/test/project', ['a.ts', 'b.ts']);
124
+ });
125
+ it('should check for staged changes', async () => {
126
+ await handleCommit({ message: 'test' }, context);
127
+ expect(mockGitOperations.getStagedFiles).toHaveBeenCalledWith('/test/project');
128
+ });
129
+ it('should throw if no staged changes', async () => {
130
+ vi.mocked(mockGitOperations.getStagedFiles).mockResolvedValue([]);
131
+ await expect(handleCommit({ message: 'test' }, context)).rejects.toThrow('No staged changes to commit');
132
+ });
133
+ it('should write marker file before commit', async () => {
134
+ await handleCommit({ message: 'test' }, context);
135
+ expect(mockGitOperations.writeMarkerFile).toHaveBeenCalledWith('/test/project');
136
+ });
137
+ it('should execute commit with message', async () => {
138
+ await handleCommit({ message: 'feat: test' }, context);
139
+ expect(mockGitOperations.commit).toHaveBeenCalledWith('/test/project', 'feat: test');
140
+ });
141
+ it('should return success response', async () => {
142
+ const result = await handleCommit({ message: 'feat: test' }, context);
143
+ expect(result.isError).toBeUndefined();
144
+ expect(result.content[0].text).toContain('Commit Successful');
145
+ });
146
+ it('should unstage files on commit failure', async () => {
147
+ vi.mocked(mockGitOperations.commit).mockRejectedValue(new Error('commit failed'));
148
+ await expect(handleCommit({ message: 'test', files: ['staged.ts'] }, context)).rejects.toThrow();
149
+ expect(mockGitOperations.unstageFiles).toHaveBeenCalledWith('/test/project', ['staged.ts']);
150
+ });
151
+ });
152
+ });
153
+ //# sourceMappingURL=commit-handlers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-handlers.test.js","sourceRoot":"","sources":["../../../src/__tests__/tools/commit-handlers.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index-handlers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-handlers.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/tools/index-handlers.test.ts"],"names":[],"mappings":""}