claude-code-workflow 6.3.18 → 6.3.19

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 (822) hide show
  1. package/.claude/CLAUDE.md +8 -5
  2. package/.claude/agents/action-planning-agent.md +26 -2
  3. package/.claude/agents/code-developer.md +132 -43
  4. package/.claude/agents/debug-explore-agent.md +434 -0
  5. package/.claude/agents/test-fix-agent.md +14 -0
  6. package/.claude/commands/issue/discover.md +41 -0
  7. package/.claude/commands/issue/execute.md +200 -19
  8. package/.claude/commands/issue/new.md +1 -1
  9. package/.claude/commands/issue/plan.md +6 -1
  10. package/.claude/commands/issue/queue.md +94 -39
  11. package/.claude/commands/memory/swagger-docs.md +773 -0
  12. package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
  13. package/.claude/commands/workflow/execute.md +54 -34
  14. package/.claude/commands/workflow/lite-execute.md +48 -164
  15. package/.claude/commands/workflow/lite-fix.md +4 -4
  16. package/.claude/commands/workflow/lite-plan.md +5 -5
  17. package/.claude/commands/workflow/plan.md +27 -27
  18. package/.claude/commands/workflow/review.md +42 -17
  19. package/.claude/commands/workflow/tdd-plan.md +25 -25
  20. package/.claude/commands/workflow/test-fix-gen.md +10 -10
  21. package/.claude/commands/workflow/test-gen.md +14 -14
  22. package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
  23. package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
  24. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
  25. package/.claude/skills/ccw/SKILL.md +462 -0
  26. package/.claude/skills/ccw/index/command-capabilities.json +127 -0
  27. package/.claude/skills/ccw/index/intent-rules.json +136 -0
  28. package/.claude/skills/ccw/index/workflow-chains.json +451 -0
  29. package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
  30. package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
  31. package/.claude/skills/ccw/phases/actions/docs.md +93 -0
  32. package/.claude/skills/ccw/phases/actions/full.md +154 -0
  33. package/.claude/skills/ccw/phases/actions/issue.md +201 -0
  34. package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
  35. package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
  36. package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
  37. package/.claude/skills/ccw/phases/actions/ui.md +79 -0
  38. package/.claude/skills/ccw/phases/orchestrator.md +435 -0
  39. package/.claude/skills/ccw/specs/intent-classification.md +336 -0
  40. package/.claude/skills/ccw-help/SKILL.md +177 -0
  41. package/.claude/skills/ccw-help/index/all-agents.json +82 -0
  42. package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
  43. package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
  44. package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
  45. package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
  46. package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
  47. package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
  48. package/.claude/skills/code-reviewer/README.md +340 -0
  49. package/.claude/skills/code-reviewer/SKILL.md +308 -0
  50. package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
  51. package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
  52. package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
  53. package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
  54. package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
  55. package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
  56. package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
  57. package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
  58. package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
  59. package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
  60. package/.claude/skills/skill-generator/SKILL.md +187 -0
  61. package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
  62. package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
  63. package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
  64. package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
  65. package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
  66. package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
  67. package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
  68. package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
  69. package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
  70. package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
  71. package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
  72. package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
  73. package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
  74. package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
  75. package/.claude/skills/skill-generator/templates/script-python.md +198 -0
  76. package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
  77. package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
  78. package/.claude/workflows/chinese-response.md +15 -28
  79. package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
  80. package/.claude/workflows/cli-tools-usage.md +221 -177
  81. package/.claude/workflows/windows-platform.md +13 -10
  82. package/.codex/prompts/issue-execute.md +305 -82
  83. package/.codex/prompts/issue-queue.md +22 -0
  84. package/.codex/prompts/lite-execute.md +36 -11
  85. package/README.md +309 -305
  86. package/ccw/README.md +10 -4
  87. package/ccw/dist/cli.d.ts.map +1 -1
  88. package/ccw/dist/cli.js +4 -1
  89. package/ccw/dist/cli.js.map +1 -1
  90. package/ccw/dist/commands/cli.d.ts.map +1 -1
  91. package/ccw/dist/commands/cli.js +131 -34
  92. package/ccw/dist/commands/cli.js.map +1 -1
  93. package/ccw/dist/commands/issue.d.ts +152 -0
  94. package/ccw/dist/commands/issue.d.ts.map +1 -1
  95. package/ccw/dist/commands/issue.js +550 -85
  96. package/ccw/dist/commands/issue.js.map +1 -1
  97. package/ccw/dist/commands/serve.d.ts +1 -0
  98. package/ccw/dist/commands/serve.d.ts.map +1 -1
  99. package/ccw/dist/commands/serve.js +12 -5
  100. package/ccw/dist/commands/serve.js.map +1 -1
  101. package/ccw/dist/commands/stop.d.ts.map +1 -1
  102. package/ccw/dist/commands/stop.js +29 -5
  103. package/ccw/dist/commands/stop.js.map +1 -1
  104. package/ccw/dist/commands/tool.d.ts.map +1 -1
  105. package/ccw/dist/commands/tool.js +19 -2
  106. package/ccw/dist/commands/tool.js.map +1 -1
  107. package/ccw/dist/commands/view.d.ts +1 -0
  108. package/ccw/dist/commands/view.d.ts.map +1 -1
  109. package/ccw/dist/commands/view.js +10 -3
  110. package/ccw/dist/commands/view.js.map +1 -1
  111. package/ccw/dist/config/cli-settings-manager.d.ts +86 -0
  112. package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -0
  113. package/ccw/dist/config/cli-settings-manager.js +392 -0
  114. package/ccw/dist/config/cli-settings-manager.js.map +1 -0
  115. package/ccw/dist/config/litellm-api-config-manager.d.ts +71 -5
  116. package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
  117. package/ccw/dist/config/litellm-api-config-manager.js +290 -20
  118. package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
  119. package/ccw/dist/core/auth/csrf-manager.d.ts +18 -0
  120. package/ccw/dist/core/auth/csrf-manager.d.ts.map +1 -0
  121. package/ccw/dist/core/auth/csrf-manager.js +80 -0
  122. package/ccw/dist/core/auth/csrf-manager.js.map +1 -0
  123. package/ccw/dist/core/auth/csrf-middleware.d.ts +8 -0
  124. package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -0
  125. package/ccw/dist/core/auth/csrf-middleware.js +141 -0
  126. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -0
  127. package/ccw/dist/core/auth/middleware.d.ts +15 -0
  128. package/ccw/dist/core/auth/middleware.d.ts.map +1 -0
  129. package/ccw/dist/core/auth/middleware.js +76 -0
  130. package/ccw/dist/core/auth/middleware.js.map +1 -0
  131. package/ccw/dist/core/auth/token-manager.d.ts +41 -0
  132. package/ccw/dist/core/auth/token-manager.d.ts.map +1 -0
  133. package/ccw/dist/core/auth/token-manager.js +171 -0
  134. package/ccw/dist/core/auth/token-manager.js.map +1 -0
  135. package/ccw/dist/core/cache-manager.d.ts +6 -6
  136. package/ccw/dist/core/cache-manager.d.ts.map +1 -1
  137. package/ccw/dist/core/cache-manager.js +70 -48
  138. package/ccw/dist/core/cache-manager.js.map +1 -1
  139. package/ccw/dist/core/claude-freshness.d.ts.map +1 -1
  140. package/ccw/dist/core/claude-freshness.js +23 -3
  141. package/ccw/dist/core/claude-freshness.js.map +1 -1
  142. package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
  143. package/ccw/dist/core/core-memory-store.js +2 -1
  144. package/ccw/dist/core/core-memory-store.js.map +1 -1
  145. package/ccw/dist/core/cors.d.ts +3 -0
  146. package/ccw/dist/core/cors.d.ts.map +1 -0
  147. package/ccw/dist/core/cors.js +10 -0
  148. package/ccw/dist/core/cors.js.map +1 -0
  149. package/ccw/dist/core/dashboard-generator-patch.js +0 -1
  150. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
  151. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  152. package/ccw/dist/core/dashboard-generator.js +417 -416
  153. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  154. package/ccw/dist/core/data-aggregator.js +2 -2
  155. package/ccw/dist/core/data-aggregator.js.map +1 -1
  156. package/ccw/dist/core/lite-scanner.d.ts +1 -1
  157. package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
  158. package/ccw/dist/core/lite-scanner.js +130 -127
  159. package/ccw/dist/core/lite-scanner.js.map +1 -1
  160. package/ccw/dist/core/routes/auth-routes.d.ts +12 -0
  161. package/ccw/dist/core/routes/auth-routes.d.ts.map +1 -0
  162. package/ccw/dist/core/routes/auth-routes.js +80 -0
  163. package/ccw/dist/core/routes/auth-routes.js.map +1 -0
  164. package/ccw/dist/core/routes/ccw-routes.d.ts +1 -14
  165. package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
  166. package/ccw/dist/core/routes/ccw-routes.js +9 -4
  167. package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
  168. package/ccw/dist/core/routes/claude-routes.d.ts +1 -14
  169. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  170. package/ccw/dist/core/routes/claude-routes.js +98 -39
  171. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  172. package/ccw/dist/core/routes/cli-routes.d.ts +14 -12
  173. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  174. package/ccw/dist/core/routes/cli-routes.js +122 -43
  175. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  176. package/ccw/dist/core/routes/cli-settings-routes.d.ts +11 -0
  177. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -0
  178. package/ccw/dist/core/routes/cli-settings-routes.js +204 -0
  179. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -0
  180. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts +6 -0
  181. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -0
  182. package/ccw/dist/core/routes/codexlens/config-handlers.js +1195 -0
  183. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -0
  184. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts +10 -0
  185. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -0
  186. package/ccw/dist/core/routes/codexlens/index-handlers.js +322 -0
  187. package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -0
  188. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts +6 -0
  189. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -0
  190. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +865 -0
  191. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -0
  192. package/ccw/dist/core/routes/codexlens/utils.d.ts +23 -0
  193. package/ccw/dist/core/routes/codexlens/utils.d.ts.map +1 -0
  194. package/ccw/dist/core/routes/codexlens/utils.js +85 -0
  195. package/ccw/dist/core/routes/codexlens/utils.js.map +1 -0
  196. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts +13 -0
  197. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts.map +1 -0
  198. package/ccw/dist/core/routes/codexlens/watcher-handlers.js +235 -0
  199. package/ccw/dist/core/routes/codexlens/watcher-handlers.js.map +1 -0
  200. package/ccw/dist/core/routes/codexlens-routes.d.ts +2 -11
  201. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  202. package/ccw/dist/core/routes/codexlens-routes.js +10 -981
  203. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  204. package/ccw/dist/core/routes/discovery-routes.d.ts +1 -35
  205. package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -1
  206. package/ccw/dist/core/routes/discovery-routes.js +25 -0
  207. package/ccw/dist/core/routes/discovery-routes.js.map +1 -1
  208. package/ccw/dist/core/routes/files-routes.d.ts +1 -14
  209. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  210. package/ccw/dist/core/routes/files-routes.js +57 -14
  211. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  212. package/ccw/dist/core/routes/graph-routes.d.ts +1 -14
  213. package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
  214. package/ccw/dist/core/routes/graph-routes.js +36 -37
  215. package/ccw/dist/core/routes/graph-routes.js.map +1 -1
  216. package/ccw/dist/core/routes/help-routes.d.ts +1 -14
  217. package/ccw/dist/core/routes/help-routes.d.ts.map +1 -1
  218. package/ccw/dist/core/routes/help-routes.js +5 -0
  219. package/ccw/dist/core/routes/help-routes.js.map +1 -1
  220. package/ccw/dist/core/routes/hooks-routes.d.ts +4 -14
  221. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  222. package/ccw/dist/core/routes/hooks-routes.js +43 -21
  223. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  224. package/ccw/dist/core/routes/issue-routes.d.ts +1 -34
  225. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
  226. package/ccw/dist/core/routes/issue-routes.js +24 -0
  227. package/ccw/dist/core/routes/issue-routes.js.map +1 -1
  228. package/ccw/dist/core/routes/litellm-api-routes.d.ts +1 -14
  229. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
  230. package/ccw/dist/core/routes/litellm-api-routes.js +505 -48
  231. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
  232. package/ccw/dist/core/routes/litellm-routes.d.ts +1 -14
  233. package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -1
  234. package/ccw/dist/core/routes/litellm-routes.js +28 -11
  235. package/ccw/dist/core/routes/litellm-routes.js.map +1 -1
  236. package/ccw/dist/core/routes/mcp-routes.d.ts +1 -14
  237. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
  238. package/ccw/dist/core/routes/mcp-routes.js +99 -30
  239. package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
  240. package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
  241. package/ccw/dist/core/routes/mcp-templates-db.js +30 -31
  242. package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
  243. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  244. package/ccw/dist/core/routes/memory-routes.js +74 -24
  245. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  246. package/ccw/dist/core/routes/nav-status-routes.d.ts +3 -0
  247. package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -0
  248. package/ccw/dist/core/routes/nav-status-routes.js +217 -0
  249. package/ccw/dist/core/routes/nav-status-routes.js.map +1 -0
  250. package/ccw/dist/core/routes/rules-routes.d.ts +1 -14
  251. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
  252. package/ccw/dist/core/routes/rules-routes.js +481 -58
  253. package/ccw/dist/core/routes/rules-routes.js.map +1 -1
  254. package/ccw/dist/core/routes/session-routes.d.ts +1 -14
  255. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
  256. package/ccw/dist/core/routes/session-routes.js +15 -3
  257. package/ccw/dist/core/routes/session-routes.js.map +1 -1
  258. package/ccw/dist/core/routes/skills-routes.d.ts +1 -14
  259. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  260. package/ccw/dist/core/routes/skills-routes.js +394 -112
  261. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  262. package/ccw/dist/core/routes/status-routes.d.ts +1 -14
  263. package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
  264. package/ccw/dist/core/routes/status-routes.js +4 -0
  265. package/ccw/dist/core/routes/status-routes.js.map +1 -1
  266. package/ccw/dist/core/routes/system-routes.d.ts +4 -10
  267. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  268. package/ccw/dist/core/routes/system-routes.js +6 -4
  269. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  270. package/ccw/dist/core/routes/types.d.ts +19 -0
  271. package/ccw/dist/core/routes/types.d.ts.map +1 -0
  272. package/ccw/dist/core/routes/types.js +2 -0
  273. package/ccw/dist/core/routes/types.js.map +1 -0
  274. package/ccw/dist/core/server.d.ts.map +1 -1
  275. package/ccw/dist/core/server.js +201 -29
  276. package/ccw/dist/core/server.js.map +1 -1
  277. package/ccw/dist/core/services/api-key-tester.d.ts +31 -0
  278. package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
  279. package/ccw/dist/core/services/api-key-tester.js +106 -0
  280. package/ccw/dist/core/services/api-key-tester.js.map +1 -0
  281. package/ccw/dist/core/services/health-check-service.d.ts +82 -0
  282. package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
  283. package/ccw/dist/core/services/health-check-service.js +271 -0
  284. package/ccw/dist/core/services/health-check-service.js.map +1 -0
  285. package/ccw/dist/core/websocket.d.ts +9 -7
  286. package/ccw/dist/core/websocket.d.ts.map +1 -1
  287. package/ccw/dist/core/websocket.js +9 -4
  288. package/ccw/dist/core/websocket.js.map +1 -1
  289. package/ccw/dist/tools/claude-cli-tools.d.ts +152 -28
  290. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  291. package/ccw/dist/tools/claude-cli-tools.js +490 -100
  292. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  293. package/ccw/dist/tools/cli-config-manager.d.ts +24 -8
  294. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
  295. package/ccw/dist/tools/cli-config-manager.js +76 -156
  296. package/ccw/dist/tools/cli-config-manager.js.map +1 -1
  297. package/ccw/dist/tools/cli-executor-core.d.ts +85 -0
  298. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -0
  299. package/ccw/dist/tools/cli-executor-core.js +1310 -0
  300. package/ccw/dist/tools/cli-executor-core.js.map +1 -0
  301. package/ccw/dist/tools/cli-executor-state.d.ts +241 -0
  302. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -0
  303. package/ccw/dist/tools/cli-executor-state.js +392 -0
  304. package/ccw/dist/tools/cli-executor-state.js.map +1 -0
  305. package/ccw/dist/tools/cli-executor-utils.d.ts +36 -0
  306. package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -0
  307. package/ccw/dist/tools/cli-executor-utils.js +298 -0
  308. package/ccw/dist/tools/cli-executor-utils.js.map +1 -0
  309. package/ccw/dist/tools/cli-executor.d.ts +3 -377
  310. package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
  311. package/ccw/dist/tools/cli-executor.js +3 -1884
  312. package/ccw/dist/tools/cli-executor.js.map +1 -1
  313. package/ccw/dist/tools/cli-history-store.d.ts +2 -0
  314. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  315. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  316. package/ccw/dist/tools/cli-output-converter.d.ts +192 -0
  317. package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -0
  318. package/ccw/dist/tools/cli-output-converter.js +1047 -0
  319. package/ccw/dist/tools/cli-output-converter.js.map +1 -0
  320. package/ccw/dist/tools/cli-prompt-builder.d.ts +113 -0
  321. package/ccw/dist/tools/cli-prompt-builder.d.ts.map +1 -0
  322. package/ccw/dist/tools/cli-prompt-builder.js +363 -0
  323. package/ccw/dist/tools/cli-prompt-builder.js.map +1 -0
  324. package/ccw/dist/tools/codex-lens.d.ts +15 -1
  325. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  326. package/ccw/dist/tools/codex-lens.js +289 -55
  327. package/ccw/dist/tools/codex-lens.js.map +1 -1
  328. package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -1
  329. package/ccw/dist/tools/detect-changed-modules.js +22 -4
  330. package/ccw/dist/tools/detect-changed-modules.js.map +1 -1
  331. package/ccw/dist/tools/index.d.ts.map +1 -1
  332. package/ccw/dist/tools/index.js +2 -0
  333. package/ccw/dist/tools/index.js.map +1 -1
  334. package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
  335. package/ccw/dist/tools/litellm-client.js +10 -4
  336. package/ccw/dist/tools/litellm-client.js.map +1 -1
  337. package/ccw/dist/tools/litellm-executor.d.ts +2 -4
  338. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
  339. package/ccw/dist/tools/litellm-executor.js +39 -8
  340. package/ccw/dist/tools/litellm-executor.js.map +1 -1
  341. package/ccw/dist/tools/native-session-discovery.d.ts +2 -0
  342. package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
  343. package/ccw/dist/tools/native-session-discovery.js +197 -1
  344. package/ccw/dist/tools/native-session-discovery.js.map +1 -1
  345. package/ccw/dist/tools/session-manager.d.ts.map +1 -1
  346. package/ccw/dist/tools/session-manager.js +79 -0
  347. package/ccw/dist/tools/session-manager.js.map +1 -1
  348. package/ccw/dist/tools/skill-context-loader.d.ts +15 -0
  349. package/ccw/dist/tools/skill-context-loader.d.ts.map +1 -0
  350. package/ccw/dist/tools/skill-context-loader.js +198 -0
  351. package/ccw/dist/tools/skill-context-loader.js.map +1 -0
  352. package/ccw/dist/tools/smart-search.d.ts +8 -3
  353. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  354. package/ccw/dist/tools/smart-search.js +378 -75
  355. package/ccw/dist/tools/smart-search.js.map +1 -1
  356. package/ccw/dist/types/cli-settings.d.ts +86 -0
  357. package/ccw/dist/types/cli-settings.d.ts.map +1 -0
  358. package/ccw/dist/types/cli-settings.js +54 -0
  359. package/ccw/dist/types/cli-settings.js.map +1 -0
  360. package/ccw/dist/types/litellm-api-config.d.ts +40 -1
  361. package/ccw/dist/types/litellm-api-config.d.ts.map +1 -1
  362. package/ccw/dist/utils/exec-constants.d.ts +25 -0
  363. package/ccw/dist/utils/exec-constants.d.ts.map +1 -0
  364. package/ccw/dist/utils/exec-constants.js +25 -0
  365. package/ccw/dist/utils/exec-constants.js.map +1 -0
  366. package/ccw/dist/utils/path-resolver.d.ts +1 -0
  367. package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
  368. package/ccw/dist/utils/path-resolver.js +48 -3
  369. package/ccw/dist/utils/path-resolver.js.map +1 -1
  370. package/ccw/dist/utils/path-validator.d.ts.map +1 -1
  371. package/ccw/dist/utils/path-validator.js +25 -6
  372. package/ccw/dist/utils/path-validator.js.map +1 -1
  373. package/ccw/dist/utils/python-utils.d.ts.map +1 -1
  374. package/ccw/dist/utils/python-utils.js +27 -7
  375. package/ccw/dist/utils/python-utils.js.map +1 -1
  376. package/ccw/dist/utils/shell-escape.d.ts +8 -0
  377. package/ccw/dist/utils/shell-escape.d.ts.map +1 -0
  378. package/ccw/dist/utils/shell-escape.js +24 -0
  379. package/ccw/dist/utils/shell-escape.js.map +1 -0
  380. package/ccw/dist/utils/uv-manager.d.ts +167 -0
  381. package/ccw/dist/utils/uv-manager.d.ts.map +1 -0
  382. package/ccw/dist/utils/uv-manager.js +644 -0
  383. package/ccw/dist/utils/uv-manager.js.map +1 -0
  384. package/ccw/src/cli.ts +4 -1
  385. package/ccw/src/commands/cli.ts +132 -34
  386. package/ccw/src/commands/issue.ts +605 -91
  387. package/ccw/src/commands/serve.ts +15 -5
  388. package/ccw/src/commands/stop.ts +32 -5
  389. package/ccw/src/commands/tool.ts +17 -2
  390. package/ccw/src/commands/view.ts +13 -3
  391. package/ccw/src/config/cli-settings-manager.ts +460 -0
  392. package/ccw/src/config/litellm-api-config-manager.ts +392 -57
  393. package/ccw/src/core/auth/csrf-manager.ts +104 -0
  394. package/ccw/src/core/auth/csrf-middleware.ts +159 -0
  395. package/ccw/src/core/auth/middleware.ts +94 -0
  396. package/ccw/src/core/auth/token-manager.ts +219 -0
  397. package/ccw/src/core/cache-manager.ts +64 -52
  398. package/ccw/src/core/claude-freshness.ts +26 -6
  399. package/ccw/src/core/core-memory-store.ts +2 -1
  400. package/ccw/src/core/cors.ts +10 -0
  401. package/ccw/src/core/dashboard-generator-patch.ts +47 -48
  402. package/ccw/src/core/dashboard-generator.ts +797 -744
  403. package/ccw/src/core/data-aggregator.ts +667 -667
  404. package/ccw/src/core/lite-scanner.ts +156 -140
  405. package/ccw/src/core/routes/auth-routes.ts +98 -0
  406. package/ccw/src/core/routes/ccw-routes.ts +10 -20
  407. package/ccw/src/core/routes/claude-routes.ts +101 -51
  408. package/ccw/src/core/routes/cli-routes.ts +152 -55
  409. package/ccw/src/core/routes/cli-settings-routes.ts +232 -0
  410. package/ccw/src/core/routes/codexlens/README.md +37 -0
  411. package/ccw/src/core/routes/codexlens/config-handlers.ts +1269 -0
  412. package/ccw/src/core/routes/codexlens/index-handlers.ts +354 -0
  413. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +931 -0
  414. package/ccw/src/core/routes/codexlens/utils.ts +96 -0
  415. package/ccw/src/core/routes/codexlens/watcher-handlers.ts +265 -0
  416. package/ccw/src/core/routes/codexlens-routes.ts +11 -1044
  417. package/ccw/src/core/routes/discovery-routes.ts +1 -12
  418. package/ccw/src/core/routes/files-routes.ts +112 -40
  419. package/ccw/src/core/routes/graph-routes.ts +39 -46
  420. package/ccw/src/core/routes/help-routes.ts +2 -12
  421. package/ccw/src/core/routes/hooks-routes.ts +83 -44
  422. package/ccw/src/core/routes/issue-routes.ts +1 -12
  423. package/ccw/src/core/routes/litellm-api-routes.ts +566 -60
  424. package/ccw/src/core/routes/litellm-routes.ts +35 -27
  425. package/ccw/src/core/routes/mcp-routes.ts +157 -60
  426. package/ccw/src/core/routes/mcp-routes.ts.backup +549 -550
  427. package/ccw/src/core/routes/mcp-templates-db.ts +267 -268
  428. package/ccw/src/core/routes/memory-routes.ts +76 -22
  429. package/ccw/src/core/routes/nav-status-routes.ts +231 -0
  430. package/ccw/src/core/routes/rules-routes.ts +600 -81
  431. package/ccw/src/core/routes/session-routes.ts +28 -22
  432. package/ccw/src/core/routes/skills-routes.ts +452 -132
  433. package/ccw/src/core/routes/status-routes.ts +1 -12
  434. package/ccw/src/core/routes/system-routes.ts +15 -22
  435. package/ccw/src/core/routes/types.ts +25 -0
  436. package/ccw/src/core/server.ts +651 -468
  437. package/ccw/src/core/services/api-key-tester.ts +137 -0
  438. package/ccw/src/core/services/health-check-service.ts +340 -0
  439. package/ccw/src/core/websocket.ts +20 -12
  440. package/ccw/src/templates/dashboard-css/01-base.css +109 -0
  441. package/ccw/src/templates/dashboard-css/10-cli-status.css +202 -0
  442. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +308 -0
  443. package/ccw/src/templates/dashboard-css/30-core-memory.css +20 -0
  444. package/ccw/src/templates/dashboard-css/31-api-settings.css +751 -14
  445. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +230 -2
  446. package/ccw/src/templates/dashboard-js/api.js +5 -0
  447. package/ccw/src/templates/dashboard-js/components/cli-status.js +279 -107
  448. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +262 -20
  449. package/ccw/src/templates/dashboard-js/components/hook-manager.js +105 -5
  450. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +317 -0
  451. package/ccw/src/templates/dashboard-js/components/navigation.js +45 -0
  452. package/ccw/src/templates/dashboard-js/components/notifications.js +128 -0
  453. package/ccw/src/templates/dashboard-js/i18n.js +4438 -3983
  454. package/ccw/src/templates/dashboard-js/main.js +71 -0
  455. package/ccw/src/templates/dashboard-js/services.js +289 -0
  456. package/ccw/src/templates/dashboard-js/views/api-settings.js +5613 -3361
  457. package/ccw/src/templates/dashboard-js/views/claude-manager.js +1 -7
  458. package/ccw/src/templates/dashboard-js/views/cli-manager.js +581 -87
  459. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +6091 -1965
  460. package/ccw/src/templates/dashboard-js/views/core-memory.js +129 -20
  461. package/ccw/src/templates/dashboard-js/views/hook-manager.js +17 -3
  462. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +63 -0
  463. package/ccw/src/templates/dashboard-js/views/project-overview.js +182 -37
  464. package/ccw/src/templates/dashboard-js/views/rules-manager.js +26 -3
  465. package/ccw/src/templates/dashboard-js/views/skills-manager.js +2 -42
  466. package/ccw/src/templates/dashboard.html +6 -0
  467. package/ccw/src/tools/README.md +29 -0
  468. package/ccw/src/tools/claude-cli-tools.ts +640 -125
  469. package/ccw/src/tools/cli-config-manager.ts +102 -172
  470. package/ccw/src/tools/cli-executor-core.ts +1533 -0
  471. package/ccw/src/tools/cli-executor-state.ts +560 -0
  472. package/ccw/src/tools/cli-executor-utils.ts +349 -0
  473. package/ccw/src/tools/cli-executor.ts +3 -2309
  474. package/ccw/src/tools/cli-history-store.ts +2 -0
  475. package/ccw/src/tools/cli-output-converter.ts +1237 -0
  476. package/ccw/src/tools/cli-prompt-builder.ts +487 -0
  477. package/ccw/src/tools/codex-lens.ts +324 -59
  478. package/ccw/src/tools/detect-changed-modules.ts +24 -6
  479. package/ccw/src/tools/index.ts +2 -0
  480. package/ccw/src/tools/litellm-client.ts +10 -4
  481. package/ccw/src/tools/litellm-executor.ts +146 -114
  482. package/ccw/src/tools/native-session-discovery.ts +209 -1
  483. package/ccw/src/tools/session-manager.ts +88 -0
  484. package/ccw/src/tools/skill-context-loader.ts +213 -0
  485. package/ccw/src/tools/smart-search.ts +427 -76
  486. package/ccw/src/types/cli-settings.ts +137 -0
  487. package/ccw/src/types/litellm-api-config.ts +55 -1
  488. package/ccw/src/utils/exec-constants.ts +24 -0
  489. package/ccw/src/utils/path-resolver.ts +49 -3
  490. package/ccw/src/utils/path-validator.ts +28 -6
  491. package/ccw/src/utils/python-utils.ts +140 -121
  492. package/ccw/src/utils/shell-escape.ts +30 -0
  493. package/ccw/src/utils/uv-manager.ts +796 -0
  494. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
  495. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
  496. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
  497. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
  498. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  499. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  500. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  501. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
  502. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
  503. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
  504. package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +270 -251
  505. package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +33 -0
  506. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
  507. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
  508. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
  509. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
  510. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
  511. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
  512. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
  513. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
  514. package/ccw-litellm/src/ccw_litellm/config/loader.py +343 -316
  515. package/ccw-litellm/src/ccw_litellm/config/models.py +162 -130
  516. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
  517. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
  518. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
  519. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
  520. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
  521. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
  522. package/codex-lens/pyproject.toml +43 -0
  523. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
  524. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
  525. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
  526. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
  527. package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
  528. package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
  529. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  530. package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
  531. package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
  532. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  533. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
  534. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
  535. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
  536. package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
  537. package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
  538. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
  539. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  540. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
  541. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.pyc +0 -0
  542. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  543. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-310.pyc +0 -0
  544. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.pyc +0 -0
  545. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  546. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-310.pyc +0 -0
  547. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.pyc +0 -0
  548. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  549. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-310.pyc +0 -0
  550. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
  551. package/codex-lens/src/codexlens/cli/commands.py +4416 -2295
  552. package/codex-lens/src/codexlens/cli/embedding_manager.py +767 -14
  553. package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
  554. package/codex-lens/src/codexlens/config.py +321 -12
  555. package/codex-lens/src/codexlens/entities.py +4 -1
  556. package/codex-lens/src/codexlens/env_config.py +298 -0
  557. package/codex-lens/src/codexlens/indexing/__init__.py +23 -1
  558. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  559. package/codex-lens/src/codexlens/indexing/__pycache__/embedding.cpython-313.pyc +0 -0
  560. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  561. package/codex-lens/src/codexlens/indexing/embedding.py +582 -0
  562. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +62 -28
  563. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
  564. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
  565. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
  566. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.pyc +0 -0
  567. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  568. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-310.pyc +0 -0
  569. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
  570. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
  571. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
  572. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  573. package/codex-lens/src/codexlens/parsers/factory.py +139 -10
  574. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +487 -13
  575. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
  576. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
  577. package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
  578. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
  579. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.pyc +0 -0
  580. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  581. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  582. package/codex-lens/src/codexlens/search/__pycache__/graph_expander.cpython-313.pyc +0 -0
  583. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
  584. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
  585. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  586. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
  587. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
  588. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  589. package/codex-lens/src/codexlens/search/binary_searcher.py +277 -0
  590. package/codex-lens/src/codexlens/search/chain_search.py +1642 -8
  591. package/codex-lens/src/codexlens/search/enrichment.py +21 -0
  592. package/codex-lens/src/codexlens/search/graph_expander.py +264 -0
  593. package/codex-lens/src/codexlens/search/hybrid_search.py +772 -37
  594. package/codex-lens/src/codexlens/search/ranking.py +347 -8
  595. package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +225 -0
  596. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
  597. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
  598. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
  599. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
  600. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  601. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
  602. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
  603. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
  604. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
  605. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
  606. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
  607. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
  608. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
  609. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
  610. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
  611. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
  612. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  613. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  614. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  615. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  616. package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
  617. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
  618. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
  619. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
  620. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
  621. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.pyc +0 -0
  622. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  623. package/codex-lens/src/codexlens/semantic/ann_index.py +654 -0
  624. package/codex-lens/src/codexlens/semantic/factory.py +63 -3
  625. package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
  626. package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
  627. package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
  628. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
  629. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
  630. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
  631. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
  632. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
  633. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
  634. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
  635. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
  636. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
  637. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
  638. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
  639. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
  640. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
  641. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
  642. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
  643. package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
  644. package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
  645. package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
  646. package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
  647. package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
  648. package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
  649. package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
  650. package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
  651. package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
  652. package/codex-lens/src/codexlens/storage/__init__.py +3 -0
  653. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
  654. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
  655. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  656. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
  657. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
  658. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  659. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
  660. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
  661. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
  662. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
  663. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  664. package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
  665. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
  666. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
  667. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
  668. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
  669. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
  670. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
  671. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
  672. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
  673. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.pyc +0 -0
  674. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  675. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-310.pyc +0 -0
  676. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
  677. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
  678. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
  679. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
  680. package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
  681. package/codex-lens/src/codexlens/storage/index_tree.py +194 -23
  682. package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
  683. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
  684. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
  685. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
  686. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
  687. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
  688. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
  689. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
  690. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
  691. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
  692. package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
  693. package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
  694. package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
  695. package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
  696. package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
  697. package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
  698. package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
  699. package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
  700. package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
  701. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
  702. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
  703. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
  704. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
  705. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
  706. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
  707. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
  708. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
  709. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
  710. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
  711. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
  712. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
  713. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
  714. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
  715. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
  716. package/codex-lens/src/codexlens/watcher/events.py +82 -0
  717. package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
  718. package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
  719. package/codex-lens/src/codexlens/watcher/manager.py +255 -0
  720. package/package.json +4 -1
  721. package/.claude/commands/workflow/docs/analyze.md +0 -1467
  722. package/.claude/commands/workflow/docs/copyright.md +0 -1265
  723. package/.claude/skills/command-guide/SKILL.md +0 -388
  724. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
  725. package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
  726. package/.claude/skills/command-guide/guides/examples.md +0 -537
  727. package/.claude/skills/command-guide/guides/getting-started.md +0 -242
  728. package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
  729. package/.claude/skills/command-guide/guides/index-structure.md +0 -326
  730. package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
  731. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
  732. package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
  733. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
  734. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
  735. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
  736. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
  737. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
  738. package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
  739. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
  740. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
  741. package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
  742. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
  743. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
  744. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
  745. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
  746. package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
  747. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
  748. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
  749. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
  750. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
  751. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
  752. package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
  753. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
  754. package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
  755. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
  756. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
  757. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
  758. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
  759. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
  760. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
  761. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
  762. package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
  763. package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
  764. package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
  765. package/.claude/skills/command-guide/reference/commands/version.md +0 -254
  766. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
  767. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
  768. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
  769. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
  770. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
  771. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
  772. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
  773. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
  774. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  775. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
  776. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
  777. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
  778. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
  779. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
  780. package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
  781. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
  782. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
  783. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
  784. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
  785. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
  786. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
  787. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
  788. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
  789. package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
  790. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
  791. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
  792. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
  793. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
  794. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
  795. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
  796. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
  797. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
  798. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
  799. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
  800. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
  801. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
  802. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
  803. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  804. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
  805. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
  806. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
  807. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
  808. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
  809. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
  810. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
  811. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
  812. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
  813. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
  814. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
  815. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
  816. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
  817. package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
  818. package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
  819. package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
  820. package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
  821. package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
  822. package/.claude/skills/command-guide/templates/issue-question.md +0 -141
