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,70 @@
1
+ /**
2
+ * Tool handlers for clustering operations.
3
+ */
4
+ import type { CodeIndexer, CodeChunk, CodebaseSummary } from '../search/indexer.js';
5
+ import type { ConceptCluster } from '../search/clustering.js';
6
+ import type { ToolResponse } from './types.js';
7
+ /**
8
+ * Context for clustering tools.
9
+ */
10
+ export interface ClusteringToolContext {
11
+ indexer: CodeIndexer;
12
+ toolGuidance: string;
13
+ }
14
+ /**
15
+ * Arguments for summarize_codebase tool.
16
+ */
17
+ export interface SummarizeCodebaseArgs {
18
+ numClusters?: number;
19
+ }
20
+ /**
21
+ * Parse and validate summarize_codebase arguments.
22
+ */
23
+ export declare function parseSummarizeCodebaseArgs(args: Record<string, unknown> | undefined): SummarizeCodebaseArgs;
24
+ /**
25
+ * Format codebase summary for display.
26
+ */
27
+ export declare function formatCodebaseSummary(summary: CodebaseSummary): string;
28
+ /**
29
+ * Handle summarize_codebase tool.
30
+ */
31
+ export declare function handleSummarizeCodebase(args: SummarizeCodebaseArgs, context: ClusteringToolContext): Promise<ToolResponse>;
32
+ /**
33
+ * Arguments for list_concepts tool.
34
+ */
35
+ export interface ListConceptsArgs {
36
+ forceRecluster?: boolean;
37
+ }
38
+ /**
39
+ * Parse and validate list_concepts arguments.
40
+ */
41
+ export declare function parseListConceptsArgs(args: Record<string, unknown> | undefined): ListConceptsArgs;
42
+ /**
43
+ * Format concept clusters for display.
44
+ */
45
+ export declare function formatConceptClusters(concepts: ConceptCluster[]): string;
46
+ /**
47
+ * Handle list_concepts tool.
48
+ */
49
+ export declare function handleListConcepts(args: ListConceptsArgs, context: ClusteringToolContext): Promise<ToolResponse>;
50
+ /**
51
+ * Arguments for search_by_concept tool.
52
+ */
53
+ export interface SearchByConceptArgs {
54
+ conceptId: number;
55
+ query?: string;
56
+ limit?: number;
57
+ }
58
+ /**
59
+ * Parse and validate search_by_concept arguments.
60
+ */
61
+ export declare function parseSearchByConceptArgs(args: Record<string, unknown> | undefined): SearchByConceptArgs;
62
+ /**
63
+ * Format concept search results for display.
64
+ */
65
+ export declare function formatConceptSearchResults(results: CodeChunk[], conceptId: number): string;
66
+ /**
67
+ * Handle search_by_concept tool.
68
+ */
69
+ export declare function handleSearchByConcept(args: SearchByConceptArgs, context: ClusteringToolContext): Promise<ToolResponse>;
70
+ //# sourceMappingURL=clustering-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clustering-handlers.d.ts","sourceRoot":"","sources":["../../src/tools/clustering-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,WAAW,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACxC,qBAAqB,CAIvB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CA0BtE;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,qBAAqB,EAC3B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAiBvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,gBAAgB,CAIjG;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,MAAM,CAgBxE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAYvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACxC,mBAAmB,CAerB;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAe1F;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,mBAAmB,EACzB,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Tool handlers for clustering operations.
3
+ */
4
+ import { createToolResponse } from './types.js';
5
+ import { isNumber, isBoolean, isString } from '../utils/type-guards.js';
6
+ import { GlanceyError } from '../utils/errors.js';
7
+ import { dashboardState } from '../dashboard/state.js';
8
+ /**
9
+ * Parse and validate summarize_codebase arguments.
10
+ */
11
+ export function parseSummarizeCodebaseArgs(args) {
12
+ return {
13
+ numClusters: isNumber(args?.numClusters) ? args.numClusters : undefined,
14
+ };
15
+ }
16
+ /**
17
+ * Format codebase summary for display.
18
+ */
19
+ export function formatCodebaseSummary(summary) {
20
+ const languageList = summary.languages
21
+ .map((l) => `- **${l.language}**: ${l.fileCount} files, ${l.chunkCount} chunks`)
22
+ .join('\n');
23
+ const conceptList = summary.concepts
24
+ .map((c) => {
25
+ const keywords = c.keywords.slice(0, 5).join(', ');
26
+ return `- **Cluster ${c.id}: ${c.label}** (${c.size} chunks)\n Keywords: ${keywords}`;
27
+ })
28
+ .join('\n');
29
+ return `# Codebase Summary
30
+
31
+ ## Overview
32
+ - **Total Files**: ${summary.totalFiles}
33
+ - **Total Chunks**: ${summary.totalChunks}
34
+ - **Concept Clusters**: ${summary.concepts.length}
35
+ - **Clustering Quality**: ${(summary.clusteringQuality * 100).toFixed(1)}% (silhouette score)
36
+ - **Generated At**: ${summary.generatedAt}
37
+
38
+ ## Languages
39
+ ${languageList}
40
+
41
+ ## Concept Areas
42
+ ${conceptList}`;
43
+ }
44
+ /**
45
+ * Handle summarize_codebase tool.
46
+ */
47
+ export async function handleSummarizeCodebase(args, context) {
48
+ const summary = await context.indexer.summarizeCodebase(args.numClusters ? { numClusters: args.numClusters } : undefined);
49
+ const formatted = formatCodebaseSummary(summary);
50
+ // Track token savings (optional)
51
+ try {
52
+ const status = await context.indexer.getStatus();
53
+ dashboardState
54
+ .getTokenTracker()
55
+ .recordSummarizeCodebase(formatted.length, status.fileCount ?? 0);
56
+ }
57
+ catch {
58
+ // Token tracking not available
59
+ }
60
+ return createToolResponse(formatted, context.toolGuidance);
61
+ }
62
+ /**
63
+ * Parse and validate list_concepts arguments.
64
+ */
65
+ export function parseListConceptsArgs(args) {
66
+ return {
67
+ forceRecluster: isBoolean(args?.forceRecluster) ? args.forceRecluster : false,
68
+ };
69
+ }
70
+ /**
71
+ * Format concept clusters for display.
72
+ */
73
+ export function formatConceptClusters(concepts) {
74
+ if (concepts.length === 0) {
75
+ return 'No concept clusters found. Make sure the codebase is indexed first.';
76
+ }
77
+ const formatted = concepts
78
+ .map((c) => {
79
+ const keywords = c.keywords.slice(0, 5).join(', ');
80
+ return `## Cluster ${c.id}: ${c.label}
81
+ - **Size**: ${c.size} code chunks
82
+ - **Keywords**: ${keywords}
83
+ - **Representatives**: ${c.representativeChunks.slice(0, 3).join(', ')}`;
84
+ })
85
+ .join('\n\n');
86
+ return `# Concept Clusters\n\n${formatted}`;
87
+ }
88
+ /**
89
+ * Handle list_concepts tool.
90
+ */
91
+ export async function handleListConcepts(args, context) {
92
+ const concepts = await context.indexer.listConcepts(args.forceRecluster ?? false);
93
+ const formatted = formatConceptClusters(concepts);
94
+ // Track token savings (optional)
95
+ try {
96
+ dashboardState.getTokenTracker().recordListConcepts(formatted.length, concepts.length);
97
+ }
98
+ catch {
99
+ // Token tracking not available
100
+ }
101
+ return createToolResponse(formatted, context.toolGuidance);
102
+ }
103
+ /**
104
+ * Parse and validate search_by_concept arguments.
105
+ */
106
+ export function parseSearchByConceptArgs(args) {
107
+ const conceptId = isNumber(args?.conceptId) ? args.conceptId : -1;
108
+ if (conceptId < 0) {
109
+ throw new GlanceyError('conceptId is required and must be a non-negative number', 'validation', { tool: 'search_by_concept' });
110
+ }
111
+ return {
112
+ conceptId,
113
+ query: isString(args?.query) ? args.query : undefined,
114
+ limit: isNumber(args?.limit) ? args.limit : 10,
115
+ };
116
+ }
117
+ /**
118
+ * Format concept search results for display.
119
+ */
120
+ export function formatConceptSearchResults(results, conceptId) {
121
+ if (results.length === 0) {
122
+ return `No code found in concept cluster ${conceptId}. Try list_concepts to see available clusters.`;
123
+ }
124
+ return results
125
+ .map((r, i) => {
126
+ let header = `## Result ${i + 1}: ${r.filepath}:${r.startLine}-${r.endLine}`;
127
+ if (r.symbolName) {
128
+ const typeLabel = r.symbolType ? ` (${r.symbolType})` : '';
129
+ header += `\n**Symbol:** \`${r.symbolName}\`${typeLabel}`;
130
+ }
131
+ return `${header}\n\`\`\`${r.language}\n${r.content}\n\`\`\``;
132
+ })
133
+ .join('\n\n');
134
+ }
135
+ /**
136
+ * Handle search_by_concept tool.
137
+ */
138
+ export async function handleSearchByConcept(args, context) {
139
+ const results = await context.indexer.searchByConcept(args.conceptId, args.query, args.limit ?? 10);
140
+ const formatted = formatConceptSearchResults(results, args.conceptId);
141
+ // Track token savings (optional)
142
+ try {
143
+ dashboardState.getTokenTracker().recordSearchByConcept(formatted.length, results.length);
144
+ }
145
+ catch {
146
+ // Token tracking not available
147
+ }
148
+ return createToolResponse(formatted, context.toolGuidance);
149
+ }
150
+ //# sourceMappingURL=clustering-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clustering-handlers.js","sourceRoot":"","sources":["../../src/tools/clustering-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ /**
2
+ * Tool handlers for git commit operations.
3
+ */
4
+ import type { ToolResponse } from './types.js';
5
+ /**
6
+ * Commit rules reminder text.
7
+ */
8
+ export declare const COMMIT_RULES = "\n## Commit Rules Reminder\n\n1. **Branch**: Must be on a feature branch, not main/master\n2. **Message length**: Subject line must be \u226472 characters\n3. **Imperative mood**: \"Add feature\" not \"Added feature\"\n4. **Single responsibility**: One logical change per commit\n5. **Body format**: Only \"Co-Authored-By: Claude <noreply@anthropic.com>\"\n\n**Signs of multi-responsibility** (split into separate commits):\n- Message contains \"and\" connecting actions\n- Message lists multiple changes with commas\n- Changes span unrelated files/features\n";
9
+ /**
10
+ * Execute a git command safely using spawn with array arguments.
11
+ */
12
+ export declare function gitSpawn(args: string[], options: {
13
+ cwd: string;
14
+ stdin?: string;
15
+ }): Promise<{
16
+ stdout: string;
17
+ stderr: string;
18
+ }>;
19
+ /**
20
+ * Interface for git operations (for testability).
21
+ */
22
+ export interface IGitOperations {
23
+ getCurrentBranch(cwd: string): Promise<string>;
24
+ stageFiles(cwd: string, files: string[]): Promise<void>;
25
+ getStagedFiles(cwd: string): Promise<string[]>;
26
+ commit(cwd: string, message: string): Promise<string>;
27
+ unstageFiles(cwd: string, files: string[]): Promise<void>;
28
+ writeMarkerFile(projectPath: string): void;
29
+ }
30
+ /**
31
+ * Default git operations implementation.
32
+ */
33
+ export declare const defaultGitOperations: IGitOperations;
34
+ /**
35
+ * Context for commit tools.
36
+ */
37
+ export interface CommitToolContext {
38
+ projectPath: string;
39
+ /** Optional git operations (for testing). */
40
+ gitOperations?: IGitOperations;
41
+ }
42
+ /**
43
+ * Arguments for commit tool.
44
+ */
45
+ export interface CommitArgs {
46
+ message: string;
47
+ files?: string[];
48
+ }
49
+ /**
50
+ * Parse and validate commit arguments.
51
+ */
52
+ export declare function parseCommitArgs(args: Record<string, unknown> | undefined): CommitArgs;
53
+ /**
54
+ * Validation result for commit message.
55
+ */
56
+ export interface CommitValidationResult {
57
+ valid: boolean;
58
+ errors: string[];
59
+ warnings: string[];
60
+ }
61
+ /**
62
+ * Validate commit message and branch.
63
+ */
64
+ export declare function validateCommit(message: string, context: CommitToolContext): Promise<CommitValidationResult>;
65
+ /**
66
+ * Format validation errors for response.
67
+ */
68
+ export declare function formatValidationErrors(errors: string[], warnings: string[]): string;
69
+ /**
70
+ * Format successful commit response.
71
+ */
72
+ export declare function formatCommitSuccess(output: string, warnings: string[]): string;
73
+ /**
74
+ * Handle commit tool.
75
+ */
76
+ export declare function handleCommit(args: CommitArgs, context: CommitToolContext): Promise<ToolResponse>;
77
+ //# sourceMappingURL=commit-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-handlers.d.ts","sourceRoot":"","sources":["../../src/tools/commit-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C;;GAEG;AACH,eAAO,MAAM,YAAY,ojBAaxB,CAAC;AAEF;;GAEG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACvC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA0C7C;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/C,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACtD,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5C;AAED;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,cAiClC,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,6CAA6C;IAC7C,aAAa,CAAC,EAAE,cAAc,CAAC;CAChC;AASD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,UAAU,CASrF;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,sBAAsB,CAAC,CA4CjC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAOnF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,CAO9E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,YAAY,CAAC,CAuEvB"}
@@ -0,0 +1,251 @@
1
+ /**
2
+ * Tool handlers for git commit operations.
3
+ */
4
+ import { spawn } from 'child_process';
5
+ import { exec } from 'child_process';
6
+ import { promisify } from 'util';
7
+ import * as fs from 'fs';
8
+ import * as path from 'path';
9
+ import { isString, isStringArray } from '../utils/type-guards.js';
10
+ import { GlanceyError, wrapError } from '../utils/errors.js';
11
+ const execAsync = promisify(exec);
12
+ /**
13
+ * Commit rules reminder text.
14
+ */
15
+ export const COMMIT_RULES = `
16
+ ## Commit Rules Reminder
17
+
18
+ 1. **Branch**: Must be on a feature branch, not main/master
19
+ 2. **Message length**: Subject line must be ≤72 characters
20
+ 3. **Imperative mood**: "Add feature" not "Added feature"
21
+ 4. **Single responsibility**: One logical change per commit
22
+ 5. **Body format**: Only "Co-Authored-By: Claude <noreply@anthropic.com>"
23
+
24
+ **Signs of multi-responsibility** (split into separate commits):
25
+ - Message contains "and" connecting actions
26
+ - Message lists multiple changes with commas
27
+ - Changes span unrelated files/features
28
+ `;
29
+ /**
30
+ * Execute a git command safely using spawn with array arguments.
31
+ */
32
+ export function gitSpawn(args, options) {
33
+ return new Promise((resolve, reject) => {
34
+ const proc = spawn('git', args, {
35
+ cwd: options.cwd,
36
+ stdio: ['pipe', 'pipe', 'pipe'],
37
+ });
38
+ let stdout = '';
39
+ let stderr = '';
40
+ proc.stdout.on('data', (data) => {
41
+ stdout += data.toString();
42
+ });
43
+ proc.stderr.on('data', (data) => {
44
+ stderr += data.toString();
45
+ });
46
+ proc.on('error', (err) => {
47
+ reject(err);
48
+ });
49
+ proc.on('close', (code) => {
50
+ if (code === 0) {
51
+ resolve({ stdout, stderr });
52
+ }
53
+ else {
54
+ const exitCode = code ?? 1;
55
+ const error = new Error(`git ${args[0]} failed with code ${exitCode}: ${stderr}`);
56
+ error.code = exitCode;
57
+ error.stdout = stdout;
58
+ error.stderr = stderr;
59
+ reject(error);
60
+ }
61
+ });
62
+ if (options.stdin !== undefined) {
63
+ proc.stdin.write(options.stdin);
64
+ proc.stdin.end();
65
+ }
66
+ else {
67
+ proc.stdin.end();
68
+ }
69
+ });
70
+ }
71
+ /**
72
+ * Default git operations implementation.
73
+ */
74
+ export const defaultGitOperations = {
75
+ async getCurrentBranch(cwd) {
76
+ const { stdout } = await execAsync('git branch --show-current', { cwd });
77
+ return stdout.trim();
78
+ },
79
+ async stageFiles(cwd, files) {
80
+ await gitSpawn(['add', '--', ...files], { cwd });
81
+ },
82
+ async getStagedFiles(cwd) {
83
+ const { stdout } = await gitSpawn(['diff', '--cached', '--name-only'], { cwd });
84
+ return stdout.trim().split('\n').filter(Boolean);
85
+ },
86
+ async commit(cwd, message) {
87
+ const fullMessage = `${message}\n\nCo-Authored-By: Claude <noreply@anthropic.com>`;
88
+ const { stdout } = await gitSpawn(['commit', '-F', '-'], { cwd, stdin: fullMessage });
89
+ return stdout.trim();
90
+ },
91
+ async unstageFiles(cwd, files) {
92
+ await gitSpawn(['reset', 'HEAD', '--', ...files], { cwd });
93
+ },
94
+ writeMarkerFile(projectPath) {
95
+ const markerPath = path.join(projectPath, '.git', 'MCP_COMMIT_MARKER');
96
+ try {
97
+ fs.writeFileSync(markerPath, Date.now().toString());
98
+ }
99
+ catch {
100
+ // Ignore marker write failures - non-critical
101
+ }
102
+ },
103
+ };
104
+ /**
105
+ * Get git operations instance.
106
+ */
107
+ function getGitOperations(context) {
108
+ return context.gitOperations ?? defaultGitOperations;
109
+ }
110
+ /**
111
+ * Parse and validate commit arguments.
112
+ */
113
+ export function parseCommitArgs(args) {
114
+ const message = isString(args?.message) ? args.message : '';
115
+ const files = isStringArray(args?.files) ? args.files : [];
116
+ if (!message) {
117
+ throw new GlanceyError('message is required', 'validation', { tool: 'commit' });
118
+ }
119
+ return { message, files };
120
+ }
121
+ /**
122
+ * Validate commit message and branch.
123
+ */
124
+ export async function validateCommit(message, context) {
125
+ const git = getGitOperations(context);
126
+ const errors = [];
127
+ const warnings = [];
128
+ // Check 1: Not on main/master branch
129
+ try {
130
+ const currentBranch = await git.getCurrentBranch(context.projectPath);
131
+ if (currentBranch === 'main' || currentBranch === 'master') {
132
+ errors.push(`Cannot commit directly to ${currentBranch}. Create a feature branch first:\n git checkout -b feature/your-feature-name`);
133
+ }
134
+ }
135
+ catch {
136
+ errors.push('Failed to determine current branch. Are you in a git repository?');
137
+ }
138
+ // Check 2: Message length
139
+ const subjectLine = message.split('\n')[0];
140
+ if (subjectLine.length > 72) {
141
+ errors.push(`Subject line is ${subjectLine.length} characters (max 72). Shorten it.`);
142
+ }
143
+ // Check 3: Imperative mood (heuristic)
144
+ const pastTensePatterns = /^(Added|Fixed|Updated|Changed|Removed|Implemented|Created|Deleted|Modified|Refactored|Merged)\b/i;
145
+ if (pastTensePatterns.test(subjectLine)) {
146
+ warnings.push(`Subject may not be imperative mood. Use "Add" not "Added", "Fix" not "Fixed", etc.`);
147
+ }
148
+ // Check 4: Single responsibility (heuristic)
149
+ const multiResponsibilityPatterns = /\b(and|,)\s+(add|fix|update|change|remove|implement|create|delete|modify|refactor)\b/i;
150
+ if (multiResponsibilityPatterns.test(subjectLine)) {
151
+ errors.push(`Message suggests multiple responsibilities. Split into separate commits.`);
152
+ }
153
+ return {
154
+ valid: errors.length === 0,
155
+ errors,
156
+ warnings,
157
+ };
158
+ }
159
+ /**
160
+ * Format validation errors for response.
161
+ */
162
+ export function formatValidationErrors(errors, warnings) {
163
+ let text = `## Commit Blocked\n\n**Errors:**\n${errors.map((e) => `- ${e}`).join('\n')}`;
164
+ if (warnings.length > 0) {
165
+ text += `\n\n**Warnings:**\n${warnings.map((w) => `- ${w}`).join('\n')}`;
166
+ }
167
+ text += `\n${COMMIT_RULES}`;
168
+ return text;
169
+ }
170
+ /**
171
+ * Format successful commit response.
172
+ */
173
+ export function formatCommitSuccess(output, warnings) {
174
+ let response = `## Commit Successful\n\n${output}`;
175
+ if (warnings.length > 0) {
176
+ response += `\n\n**Warnings:**\n${warnings.map((w) => `- ${w}`).join('\n')}`;
177
+ }
178
+ response += `\n${COMMIT_RULES}`;
179
+ return response;
180
+ }
181
+ /**
182
+ * Handle commit tool.
183
+ */
184
+ export async function handleCommit(args, context) {
185
+ const git = getGitOperations(context);
186
+ // Validate commit message and branch
187
+ const validation = await validateCommit(args.message, context);
188
+ if (!validation.valid) {
189
+ return {
190
+ content: [
191
+ {
192
+ type: 'text',
193
+ text: formatValidationErrors(validation.errors, validation.warnings),
194
+ },
195
+ ],
196
+ isError: true,
197
+ };
198
+ }
199
+ // Track files we staged for potential rollback
200
+ const stagedByUs = [];
201
+ // Stage files if provided
202
+ if (args.files && args.files.length > 0) {
203
+ try {
204
+ await git.stageFiles(context.projectPath, args.files);
205
+ stagedByUs.push(...args.files);
206
+ }
207
+ catch (e) {
208
+ throw wrapError('Failed to stage files', 'git', e, { files: args.files });
209
+ }
210
+ }
211
+ // Check if there are staged changes
212
+ try {
213
+ const stagedFiles = await git.getStagedFiles(context.projectPath);
214
+ if (stagedFiles.length === 0) {
215
+ throw new GlanceyError('No staged changes to commit. Stage files first or pass files parameter.', 'git');
216
+ }
217
+ }
218
+ catch (e) {
219
+ if (e instanceof GlanceyError) {
220
+ throw e;
221
+ }
222
+ throw wrapError('Failed to check staged changes', 'git', e);
223
+ }
224
+ // Write marker file
225
+ git.writeMarkerFile(context.projectPath);
226
+ // Execute commit
227
+ try {
228
+ const output = await git.commit(context.projectPath, args.message);
229
+ return {
230
+ content: [
231
+ {
232
+ type: 'text',
233
+ text: formatCommitSuccess(output, validation.warnings),
234
+ },
235
+ ],
236
+ };
237
+ }
238
+ catch (e) {
239
+ // Rollback: unstage files we staged if commit failed
240
+ if (stagedByUs.length > 0) {
241
+ try {
242
+ await git.unstageFiles(context.projectPath, stagedByUs);
243
+ }
244
+ catch {
245
+ // Ignore rollback failures - best effort
246
+ }
247
+ }
248
+ throw wrapError('Git commit failed', 'git', e, { message: args.message });
249
+ }
250
+ }
251
+ //# sourceMappingURL=commit-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-handlers.js","sourceRoot":"","sources":["../../src/tools/commit-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Tool handlers for index operations.
3
+ */
4
+ import type { IndexProgress } from '../search/indexer.js';
5
+ import type { ToolContext, ToolResponse } from './types.js';
6
+ /**
7
+ * Arguments for index_codebase tool.
8
+ */
9
+ export interface IndexCodebaseArgs {
10
+ patterns?: string[];
11
+ excludePatterns?: string[];
12
+ forceReindex?: boolean;
13
+ autoRepair?: boolean;
14
+ }
15
+ /**
16
+ * Parse and validate index_codebase arguments.
17
+ */
18
+ export declare function parseIndexCodebaseArgs(args: Record<string, unknown> | undefined): IndexCodebaseArgs;
19
+ /**
20
+ * Handle index_codebase tool.
21
+ */
22
+ export declare function handleIndexCodebase(args: IndexCodebaseArgs, context: ToolContext, onProgress?: (progress: IndexProgress) => void): Promise<ToolResponse>;
23
+ /**
24
+ * Handle get_index_status tool.
25
+ */
26
+ export declare function handleGetIndexStatus(context: ToolContext): Promise<ToolResponse>;
27
+ /**
28
+ * Handle clear_index tool.
29
+ */
30
+ export declare function handleClearIndex(context: ToolContext): Promise<ToolResponse>;
31
+ //# sourceMappingURL=index-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-handlers.d.ts","sourceRoot":"","sources":["../../src/tools/index-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI5D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACxC,iBAAiB,CAOnB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,iBAAiB,EACvB,OAAO,EAAE,WAAW,EACpB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,KAAK,IAAI,GAC7C,OAAO,CAAC,YAAY,CAAC,CAmBvB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAetF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAGlF"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Tool handlers for index operations.
3
+ */
4
+ import { createToolResponse } from './types.js';
5
+ import { isStringArray, isBoolean } from '../utils/type-guards.js';
6
+ /**
7
+ * Parse and validate index_codebase arguments.
8
+ */
9
+ export function parseIndexCodebaseArgs(args) {
10
+ return {
11
+ patterns: isStringArray(args?.patterns) ? args.patterns : undefined,
12
+ excludePatterns: isStringArray(args?.excludePatterns) ? args.excludePatterns : undefined,
13
+ forceReindex: isBoolean(args?.forceReindex) ? args.forceReindex : false,
14
+ autoRepair: isBoolean(args?.autoRepair) ? args.autoRepair : false,
15
+ };
16
+ }
17
+ /**
18
+ * Handle index_codebase tool.
19
+ */
20
+ export async function handleIndexCodebase(args, context, onProgress) {
21
+ const result = await context.indexer.indexCodebase(args.patterns, args.excludePatterns, args.forceReindex ?? false, onProgress, args.autoRepair ?? false);
22
+ const mode = result.repaired
23
+ ? 'Repaired (corruption detected)'
24
+ : result.incremental
25
+ ? 'Incremental update'
26
+ : 'Full reindex';
27
+ return createToolResponse(`${mode}: Indexed ${result.filesIndexed} files, total ${result.chunksCreated} chunks.`, context.toolGuidance);
28
+ }
29
+ /**
30
+ * Handle get_index_status tool.
31
+ */
32
+ export async function handleGetIndexStatus(context) {
33
+ const status = await context.indexer.getStatus();
34
+ let statusText = JSON.stringify(status, null, 2);
35
+ if (status.corrupted) {
36
+ statusText =
37
+ `**WARNING: Index corruption detected!**\n` +
38
+ `Reason: ${status.corruptionReason}\n` +
39
+ `\nTo repair, either:\n` +
40
+ `1. Run \`index_codebase\` with \`autoRepair: true\`\n` +
41
+ `2. Run \`clear_index\` followed by \`index_codebase\`\n\n` +
42
+ statusText;
43
+ }
44
+ return createToolResponse(statusText, context.toolGuidance);
45
+ }
46
+ /**
47
+ * Handle clear_index tool.
48
+ */
49
+ export async function handleClearIndex(context) {
50
+ await context.indexer.clearIndex();
51
+ return createToolResponse('Index cleared.', context.toolGuidance);
52
+ }
53
+ //# sourceMappingURL=index-handlers.js.map