@@ -9,89 +9,96 @@ Optimized for high-performance similarity search using:
9
9
 
10
10
  from __future__ import annotations
11
11
 
12
- import json
13
- import logging
14
- import sys
15
- import sqlite3
16
- import threading
17
- from pathlib import Path
18
- from typing import Any, Dict, List, Optional, Tuple
19
-
20
- from codexlens.entities import SearchResult, SemanticChunk
21
- from codexlens.errors import StorageError
22
-
23
- try:
24
- import numpy as np
25
- NUMPY_AVAILABLE = True
26
- except ImportError:
27
- np = None # type: ignore[assignment]
28
- NUMPY_AVAILABLE = False
29
-
30
- # Try to import ANN index (optional hnswlib dependency)
31
- try:
32
- from codexlens.semantic.ann_index import ANNIndex, HNSWLIB_AVAILABLE
12
+ import json
13
+ import logging
14
+ import sys
15
+ import sqlite3
16
+ import threading
17
+ from pathlib import Path
18
+ from typing import Any, Dict, List, Optional, Tuple
19
+
20
+ from codexlens.entities import SearchResult, SemanticChunk
21
+ from codexlens.errors import StorageError
22
+
23
+ try:
24
+ import numpy as np
25
+ NUMPY_AVAILABLE = True
26
+ except ImportError:
27
+ np = None # type: ignore[assignment]
28
+ NUMPY_AVAILABLE = False
29
+
30
+ # Try to import ANN index (optional hnswlib dependency)
31
+ try:
32
+ from codexlens.semantic.ann_index import (
33
+ ANNIndex,
34
+ BinaryANNIndex,
35
+ create_ann_index,
36
+ HNSWLIB_AVAILABLE,
37
+ )
33
38
  except ImportError:
34
39
  HNSWLIB_AVAILABLE = False
35
40
  ANNIndex = None
41
+ BinaryANNIndex = None
42
+ create_ann_index = None
43
+
44
+
45
+ logger = logging.getLogger(__name__)
46
+
47
+ # Epsilon used to guard against floating point precision edge cases (e.g., near-zero norms).
48
+ EPSILON = 1e-10
49
+
50
+ # SQLite INTEGER PRIMARY KEY uses signed 64-bit rowids.
51
+ SQLITE_INTEGER_MAX = (1 << 63) - 1
52
+
53
+
54
+ def _validate_chunk_id_range(start_id: int, count: int) -> None:
55
+ """Validate that a batch insert can safely generate sequential chunk IDs."""
56
+ if count <= 0:
57
+ return
58
+
59
+ last_id = start_id + count - 1
60
+ if last_id > sys.maxsize or last_id > SQLITE_INTEGER_MAX:
61
+ raise ValueError(
62
+ "Chunk ID range overflow: "
63
+ f"start_id={start_id}, count={count} would allocate up to {last_id}, "
64
+ f"exceeding limits (sys.maxsize={sys.maxsize}, sqlite_max={SQLITE_INTEGER_MAX}). "
65
+ "Consider cleaning up the index database or creating a new index database."
66
+ )
67
+
68
+
69
+ def _validate_sql_placeholders(placeholders: str, expected_count: int) -> None:
70
+ """Validate the placeholder string used for a parameterized SQL IN clause."""
71
+ expected = ",".join("?" * expected_count)
72
+ if placeholders != expected:
73
+ raise ValueError(
74
+ "Invalid SQL placeholders for IN clause. "
75
+ f"Expected {expected_count} '?' placeholders."
76
+ )
77
+
78
+
79
+ def _cosine_similarity(a: List[float], b: List[float]) -> float:
80
+ """Compute cosine similarity between two vectors."""
81
+ if not NUMPY_AVAILABLE:
82
+ raise ImportError("numpy required for vector operations")
83
+
84
+ a_arr = np.array(a)
85
+ b_arr = np.array(b)
86
+
87
+ norm_a = np.linalg.norm(a_arr)
88
+ norm_b = np.linalg.norm(b_arr)
89
+
90
+ # Use epsilon tolerance to avoid division by (near-)zero due to floating point precision.
91
+ if norm_a < EPSILON or norm_b < EPSILON:
92
+ return 0.0
93
+
94
+ denom = norm_a * norm_b
95
+ if denom < EPSILON:
96
+ return 0.0
36
97
 
37
-
38
- logger = logging.getLogger(__name__)
39
-
40
- # Epsilon used to guard against floating point precision edge cases (e.g., near-zero norms).
41
- EPSILON = 1e-10
42
-
43
- # SQLite INTEGER PRIMARY KEY uses signed 64-bit rowids.
44
- SQLITE_INTEGER_MAX = (1 << 63) - 1
45
-
46
-
47
- def _validate_chunk_id_range(start_id: int, count: int) -> None:
48
- """Validate that a batch insert can safely generate sequential chunk IDs."""
49
- if count <= 0:
50
- return
51
-
52
- last_id = start_id + count - 1
53
- if last_id > sys.maxsize or last_id > SQLITE_INTEGER_MAX:
54
- raise ValueError(
55
- "Chunk ID range overflow: "
56
- f"start_id={start_id}, count={count} would allocate up to {last_id}, "
57
- f"exceeding limits (sys.maxsize={sys.maxsize}, sqlite_max={SQLITE_INTEGER_MAX}). "
58
- "Consider cleaning up the index database or creating a new index database."
59
- )
60
-
61
-
62
- def _validate_sql_placeholders(placeholders: str, expected_count: int) -> None:
63
- """Validate the placeholder string used for a parameterized SQL IN clause."""
64
- expected = ",".join("?" * expected_count)
65
- if placeholders != expected:
66
- raise ValueError(
67
- "Invalid SQL placeholders for IN clause. "
68
- f"Expected {expected_count} '?' placeholders."
69
- )
70
-
71
-
72
- def _cosine_similarity(a: List[float], b: List[float]) -> float:
73
- """Compute cosine similarity between two vectors."""
74
- if not NUMPY_AVAILABLE:
75
- raise ImportError("numpy required for vector operations")
76
-
77
- a_arr = np.array(a)
78
- b_arr = np.array(b)
79
-
80
- norm_a = np.linalg.norm(a_arr)
81
- norm_b = np.linalg.norm(b_arr)
82
-
83
- # Use epsilon tolerance to avoid division by (near-)zero due to floating point precision.
84
- if norm_a < EPSILON or norm_b < EPSILON:
85
- return 0.0
86
-
87
- denom = norm_a * norm_b
88
- if denom < EPSILON:
89
- return 0.0
90
-
91
- return float(np.dot(a_arr, b_arr) / denom)
92
-
93
-
94
- class VectorStore:
98
+ return float(np.dot(a_arr, b_arr) / denom)
99
+
100
+
101
+ class VectorStore:
95
102
  """SQLite-based vector storage with HNSW-accelerated similarity search.
96
103
 
97
104
  Performance optimizations:
@@ -106,12 +113,12 @@ class VectorStore:
106
113
  # Default embedding dimension (used when creating new index)
107
114
  DEFAULT_DIM = 768
108
115
 
109
- def __init__(self, db_path: str | Path) -> None:
110
- if not NUMPY_AVAILABLE:
111
- raise ImportError(
112
- "Semantic search dependencies not available. "
113
- "Install with: pip install codexlens[semantic]"
114
- )
116
+ def __init__(self, db_path: str | Path) -> None:
117
+ if not NUMPY_AVAILABLE:
118
+ raise ImportError(
119
+ "Semantic search dependencies not available. "
120
+ "Install with: pip install codexlens[semantic]"
121
+ )
115
122
 
116
123
  self.db_path = Path(db_path)
117
124
  self.db_path.parent.mkdir(parents=True, exist_ok=True)
@@ -148,6 +155,7 @@ class VectorStore:
148
155
  content TEXT NOT NULL,
149
156
  embedding BLOB NOT NULL,
150
157
  metadata TEXT,
158
+ category TEXT DEFAULT 'code',
151
159
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
152
160
  )
153
161
  """)
@@ -155,6 +163,10 @@ class VectorStore:
155
163
  CREATE INDEX IF NOT EXISTS idx_chunks_file
156
164
  ON semantic_chunks(file_path)
157
165
  """)
166
+ conn.execute("""
167
+ CREATE INDEX IF NOT EXISTS idx_chunks_category
168
+ ON semantic_chunks(category)
169
+ """)
158
170
  # Model configuration table - tracks which model generated the embeddings
159
171
  conn.execute("""
160
172
  CREATE TABLE IF NOT EXISTS embeddings_config (
@@ -170,6 +182,8 @@ class VectorStore:
170
182
 
171
183
  # Migration: Add backend column to existing tables
172
184
  self._migrate_backend_column(conn)
185
+ # Migration: Add category column
186
+ self._migrate_category_column(conn)
173
187
 
174
188
  conn.commit()
175
189
 
@@ -190,6 +204,28 @@ class VectorStore:
190
204
  ADD COLUMN backend TEXT NOT NULL DEFAULT 'fastembed'
191
205
  """)
192
206
 
207
+ def _migrate_category_column(self, conn: sqlite3.Connection) -> None:
208
+ """Add category column to existing semantic_chunks table if not present.
209
+
210
+ Args:
211
+ conn: Active SQLite connection
212
+ """
213
+ # Check if category column exists
214
+ cursor = conn.execute("PRAGMA table_info(semantic_chunks)")
215
+ columns = [row[1] for row in cursor.fetchall()]
216
+
217
+ if 'category' not in columns:
218
+ logger.info("Migrating semantic_chunks table: adding category column")
219
+ conn.execute("""
220
+ ALTER TABLE semantic_chunks
221
+ ADD COLUMN category TEXT DEFAULT 'code'
222
+ """)
223
+ # Create index for fast category filtering
224
+ conn.execute("""
225
+ CREATE INDEX IF NOT EXISTS idx_chunks_category
226
+ ON semantic_chunks(category)
227
+ """)
228
+
193
229
  def _init_ann_index(self) -> None:
194
230
  """Initialize ANN index (lazy loading from existing data)."""
195
231
  if not HNSWLIB_AVAILABLE:
@@ -338,14 +374,14 @@ class VectorStore:
338
374
  ]
339
375
  self._embedding_matrix = np.vstack(embeddings)
340
376
 
341
- # Pre-compute norms for faster similarity calculation
342
- self._embedding_norms = np.linalg.norm(
343
- self._embedding_matrix, axis=1, keepdims=True
344
- )
345
- # Avoid division by zero
346
- self._embedding_norms = np.where(
347
- self._embedding_norms == 0, EPSILON, self._embedding_norms
348
- )
377
+ # Pre-compute norms for faster similarity calculation
378
+ self._embedding_norms = np.linalg.norm(
379
+ self._embedding_matrix, axis=1, keepdims=True
380
+ )
381
+ # Avoid division by zero
382
+ self._embedding_norms = np.where(
383
+ self._embedding_norms == 0, EPSILON, self._embedding_norms
384
+ )
349
385
 
350
386
  return True
351
387
 
@@ -383,9 +419,16 @@ class VectorStore:
383
419
  self._ann_index = None
384
420
  return False
385
421
 
386
- def add_chunk(self, chunk: SemanticChunk, file_path: str) -> int:
422
+ def add_chunk(
423
+ self, chunk: SemanticChunk, file_path: str, category: str = "code"
424
+ ) -> int:
387
425
  """Add a single chunk with its embedding.
388
426
 
427
+ Args:
428
+ chunk: SemanticChunk with embedding
429
+ file_path: Path to the source file
430
+ category: File category ('code' or 'doc'), default 'code'
431
+
389
432
  Returns:
390
433
  The inserted chunk ID.
391
434
  """
@@ -399,10 +442,10 @@ class VectorStore:
399
442
  with sqlite3.connect(self.db_path) as conn:
400
443
  cursor = conn.execute(
401
444
  """
402
- INSERT INTO semantic_chunks (file_path, content, embedding, metadata)
403
- VALUES (?, ?, ?, ?)
445
+ INSERT INTO semantic_chunks (file_path, content, embedding, metadata, category)
446
+ VALUES (?, ?, ?, ?, ?)
404
447
  """,
405
- (file_path, chunk.content, embedding_blob, metadata_json)
448
+ (file_path, chunk.content, embedding_blob, metadata_json, category)
406
449
  )
407
450
  conn.commit()
408
451
  chunk_id = cursor.lastrowid or 0
@@ -420,9 +463,16 @@ class VectorStore:
420
463
  self._invalidate_cache()
421
464
  return chunk_id
422
465
 
423
- def add_chunks(self, chunks: List[SemanticChunk], file_path: str) -> List[int]:
466
+ def add_chunks(
467
+ self, chunks: List[SemanticChunk], file_path: str, category: str = "code"
468
+ ) -> List[int]:
424
469
  """Add multiple chunks with embeddings (batch insert).
425
470
 
471
+ Args:
472
+ chunks: List of SemanticChunk objects with embeddings
473
+ file_path: Path to the source file
474
+ category: File category ('code' or 'doc'), default 'code'
475
+
426
476
  Returns:
427
477
  List of inserted chunk IDs.
428
478
  """
@@ -438,7 +488,7 @@ class VectorStore:
438
488
  embedding_arr = np.array(chunk.embedding, dtype=np.float32)
439
489
  embedding_blob = embedding_arr.tobytes()
440
490
  metadata_json = json.dumps(chunk.metadata) if chunk.metadata else None
441
- batch_data.append((file_path, chunk.content, embedding_blob, metadata_json))
491
+ batch_data.append((file_path, chunk.content, embedding_blob, metadata_json, category))
442
492
  embeddings_list.append(embedding_arr)
443
493
 
444
494
  # Batch insert to SQLite
@@ -449,8 +499,8 @@ class VectorStore:
449
499
 
450
500
  conn.executemany(
451
501
  """
452
- INSERT INTO semantic_chunks (file_path, content, embedding, metadata)
453
- VALUES (?, ?, ?, ?)
502
+ INSERT INTO semantic_chunks (file_path, content, embedding, metadata, category)
503
+ VALUES (?, ?, ?, ?, ?)
454
504
  """,
455
505
  batch_data
456
506
  )
@@ -472,11 +522,12 @@ class VectorStore:
472
522
  self._invalidate_cache()
473
523
  return ids
474
524
 
475
- def add_chunks_batch(
476
- self,
477
- chunks_with_paths: List[Tuple[SemanticChunk, str]],
478
- update_ann: bool = True,
479
- auto_save_ann: bool = True,
525
+ def add_chunks_batch(
526
+ self,
527
+ chunks_with_paths: List[Tuple[SemanticChunk, str]],
528
+ update_ann: bool = True,
529
+ auto_save_ann: bool = True,
530
+ categories: Optional[List[str]] = None,
480
531
  ) -> List[int]:
481
532
  """Batch insert chunks from multiple files in a single transaction.
482
533
 
@@ -487,19 +538,28 @@ class VectorStore:
487
538
  update_ann: If True, update ANN index with new vectors (default: True)
488
539
  auto_save_ann: If True, save ANN index after update (default: True).
489
540
  Set to False for bulk inserts to reduce I/O overhead.
541
+ categories: Optional list of categories per chunk. If None, defaults to 'code'.
542
+ If provided, must match length of chunks_with_paths.
490
543
 
491
- Returns:
492
- List of inserted chunk IDs
493
- """
494
- if not chunks_with_paths:
495
- return []
496
-
497
- batch_size = len(chunks_with_paths)
498
-
499
- # Prepare batch data
500
- batch_data = []
501
- embeddings_list = []
502
- for chunk, file_path in chunks_with_paths:
544
+ Returns:
545
+ List of inserted chunk IDs
546
+ """
547
+ if not chunks_with_paths:
548
+ return []
549
+
550
+ batch_size = len(chunks_with_paths)
551
+
552
+ # Validate categories if provided
553
+ if categories is not None and len(categories) != batch_size:
554
+ raise ValueError(
555
+ f"categories length ({len(categories)}) must match "
556
+ f"chunks_with_paths length ({batch_size})"
557
+ )
558
+
559
+ # Prepare batch data
560
+ batch_data = []
561
+ embeddings_list = []
562
+ for i, (chunk, file_path) in enumerate(chunks_with_paths):
503
563
  if chunk.embedding is None:
504
564
  raise ValueError("All chunks must have embeddings")
505
565
  # Optimize: avoid repeated np.array() if already numpy
@@ -509,55 +569,57 @@ class VectorStore:
509
569
  embedding_arr = np.array(chunk.embedding, dtype=np.float32)
510
570
  embedding_blob = embedding_arr.tobytes()
511
571
  metadata_json = json.dumps(chunk.metadata) if chunk.metadata else None
512
- batch_data.append((file_path, chunk.content, embedding_blob, metadata_json))
572
+ category = categories[i] if categories else "code"
573
+ batch_data.append((file_path, chunk.content, embedding_blob, metadata_json, category))
513
574
  embeddings_list.append(embedding_arr)
514
575
 
515
- # Batch insert to SQLite in single transaction
516
- with sqlite3.connect(self.db_path) as conn:
517
- # Get starting ID before insert
518
- row = conn.execute("SELECT MAX(id) FROM semantic_chunks").fetchone()
519
- start_id = (row[0] or 0) + 1
520
-
521
- _validate_chunk_id_range(start_id, batch_size)
522
-
523
- conn.executemany(
524
- """
525
- INSERT INTO semantic_chunks (file_path, content, embedding, metadata)
526
- VALUES (?, ?, ?, ?)
576
+ # Batch insert to SQLite in single transaction
577
+ with sqlite3.connect(self.db_path) as conn:
578
+ # Get starting ID before insert
579
+ row = conn.execute("SELECT MAX(id) FROM semantic_chunks").fetchone()
580
+ start_id = (row[0] or 0) + 1
581
+
582
+ _validate_chunk_id_range(start_id, batch_size)
583
+
584
+ conn.executemany(
585
+ """
586
+ INSERT INTO semantic_chunks (file_path, content, embedding, metadata, category)
587
+ VALUES (?, ?, ?, ?, ?)
527
588
  """,
528
589
  batch_data
529
- )
530
- conn.commit()
531
- # Calculate inserted IDs based on starting ID
532
- ids = list(range(start_id, start_id + batch_size))
533
-
534
- # Handle ANN index updates
535
- if embeddings_list and update_ann and self._ensure_ann_index(len(embeddings_list[0])):
536
- with self._ann_write_lock:
537
- # In bulk insert mode, accumulate for later batch update
538
- if self._bulk_insert_mode:
539
- self._bulk_insert_ids.extend(ids)
540
- self._bulk_insert_embeddings.extend(embeddings_list)
541
- else:
542
- # Normal mode: update immediately
543
- try:
544
- embeddings_matrix = np.vstack(embeddings_list)
545
- self._ann_index.add_vectors(ids, embeddings_matrix)
546
- if auto_save_ann:
547
- self._ann_index.save()
548
- except Exception as e:
549
- logger.warning("Failed to add batch to ANN index: %s", e)
590
+ )
591
+ conn.commit()
592
+ # Calculate inserted IDs based on starting ID
593
+ ids = list(range(start_id, start_id + batch_size))
594
+
595
+ # Handle ANN index updates
596
+ if embeddings_list and update_ann and self._ensure_ann_index(len(embeddings_list[0])):
597
+ with self._ann_write_lock:
598
+ # In bulk insert mode, accumulate for later batch update
599
+ if self._bulk_insert_mode:
600
+ self._bulk_insert_ids.extend(ids)
601
+ self._bulk_insert_embeddings.extend(embeddings_list)
602
+ else:
603
+ # Normal mode: update immediately
604
+ try:
605
+ embeddings_matrix = np.vstack(embeddings_list)
606
+ self._ann_index.add_vectors(ids, embeddings_matrix)
607
+ if auto_save_ann:
608
+ self._ann_index.save()
609
+ except Exception as e:
610
+ logger.warning("Failed to add batch to ANN index: %s", e)
550
611
 
551
612
  # Invalidate cache after modification
552
613
  self._invalidate_cache()
553
614
  return ids
554
615
 
555
- def add_chunks_batch_numpy(
556
- self,
557
- chunks_with_paths: List[Tuple[SemanticChunk, str]],
558
- embeddings_matrix: np.ndarray,
559
- update_ann: bool = True,
616
+ def add_chunks_batch_numpy(
617
+ self,
618
+ chunks_with_paths: List[Tuple[SemanticChunk, str]],
619
+ embeddings_matrix: np.ndarray,
620
+ update_ann: bool = True,
560
621
  auto_save_ann: bool = True,
622
+ categories: Optional[List[str]] = None,
561
623
  ) -> List[int]:
562
624
  """Batch insert chunks with pre-computed numpy embeddings matrix.
563
625
 
@@ -569,19 +631,27 @@ class VectorStore:
569
631
  embeddings_matrix: Pre-computed embeddings as (N, D) numpy array
570
632
  update_ann: If True, update ANN index with new vectors (default: True)
571
633
  auto_save_ann: If True, save ANN index after update (default: True)
634
+ categories: Optional list of categories per chunk. If None, defaults to 'code'.
635
+
636
+ Returns:
637
+ List of inserted chunk IDs
638
+ """
639
+ if not chunks_with_paths:
640
+ return []
572
641
 
573
- Returns:
574
- List of inserted chunk IDs
575
- """
576
- if not chunks_with_paths:
577
- return []
578
-
579
- batch_size = len(chunks_with_paths)
580
-
581
- if len(chunks_with_paths) != embeddings_matrix.shape[0]:
582
- raise ValueError(
583
- f"Mismatch: {len(chunks_with_paths)} chunks but "
584
- f"{embeddings_matrix.shape[0]} embeddings"
642
+ batch_size = len(chunks_with_paths)
643
+
644
+ if len(chunks_with_paths) != embeddings_matrix.shape[0]:
645
+ raise ValueError(
646
+ f"Mismatch: {len(chunks_with_paths)} chunks but "
647
+ f"{embeddings_matrix.shape[0]} embeddings"
648
+ )
649
+
650
+ # Validate categories if provided
651
+ if categories is not None and len(categories) != batch_size:
652
+ raise ValueError(
653
+ f"categories length ({len(categories)}) must match "
654
+ f"chunks_with_paths length ({batch_size})"
585
655
  )
586
656
 
587
657
  # Ensure float32 format
@@ -593,49 +663,50 @@ class VectorStore:
593
663
  embedding_arr = embeddings_matrix[i]
594
664
  embedding_blob = embedding_arr.tobytes()
595
665
  metadata_json = json.dumps(chunk.metadata) if chunk.metadata else None
596
- batch_data.append((file_path, chunk.content, embedding_blob, metadata_json))
597
-
598
- # Batch insert to SQLite in single transaction
599
- with sqlite3.connect(self.db_path) as conn:
600
- # Get starting ID before insert
601
- row = conn.execute("SELECT MAX(id) FROM semantic_chunks").fetchone()
602
- start_id = (row[0] or 0) + 1
603
-
604
- _validate_chunk_id_range(start_id, batch_size)
605
-
606
- conn.executemany(
607
- """
608
- INSERT INTO semantic_chunks (file_path, content, embedding, metadata)
609
- VALUES (?, ?, ?, ?)
666
+ category = categories[i] if categories else "code"
667
+ batch_data.append((file_path, chunk.content, embedding_blob, metadata_json, category))
668
+
669
+ # Batch insert to SQLite in single transaction
670
+ with sqlite3.connect(self.db_path) as conn:
671
+ # Get starting ID before insert
672
+ row = conn.execute("SELECT MAX(id) FROM semantic_chunks").fetchone()
673
+ start_id = (row[0] or 0) + 1
674
+
675
+ _validate_chunk_id_range(start_id, batch_size)
676
+
677
+ conn.executemany(
678
+ """
679
+ INSERT INTO semantic_chunks (file_path, content, embedding, metadata, category)
680
+ VALUES (?, ?, ?, ?, ?)
610
681
  """,
611
682
  batch_data
612
- )
613
- conn.commit()
614
- # Calculate inserted IDs based on starting ID
615
- ids = list(range(start_id, start_id + batch_size))
616
-
617
- # Handle ANN index updates
618
- if update_ann and self._ensure_ann_index(embeddings_matrix.shape[1]):
619
- with self._ann_write_lock:
620
- # In bulk insert mode, accumulate for later batch update
621
- if self._bulk_insert_mode:
622
- self._bulk_insert_ids.extend(ids)
623
- # Split matrix into individual arrays for accumulation
624
- self._bulk_insert_embeddings.extend([embeddings_matrix[i] for i in range(len(ids))])
625
- else:
626
- # Normal mode: update immediately
627
- try:
628
- self._ann_index.add_vectors(ids, embeddings_matrix)
629
- if auto_save_ann:
630
- self._ann_index.save()
631
- except Exception as e:
632
- logger.warning("Failed to add batch to ANN index: %s", e)
683
+ )
684
+ conn.commit()
685
+ # Calculate inserted IDs based on starting ID
686
+ ids = list(range(start_id, start_id + batch_size))
687
+
688
+ # Handle ANN index updates
689
+ if update_ann and self._ensure_ann_index(embeddings_matrix.shape[1]):
690
+ with self._ann_write_lock:
691
+ # In bulk insert mode, accumulate for later batch update
692
+ if self._bulk_insert_mode:
693
+ self._bulk_insert_ids.extend(ids)
694
+ # Split matrix into individual arrays for accumulation
695
+ self._bulk_insert_embeddings.extend([embeddings_matrix[i] for i in range(len(ids))])
696
+ else:
697
+ # Normal mode: update immediately
698
+ try:
699
+ self._ann_index.add_vectors(ids, embeddings_matrix)
700
+ if auto_save_ann:
701
+ self._ann_index.save()
702
+ except Exception as e:
703
+ logger.warning("Failed to add batch to ANN index: %s", e)
633
704
 
634
705
  # Invalidate cache after modification
635
706
  self._invalidate_cache()
636
707
  return ids
637
708
 
638
- def begin_bulk_insert(self) -> None:
709
+ def begin_bulk_insert(self) -> None:
639
710
  """Begin bulk insert mode - disable ANN auto-update for better performance.
640
711
 
641
712
  Usage:
@@ -651,45 +722,45 @@ class VectorStore:
651
722
  for batch in batches:
652
723
  store.add_chunks_batch(batch)
653
724
  """
654
- with self._ann_write_lock:
655
- self._bulk_insert_mode = True
656
- self._bulk_insert_ids.clear()
657
- self._bulk_insert_embeddings.clear()
658
- logger.debug("Entered bulk insert mode")
659
-
660
- def end_bulk_insert(self) -> None:
725
+ with self._ann_write_lock:
726
+ self._bulk_insert_mode = True
727
+ self._bulk_insert_ids.clear()
728
+ self._bulk_insert_embeddings.clear()
729
+ logger.debug("Entered bulk insert mode")
730
+
731
+ def end_bulk_insert(self) -> None:
661
732
  """End bulk insert mode and rebuild ANN index from accumulated data.
662
733
 
663
734
  This method should be called after all bulk inserts are complete to
664
735
  update the ANN index in a single batch operation.
665
736
  """
666
- with self._ann_write_lock:
667
- if not self._bulk_insert_mode:
668
- logger.warning("end_bulk_insert called but not in bulk insert mode")
669
- return
670
-
671
- self._bulk_insert_mode = False
672
- bulk_ids = list(self._bulk_insert_ids)
673
- bulk_embeddings = list(self._bulk_insert_embeddings)
674
- self._bulk_insert_ids.clear()
675
- self._bulk_insert_embeddings.clear()
676
-
677
- # Update ANN index with accumulated data.
678
- if bulk_ids and bulk_embeddings:
679
- if self._ensure_ann_index(len(bulk_embeddings[0])):
680
- with self._ann_write_lock:
681
- try:
682
- embeddings_matrix = np.vstack(bulk_embeddings)
683
- self._ann_index.add_vectors(bulk_ids, embeddings_matrix)
684
- self._ann_index.save()
685
- logger.info(
686
- "Bulk insert complete: added %d vectors to ANN index",
687
- len(bulk_ids),
688
- )
689
- except Exception as e:
690
- logger.error("Failed to update ANN index after bulk insert: %s", e)
691
-
692
- logger.debug("Exited bulk insert mode")
737
+ with self._ann_write_lock:
738
+ if not self._bulk_insert_mode:
739
+ logger.warning("end_bulk_insert called but not in bulk insert mode")
740
+ return
741
+
742
+ self._bulk_insert_mode = False
743
+ bulk_ids = list(self._bulk_insert_ids)
744
+ bulk_embeddings = list(self._bulk_insert_embeddings)
745
+ self._bulk_insert_ids.clear()
746
+ self._bulk_insert_embeddings.clear()
747
+
748
+ # Update ANN index with accumulated data.
749
+ if bulk_ids and bulk_embeddings:
750
+ if self._ensure_ann_index(len(bulk_embeddings[0])):
751
+ with self._ann_write_lock:
752
+ try:
753
+ embeddings_matrix = np.vstack(bulk_embeddings)
754
+ self._ann_index.add_vectors(bulk_ids, embeddings_matrix)
755
+ self._ann_index.save()
756
+ logger.info(
757
+ "Bulk insert complete: added %d vectors to ANN index",
758
+ len(bulk_ids),
759
+ )
760
+ except Exception as e:
761
+ logger.error("Failed to update ANN index after bulk insert: %s", e)
762
+
763
+ logger.debug("Exited bulk insert mode")
693
764
 
694
765
  class BulkInsertContext:
695
766
  """Context manager for bulk insert operations."""
@@ -752,108 +823,114 @@ class VectorStore:
752
823
  self._invalidate_cache()
753
824
  return deleted
754
825
 
755
- def search_similar(
756
- self,
757
- query_embedding: List[float],
758
- top_k: int = 10,
759
- min_score: float = 0.0,
760
- return_full_content: bool = True,
761
- ) -> List[SearchResult]:
762
- """Find chunks most similar to query embedding.
826
+ def search_similar(
827
+ self,
828
+ query_embedding: List[float],
829
+ top_k: int = 10,
830
+ min_score: float = 0.0,
831
+ return_full_content: bool = True,
832
+ category: Optional[str] = None,
833
+ ) -> List[SearchResult]:
834
+ """Find chunks most similar to query embedding.
763
835
 
764
836
  Uses HNSW index for O(log N) search when available, falls back to
765
837
  brute-force NumPy search otherwise.
766
838
 
767
- Args:
768
- query_embedding: Query vector.
769
- top_k: Maximum results to return.
770
- min_score: Minimum cosine similarity score in [0.0, 1.0].
771
- return_full_content: If True, return full code block content.
772
-
773
- Returns:
774
- List of SearchResult ordered by similarity (highest first).
775
- """
776
- query_vec = np.array(query_embedding, dtype=np.float32)
777
-
778
- if not 0.0 <= min_score <= 1.0:
779
- raise ValueError(
780
- f"Invalid min_score: {min_score}. Must be within [0.0, 1.0] for cosine similarity."
781
- )
782
-
783
- # Try HNSW search first (O(log N))
784
- if (
785
- HNSWLIB_AVAILABLE
786
- and self._ann_index is not None
787
- and self._ann_index.is_loaded
839
+ Args:
840
+ query_embedding: Query vector.
841
+ top_k: Maximum results to return.
842
+ min_score: Minimum cosine similarity score in [0.0, 1.0].
843
+ return_full_content: If True, return full code block content.
844
+ category: Optional category filter ('code' or 'doc'). If None, returns all.
845
+
846
+ Returns:
847
+ List of SearchResult ordered by similarity (highest first).
848
+ """
849
+ query_vec = np.array(query_embedding, dtype=np.float32)
850
+
851
+ if not 0.0 <= min_score <= 1.0:
852
+ raise ValueError(
853
+ f"Invalid min_score: {min_score}. Must be within [0.0, 1.0] for cosine similarity."
854
+ )
855
+
856
+ # Try HNSW search first (O(log N))
857
+ if (
858
+ HNSWLIB_AVAILABLE
859
+ and self._ann_index is not None
860
+ and self._ann_index.is_loaded
788
861
  and self._ann_index.count() > 0
789
862
  ):
790
863
  try:
791
864
  return self._search_with_ann(
792
- query_vec, top_k, min_score, return_full_content
865
+ query_vec, top_k, min_score, return_full_content, category
793
866
  )
794
867
  except Exception as e:
795
868
  logger.warning("ANN search failed, falling back to brute-force: %s", e)
796
869
 
797
870
  # Fallback to brute-force search (O(N))
798
871
  return self._search_brute_force(
799
- query_vec, top_k, min_score, return_full_content
872
+ query_vec, top_k, min_score, return_full_content, category
800
873
  )
801
874
 
802
- def _search_with_ann(
803
- self,
804
- query_vec: np.ndarray,
805
- top_k: int,
806
- min_score: float,
807
- return_full_content: bool,
808
- ) -> List[SearchResult]:
809
- """Search using HNSW index (O(log N)).
810
-
811
- Args:
812
- query_vec: Query vector as numpy array
813
- top_k: Maximum results to return
814
- min_score: Minimum cosine similarity score in [0.0, 1.0]
815
- return_full_content: If True, return full code block content
875
+ def _search_with_ann(
876
+ self,
877
+ query_vec: np.ndarray,
878
+ top_k: int,
879
+ min_score: float,
880
+ return_full_content: bool,
881
+ category: Optional[str] = None,
882
+ ) -> List[SearchResult]:
883
+ """Search using HNSW index (O(log N)).
884
+
885
+ Args:
886
+ query_vec: Query vector as numpy array
887
+ top_k: Maximum results to return
888
+ min_score: Minimum cosine similarity score in [0.0, 1.0]
889
+ return_full_content: If True, return full code block content
890
+ category: Optional category filter ('code' or 'doc')
816
891
 
817
892
  Returns:
818
893
  List of SearchResult ordered by similarity (highest first)
819
894
  """
820
895
  # Limit top_k to available vectors to prevent hnswlib error
821
896
  ann_count = self._ann_index.count()
822
- effective_top_k = min(top_k, ann_count) if ann_count > 0 else 0
897
+ # When category filtering, fetch more candidates to compensate for filtering
898
+ fetch_k = top_k * 3 if category else top_k
899
+ effective_top_k = min(fetch_k, ann_count) if ann_count > 0 else 0
823
900
 
824
901
  if effective_top_k == 0:
825
902
  return []
826
903
 
827
- # HNSW search returns (ids, distances)
828
- # For cosine space: distance = 1 - similarity
829
- ids, distances = self._ann_index.search(query_vec, effective_top_k)
830
-
831
- if ids is None or distances is None:
832
- logger.debug(
833
- "ANN search returned null results (ids=%s, distances=%s)",
834
- ids,
835
- distances,
836
- )
837
- return []
838
-
839
- if len(ids) == 0 or len(distances) == 0:
840
- logger.debug(
841
- "ANN search returned empty results (ids=%s, distances=%s)",
842
- ids,
843
- distances,
844
- )
845
- return []
846
-
847
- if len(ids) != len(distances):
848
- logger.warning(
849
- "ANN search returned mismatched result lengths (%d ids, %d distances)",
850
- len(ids),
851
- len(distances),
852
- )
853
- return []
854
-
855
- # Convert distances to similarity scores
856
- scores = [1.0 - d for d in distances]
904
+ # HNSW search returns (ids, distances)
905
+ # For cosine space: distance = 1 - similarity
906
+ ids, distances = self._ann_index.search(query_vec, effective_top_k)
907
+
908
+ if ids is None or distances is None:
909
+ logger.debug(
910
+ "ANN search returned null results (ids=%s, distances=%s)",
911
+ ids,
912
+ distances,
913
+ )
914
+ return []
915
+
916
+ if len(ids) == 0 or len(distances) == 0:
917
+ logger.debug(
918
+ "ANN search returned empty results (ids=%s, distances=%s)",
919
+ ids,
920
+ distances,
921
+ )
922
+ return []
923
+
924
+ if len(ids) != len(distances):
925
+ logger.warning(
926
+ "ANN search returned mismatched result lengths (%d ids, %d distances)",
927
+ len(ids),
928
+ len(distances),
929
+ )
930
+ return []
931
+
932
+ # Convert distances to similarity scores
933
+ scores = [1.0 - d for d in distances]
857
934
 
858
935
  # Filter by min_score
859
936
  filtered = [
@@ -868,23 +945,29 @@ class VectorStore:
868
945
  top_ids = [f[0] for f in filtered]
869
946
  top_scores = [f[1] for f in filtered]
870
947
 
871
- # Fetch content from SQLite
872
- return self._fetch_results_by_ids(top_ids, top_scores, return_full_content)
948
+ # Fetch content from SQLite with category filtering
949
+ results = self._fetch_results_by_ids(
950
+ top_ids, top_scores, return_full_content, category
951
+ )
952
+ # Apply final limit after category filtering
953
+ return results[:top_k]
873
954
 
874
- def _search_brute_force(
875
- self,
876
- query_vec: np.ndarray,
877
- top_k: int,
878
- min_score: float,
879
- return_full_content: bool,
880
- ) -> List[SearchResult]:
881
- """Brute-force search using NumPy (O(N) fallback).
955
+ def _search_brute_force(
956
+ self,
957
+ query_vec: np.ndarray,
958
+ top_k: int,
959
+ min_score: float,
960
+ return_full_content: bool,
961
+ category: Optional[str] = None,
962
+ ) -> List[SearchResult]:
963
+ """Brute-force search using NumPy (O(N) fallback).
882
964
 
883
- Args:
884
- query_vec: Query vector as numpy array
885
- top_k: Maximum results to return
886
- min_score: Minimum cosine similarity score in [0.0, 1.0]
887
- return_full_content: If True, return full code block content
965
+ Args:
966
+ query_vec: Query vector as numpy array
967
+ top_k: Maximum results to return
968
+ min_score: Minimum cosine similarity score in [0.0, 1.0]
969
+ return_full_content: If True, return full code block content
970
+ category: Optional category filter ('code' or 'doc')
888
971
 
889
972
  Returns:
890
973
  List of SearchResult ordered by similarity (highest first)
@@ -919,27 +1002,31 @@ class VectorStore:
919
1002
  if len(valid_indices) == 0:
920
1003
  return []
921
1004
 
922
- # Sort by score descending and take top_k
1005
+ # When category filtering, fetch more candidates to compensate for filtering
1006
+ fetch_k = top_k * 3 if category else top_k
1007
+
1008
+ # Sort by score descending and take top candidates
923
1009
  valid_scores = scores[valid_indices]
924
- sorted_order = np.argsort(valid_scores)[::-1][:top_k]
1010
+ sorted_order = np.argsort(valid_scores)[::-1][:fetch_k]
925
1011
  top_indices = valid_indices[sorted_order]
926
1012
  top_scores = valid_scores[sorted_order]
927
1013
 
928
1014
  # Get chunk IDs for top results
929
1015
  top_ids = [self._chunk_ids[i] for i in top_indices]
930
1016
 
931
- # Fetch content only for top-k results (lazy loading)
1017
+ # Fetch content only for top-k results (lazy loading) with category filtering
932
1018
  results = self._fetch_results_by_ids(
933
- top_ids, top_scores.tolist(), return_full_content
1019
+ top_ids, top_scores.tolist(), return_full_content, category
934
1020
  )
935
-
936
- return results
1021
+ # Apply final limit after category filtering
1022
+ return results[:top_k]
937
1023
 
938
1024
  def _fetch_results_by_ids(
939
1025
  self,
940
1026
  chunk_ids: List[int],
941
1027
  scores: List[float],
942
1028
  return_full_content: bool,
1029
+ category: Optional[str] = None,
943
1030
  ) -> List[SearchResult]:
944
1031
  """Fetch full result data for specific chunk IDs.
945
1032
 
@@ -947,29 +1034,40 @@ class VectorStore:
947
1034
  chunk_ids: List of chunk IDs to fetch.
948
1035
  scores: Corresponding similarity scores.
949
1036
  return_full_content: Whether to include full content.
1037
+ category: Optional category filter ('code' or 'doc').
950
1038
 
951
1039
  Returns:
952
1040
  List of SearchResult objects.
953
1041
  """
954
- if not chunk_ids:
955
- return []
956
-
957
- # Build parameterized query for IN clause
958
- placeholders = ",".join("?" * len(chunk_ids))
959
- _validate_sql_placeholders(placeholders, len(chunk_ids))
960
-
961
- # SQL injection prevention:
962
- # - Only a validated placeholders string (commas + '?') is interpolated into the query.
963
- # - User-provided values are passed separately via sqlite3 parameters.
964
- query = """
965
- SELECT id, file_path, content, metadata
966
- FROM semantic_chunks
967
- WHERE id IN ({placeholders})
968
- """.format(placeholders=placeholders)
1042
+ if not chunk_ids:
1043
+ return []
1044
+
1045
+ # Build parameterized query for IN clause
1046
+ placeholders = ",".join("?" * len(chunk_ids))
1047
+ _validate_sql_placeholders(placeholders, len(chunk_ids))
1048
+
1049
+ # SQL injection prevention:
1050
+ # - Only a validated placeholders string (commas + '?') is interpolated into the query.
1051
+ # - User-provided values are passed separately via sqlite3 parameters.
1052
+ # - Category filter is added as a separate parameter
1053
+ if category:
1054
+ query = """
1055
+ SELECT id, file_path, content, metadata
1056
+ FROM semantic_chunks
1057
+ WHERE id IN ({placeholders}) AND category = ?
1058
+ """.format(placeholders=placeholders)
1059
+ params = list(chunk_ids) + [category]
1060
+ else:
1061
+ query = """
1062
+ SELECT id, file_path, content, metadata
1063
+ FROM semantic_chunks
1064
+ WHERE id IN ({placeholders})
1065
+ """.format(placeholders=placeholders)
1066
+ params = chunk_ids
969
1067
 
970
1068
  with sqlite3.connect(self.db_path) as conn:
971
1069
  conn.execute("PRAGMA mmap_size = 30000000000")
972
- rows = conn.execute(query, chunk_ids).fetchall()
1070
+ rows = conn.execute(query, params).fetchall()
973
1071
 
974
1072
  # Build ID -> row mapping
975
1073
  id_to_row = {r[0]: r for r in rows}
@@ -1026,6 +1124,28 @@ class VectorStore:
1026
1124
  row = conn.execute("SELECT COUNT(*) FROM semantic_chunks").fetchone()
1027
1125
  return row[0] if row else 0
1028
1126
 
1127
+ def get_all_chunks(self) -> List[SemanticChunk]:
1128
+ """Get all chunks from the store.
1129
+
1130
+ Returns:
1131
+ List of SemanticChunk objects with id and content.
1132
+ """
1133
+ with sqlite3.connect(self.db_path) as conn:
1134
+ conn.row_factory = sqlite3.Row
1135
+ rows = conn.execute(
1136
+ "SELECT id, file_path, content, metadata FROM semantic_chunks"
1137
+ ).fetchall()
1138
+
1139
+ chunks = []
1140
+ for row in rows:
1141
+ chunks.append(SemanticChunk(
1142
+ id=row["id"],
1143
+ content=row["content"],
1144
+ file_path=row["file_path"],
1145
+ metadata=json.loads(row["metadata"]) if row["metadata"] else None,
1146
+ ))
1147
+ return chunks
1148
+
1029
1149
  def clear_cache(self) -> None:
1030
1150
  """Manually clear the embedding cache."""
1031
1151
  self._invalidate_cache()