claude-code-workflow 6.3.18 → 6.3.20

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 (832) 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/issue-plan-agent.md +31 -2
  6. package/.claude/agents/test-fix-agent.md +14 -0
  7. package/.claude/commands/issue/discover.md +41 -0
  8. package/.claude/commands/issue/execute.md +200 -19
  9. package/.claude/commands/issue/new.md +93 -3
  10. package/.claude/commands/issue/plan.md +9 -3
  11. package/.claude/commands/issue/queue.md +94 -39
  12. package/.claude/commands/memory/swagger-docs.md +773 -0
  13. package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
  14. package/.claude/commands/workflow/execute.md +54 -34
  15. package/.claude/commands/workflow/lite-execute.md +48 -164
  16. package/.claude/commands/workflow/lite-fix.md +4 -4
  17. package/.claude/commands/workflow/lite-plan.md +5 -5
  18. package/.claude/commands/workflow/plan.md +27 -27
  19. package/.claude/commands/workflow/review.md +42 -17
  20. package/.claude/commands/workflow/tdd-plan.md +25 -25
  21. package/.claude/commands/workflow/test-fix-gen.md +10 -10
  22. package/.claude/commands/workflow/test-gen.md +14 -14
  23. package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
  24. package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
  25. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
  26. package/.claude/skills/ccw/SKILL.md +462 -0
  27. package/.claude/skills/ccw/index/command-capabilities.json +127 -0
  28. package/.claude/skills/ccw/index/intent-rules.json +136 -0
  29. package/.claude/skills/ccw/index/workflow-chains.json +451 -0
  30. package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
  31. package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
  32. package/.claude/skills/ccw/phases/actions/docs.md +93 -0
  33. package/.claude/skills/ccw/phases/actions/full.md +154 -0
  34. package/.claude/skills/ccw/phases/actions/issue.md +201 -0
  35. package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
  36. package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
  37. package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
  38. package/.claude/skills/ccw/phases/actions/ui.md +79 -0
  39. package/.claude/skills/ccw/phases/orchestrator.md +435 -0
  40. package/.claude/skills/ccw/specs/intent-classification.md +336 -0
  41. package/.claude/skills/ccw-help/SKILL.md +177 -0
  42. package/.claude/skills/ccw-help/index/all-agents.json +82 -0
  43. package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
  44. package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
  45. package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
  46. package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
  47. package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
  48. package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
  49. package/.claude/skills/code-reviewer/README.md +340 -0
  50. package/.claude/skills/code-reviewer/SKILL.md +308 -0
  51. package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
  52. package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
  53. package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
  54. package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
  55. package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
  56. package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
  57. package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
  58. package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
  59. package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
  60. package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
  61. package/.claude/skills/skill-generator/SKILL.md +187 -0
  62. package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
  63. package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
  64. package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
  65. package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
  66. package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
  67. package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
  68. package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
  69. package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
  70. package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
  71. package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
  72. package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
  73. package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
  74. package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
  75. package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
  76. package/.claude/skills/skill-generator/templates/script-python.md +198 -0
  77. package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
  78. package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
  79. package/.claude/workflows/chinese-response.md +15 -28
  80. package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
  81. package/.claude/workflows/cli-tools-usage.md +221 -177
  82. package/.claude/workflows/windows-platform.md +13 -10
  83. package/.codex/prompts/issue-execute.md +310 -82
  84. package/.codex/prompts/issue-queue.md +22 -0
  85. package/.codex/prompts/lite-execute.md +36 -11
  86. package/README.md +309 -305
  87. package/ccw/README.md +10 -4
  88. package/ccw/dist/cli.d.ts.map +1 -1
  89. package/ccw/dist/cli.js +4 -1
  90. package/ccw/dist/cli.js.map +1 -1
  91. package/ccw/dist/commands/cli.d.ts.map +1 -1
  92. package/ccw/dist/commands/cli.js +131 -34
  93. package/ccw/dist/commands/cli.js.map +1 -1
  94. package/ccw/dist/commands/issue.d.ts +152 -0
  95. package/ccw/dist/commands/issue.d.ts.map +1 -1
  96. package/ccw/dist/commands/issue.js +550 -85
  97. package/ccw/dist/commands/issue.js.map +1 -1
  98. package/ccw/dist/commands/serve.d.ts +1 -0
  99. package/ccw/dist/commands/serve.d.ts.map +1 -1
  100. package/ccw/dist/commands/serve.js +12 -5
  101. package/ccw/dist/commands/serve.js.map +1 -1
  102. package/ccw/dist/commands/stop.d.ts.map +1 -1
  103. package/ccw/dist/commands/stop.js +29 -5
  104. package/ccw/dist/commands/stop.js.map +1 -1
  105. package/ccw/dist/commands/tool.d.ts.map +1 -1
  106. package/ccw/dist/commands/tool.js +19 -2
  107. package/ccw/dist/commands/tool.js.map +1 -1
  108. package/ccw/dist/commands/view.d.ts +1 -0
  109. package/ccw/dist/commands/view.d.ts.map +1 -1
  110. package/ccw/dist/commands/view.js +10 -3
  111. package/ccw/dist/commands/view.js.map +1 -1
  112. package/ccw/dist/config/cli-settings-manager.d.ts +86 -0
  113. package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -0
  114. package/ccw/dist/config/cli-settings-manager.js +392 -0
  115. package/ccw/dist/config/cli-settings-manager.js.map +1 -0
  116. package/ccw/dist/config/litellm-api-config-manager.d.ts +71 -5
  117. package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
  118. package/ccw/dist/config/litellm-api-config-manager.js +290 -20
  119. package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
  120. package/ccw/dist/core/auth/csrf-manager.d.ts +18 -0
  121. package/ccw/dist/core/auth/csrf-manager.d.ts.map +1 -0
  122. package/ccw/dist/core/auth/csrf-manager.js +80 -0
  123. package/ccw/dist/core/auth/csrf-manager.js.map +1 -0
  124. package/ccw/dist/core/auth/csrf-middleware.d.ts +8 -0
  125. package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -0
  126. package/ccw/dist/core/auth/csrf-middleware.js +141 -0
  127. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -0
  128. package/ccw/dist/core/auth/middleware.d.ts +15 -0
  129. package/ccw/dist/core/auth/middleware.d.ts.map +1 -0
  130. package/ccw/dist/core/auth/middleware.js +76 -0
  131. package/ccw/dist/core/auth/middleware.js.map +1 -0
  132. package/ccw/dist/core/auth/token-manager.d.ts +41 -0
  133. package/ccw/dist/core/auth/token-manager.d.ts.map +1 -0
  134. package/ccw/dist/core/auth/token-manager.js +171 -0
  135. package/ccw/dist/core/auth/token-manager.js.map +1 -0
  136. package/ccw/dist/core/cache-manager.d.ts +6 -6
  137. package/ccw/dist/core/cache-manager.d.ts.map +1 -1
  138. package/ccw/dist/core/cache-manager.js +70 -48
  139. package/ccw/dist/core/cache-manager.js.map +1 -1
  140. package/ccw/dist/core/claude-freshness.d.ts.map +1 -1
  141. package/ccw/dist/core/claude-freshness.js +23 -3
  142. package/ccw/dist/core/claude-freshness.js.map +1 -1
  143. package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
  144. package/ccw/dist/core/core-memory-store.js +2 -1
  145. package/ccw/dist/core/core-memory-store.js.map +1 -1
  146. package/ccw/dist/core/cors.d.ts +3 -0
  147. package/ccw/dist/core/cors.d.ts.map +1 -0
  148. package/ccw/dist/core/cors.js +10 -0
  149. package/ccw/dist/core/cors.js.map +1 -0
  150. package/ccw/dist/core/dashboard-generator-patch.js +0 -1
  151. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
  152. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  153. package/ccw/dist/core/dashboard-generator.js +417 -416
  154. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  155. package/ccw/dist/core/data-aggregator.js +2 -2
  156. package/ccw/dist/core/data-aggregator.js.map +1 -1
  157. package/ccw/dist/core/lite-scanner.d.ts +1 -1
  158. package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
  159. package/ccw/dist/core/lite-scanner.js +130 -127
  160. package/ccw/dist/core/lite-scanner.js.map +1 -1
  161. package/ccw/dist/core/routes/auth-routes.d.ts +12 -0
  162. package/ccw/dist/core/routes/auth-routes.d.ts.map +1 -0
  163. package/ccw/dist/core/routes/auth-routes.js +80 -0
  164. package/ccw/dist/core/routes/auth-routes.js.map +1 -0
  165. package/ccw/dist/core/routes/ccw-routes.d.ts +1 -14
  166. package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
  167. package/ccw/dist/core/routes/ccw-routes.js +9 -4
  168. package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
  169. package/ccw/dist/core/routes/claude-routes.d.ts +1 -14
  170. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  171. package/ccw/dist/core/routes/claude-routes.js +98 -39
  172. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  173. package/ccw/dist/core/routes/cli-routes.d.ts +14 -12
  174. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  175. package/ccw/dist/core/routes/cli-routes.js +122 -43
  176. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  177. package/ccw/dist/core/routes/cli-settings-routes.d.ts +11 -0
  178. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -0
  179. package/ccw/dist/core/routes/cli-settings-routes.js +204 -0
  180. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -0
  181. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts +6 -0
  182. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -0
  183. package/ccw/dist/core/routes/codexlens/config-handlers.js +1195 -0
  184. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -0
  185. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts +10 -0
  186. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -0
  187. package/ccw/dist/core/routes/codexlens/index-handlers.js +322 -0
  188. package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -0
  189. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts +6 -0
  190. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -0
  191. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +865 -0
  192. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -0
  193. package/ccw/dist/core/routes/codexlens/utils.d.ts +23 -0
  194. package/ccw/dist/core/routes/codexlens/utils.d.ts.map +1 -0
  195. package/ccw/dist/core/routes/codexlens/utils.js +85 -0
  196. package/ccw/dist/core/routes/codexlens/utils.js.map +1 -0
  197. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts +13 -0
  198. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts.map +1 -0
  199. package/ccw/dist/core/routes/codexlens/watcher-handlers.js +235 -0
  200. package/ccw/dist/core/routes/codexlens/watcher-handlers.js.map +1 -0
  201. package/ccw/dist/core/routes/codexlens-routes.d.ts +2 -11
  202. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  203. package/ccw/dist/core/routes/codexlens-routes.js +10 -981
  204. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  205. package/ccw/dist/core/routes/discovery-routes.d.ts +1 -35
  206. package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -1
  207. package/ccw/dist/core/routes/discovery-routes.js +25 -0
  208. package/ccw/dist/core/routes/discovery-routes.js.map +1 -1
  209. package/ccw/dist/core/routes/files-routes.d.ts +1 -14
  210. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  211. package/ccw/dist/core/routes/files-routes.js +57 -14
  212. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  213. package/ccw/dist/core/routes/graph-routes.d.ts +1 -14
  214. package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
  215. package/ccw/dist/core/routes/graph-routes.js +36 -37
  216. package/ccw/dist/core/routes/graph-routes.js.map +1 -1
  217. package/ccw/dist/core/routes/help-routes.d.ts +1 -14
  218. package/ccw/dist/core/routes/help-routes.d.ts.map +1 -1
  219. package/ccw/dist/core/routes/help-routes.js +5 -0
  220. package/ccw/dist/core/routes/help-routes.js.map +1 -1
  221. package/ccw/dist/core/routes/hooks-routes.d.ts +4 -14
  222. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  223. package/ccw/dist/core/routes/hooks-routes.js +43 -21
  224. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  225. package/ccw/dist/core/routes/issue-routes.d.ts +1 -34
  226. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
  227. package/ccw/dist/core/routes/issue-routes.js +24 -0
  228. package/ccw/dist/core/routes/issue-routes.js.map +1 -1
  229. package/ccw/dist/core/routes/litellm-api-routes.d.ts +1 -14
  230. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
  231. package/ccw/dist/core/routes/litellm-api-routes.js +513 -48
  232. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
  233. package/ccw/dist/core/routes/litellm-routes.d.ts +1 -14
  234. package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -1
  235. package/ccw/dist/core/routes/litellm-routes.js +28 -11
  236. package/ccw/dist/core/routes/litellm-routes.js.map +1 -1
  237. package/ccw/dist/core/routes/mcp-routes.d.ts +1 -14
  238. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
  239. package/ccw/dist/core/routes/mcp-routes.js +99 -30
  240. package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
  241. package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
  242. package/ccw/dist/core/routes/mcp-templates-db.js +30 -31
  243. package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
  244. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  245. package/ccw/dist/core/routes/memory-routes.js +74 -24
  246. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  247. package/ccw/dist/core/routes/nav-status-routes.d.ts +3 -0
  248. package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -0
  249. package/ccw/dist/core/routes/nav-status-routes.js +217 -0
  250. package/ccw/dist/core/routes/nav-status-routes.js.map +1 -0
  251. package/ccw/dist/core/routes/rules-routes.d.ts +1 -14
  252. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
  253. package/ccw/dist/core/routes/rules-routes.js +481 -58
  254. package/ccw/dist/core/routes/rules-routes.js.map +1 -1
  255. package/ccw/dist/core/routes/session-routes.d.ts +1 -14
  256. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
  257. package/ccw/dist/core/routes/session-routes.js +15 -3
  258. package/ccw/dist/core/routes/session-routes.js.map +1 -1
  259. package/ccw/dist/core/routes/skills-routes.d.ts +1 -14
  260. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  261. package/ccw/dist/core/routes/skills-routes.js +394 -112
  262. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  263. package/ccw/dist/core/routes/status-routes.d.ts +1 -14
  264. package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
  265. package/ccw/dist/core/routes/status-routes.js +4 -0
  266. package/ccw/dist/core/routes/status-routes.js.map +1 -1
  267. package/ccw/dist/core/routes/system-routes.d.ts +4 -10
  268. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  269. package/ccw/dist/core/routes/system-routes.js +6 -4
  270. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  271. package/ccw/dist/core/routes/types.d.ts +19 -0
  272. package/ccw/dist/core/routes/types.d.ts.map +1 -0
  273. package/ccw/dist/core/routes/types.js +2 -0
  274. package/ccw/dist/core/routes/types.js.map +1 -0
  275. package/ccw/dist/core/server.d.ts.map +1 -1
  276. package/ccw/dist/core/server.js +206 -29
  277. package/ccw/dist/core/server.js.map +1 -1
  278. package/ccw/dist/core/services/api-key-tester.d.ts +42 -0
  279. package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
  280. package/ccw/dist/core/services/api-key-tester.js +126 -0
  281. package/ccw/dist/core/services/api-key-tester.js.map +1 -0
  282. package/ccw/dist/core/services/health-check-service.d.ts +88 -0
  283. package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
  284. package/ccw/dist/core/services/health-check-service.js +293 -0
  285. package/ccw/dist/core/services/health-check-service.js.map +1 -0
  286. package/ccw/dist/core/websocket.d.ts +9 -7
  287. package/ccw/dist/core/websocket.d.ts.map +1 -1
  288. package/ccw/dist/core/websocket.js +9 -4
  289. package/ccw/dist/core/websocket.js.map +1 -1
  290. package/ccw/dist/tools/claude-cli-tools.d.ts +152 -28
  291. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  292. package/ccw/dist/tools/claude-cli-tools.js +490 -100
  293. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  294. package/ccw/dist/tools/cli-config-manager.d.ts +24 -8
  295. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
  296. package/ccw/dist/tools/cli-config-manager.js +76 -156
  297. package/ccw/dist/tools/cli-config-manager.js.map +1 -1
  298. package/ccw/dist/tools/cli-executor-core.d.ts +85 -0
  299. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -0
  300. package/ccw/dist/tools/cli-executor-core.js +1310 -0
  301. package/ccw/dist/tools/cli-executor-core.js.map +1 -0
  302. package/ccw/dist/tools/cli-executor-state.d.ts +241 -0
  303. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -0
  304. package/ccw/dist/tools/cli-executor-state.js +392 -0
  305. package/ccw/dist/tools/cli-executor-state.js.map +1 -0
  306. package/ccw/dist/tools/cli-executor-utils.d.ts +36 -0
  307. package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -0
  308. package/ccw/dist/tools/cli-executor-utils.js +298 -0
  309. package/ccw/dist/tools/cli-executor-utils.js.map +1 -0
  310. package/ccw/dist/tools/cli-executor.d.ts +3 -377
  311. package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
  312. package/ccw/dist/tools/cli-executor.js +3 -1884
  313. package/ccw/dist/tools/cli-executor.js.map +1 -1
  314. package/ccw/dist/tools/cli-history-store.d.ts +2 -0
  315. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  316. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  317. package/ccw/dist/tools/cli-output-converter.d.ts +192 -0
  318. package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -0
  319. package/ccw/dist/tools/cli-output-converter.js +1047 -0
  320. package/ccw/dist/tools/cli-output-converter.js.map +1 -0
  321. package/ccw/dist/tools/cli-prompt-builder.d.ts +113 -0
  322. package/ccw/dist/tools/cli-prompt-builder.d.ts.map +1 -0
  323. package/ccw/dist/tools/cli-prompt-builder.js +363 -0
  324. package/ccw/dist/tools/cli-prompt-builder.js.map +1 -0
  325. package/ccw/dist/tools/codex-lens.d.ts +15 -1
  326. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  327. package/ccw/dist/tools/codex-lens.js +289 -55
  328. package/ccw/dist/tools/codex-lens.js.map +1 -1
  329. package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -1
  330. package/ccw/dist/tools/detect-changed-modules.js +22 -4
  331. package/ccw/dist/tools/detect-changed-modules.js.map +1 -1
  332. package/ccw/dist/tools/index.d.ts.map +1 -1
  333. package/ccw/dist/tools/index.js +2 -0
  334. package/ccw/dist/tools/index.js.map +1 -1
  335. package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
  336. package/ccw/dist/tools/litellm-client.js +10 -4
  337. package/ccw/dist/tools/litellm-client.js.map +1 -1
  338. package/ccw/dist/tools/litellm-executor.d.ts +2 -4
  339. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
  340. package/ccw/dist/tools/litellm-executor.js +39 -8
  341. package/ccw/dist/tools/litellm-executor.js.map +1 -1
  342. package/ccw/dist/tools/native-session-discovery.d.ts +2 -0
  343. package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
  344. package/ccw/dist/tools/native-session-discovery.js +197 -1
  345. package/ccw/dist/tools/native-session-discovery.js.map +1 -1
  346. package/ccw/dist/tools/session-manager.d.ts.map +1 -1
  347. package/ccw/dist/tools/session-manager.js +79 -0
  348. package/ccw/dist/tools/session-manager.js.map +1 -1
  349. package/ccw/dist/tools/skill-context-loader.d.ts +15 -0
  350. package/ccw/dist/tools/skill-context-loader.d.ts.map +1 -0
  351. package/ccw/dist/tools/skill-context-loader.js +198 -0
  352. package/ccw/dist/tools/skill-context-loader.js.map +1 -0
  353. package/ccw/dist/tools/smart-search.d.ts +8 -3
  354. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  355. package/ccw/dist/tools/smart-search.js +378 -75
  356. package/ccw/dist/tools/smart-search.js.map +1 -1
  357. package/ccw/dist/types/cli-settings.d.ts +86 -0
  358. package/ccw/dist/types/cli-settings.d.ts.map +1 -0
  359. package/ccw/dist/types/cli-settings.js +54 -0
  360. package/ccw/dist/types/cli-settings.js.map +1 -0
  361. package/ccw/dist/types/litellm-api-config.d.ts +40 -1
  362. package/ccw/dist/types/litellm-api-config.d.ts.map +1 -1
  363. package/ccw/dist/utils/exec-constants.d.ts +25 -0
  364. package/ccw/dist/utils/exec-constants.d.ts.map +1 -0
  365. package/ccw/dist/utils/exec-constants.js +25 -0
  366. package/ccw/dist/utils/exec-constants.js.map +1 -0
  367. package/ccw/dist/utils/path-resolver.d.ts +1 -0
  368. package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
  369. package/ccw/dist/utils/path-resolver.js +48 -3
  370. package/ccw/dist/utils/path-resolver.js.map +1 -1
  371. package/ccw/dist/utils/path-validator.d.ts.map +1 -1
  372. package/ccw/dist/utils/path-validator.js +25 -6
  373. package/ccw/dist/utils/path-validator.js.map +1 -1
  374. package/ccw/dist/utils/python-utils.d.ts.map +1 -1
  375. package/ccw/dist/utils/python-utils.js +27 -7
  376. package/ccw/dist/utils/python-utils.js.map +1 -1
  377. package/ccw/dist/utils/shell-escape.d.ts +8 -0
  378. package/ccw/dist/utils/shell-escape.d.ts.map +1 -0
  379. package/ccw/dist/utils/shell-escape.js +24 -0
  380. package/ccw/dist/utils/shell-escape.js.map +1 -0
  381. package/ccw/dist/utils/uv-manager.d.ts +167 -0
  382. package/ccw/dist/utils/uv-manager.d.ts.map +1 -0
  383. package/ccw/dist/utils/uv-manager.js +644 -0
  384. package/ccw/dist/utils/uv-manager.js.map +1 -0
  385. package/ccw/src/cli.ts +4 -1
  386. package/ccw/src/commands/cli.ts +132 -34
  387. package/ccw/src/commands/issue.ts +605 -91
  388. package/ccw/src/commands/serve.ts +15 -5
  389. package/ccw/src/commands/stop.ts +32 -5
  390. package/ccw/src/commands/tool.ts +17 -2
  391. package/ccw/src/commands/view.ts +13 -3
  392. package/ccw/src/config/cli-settings-manager.ts +460 -0
  393. package/ccw/src/config/litellm-api-config-manager.ts +392 -57
  394. package/ccw/src/core/auth/csrf-manager.ts +104 -0
  395. package/ccw/src/core/auth/csrf-middleware.ts +159 -0
  396. package/ccw/src/core/auth/middleware.ts +94 -0
  397. package/ccw/src/core/auth/token-manager.ts +219 -0
  398. package/ccw/src/core/cache-manager.ts +64 -52
  399. package/ccw/src/core/claude-freshness.ts +26 -6
  400. package/ccw/src/core/core-memory-store.ts +2 -1
  401. package/ccw/src/core/cors.ts +10 -0
  402. package/ccw/src/core/dashboard-generator-patch.ts +47 -48
  403. package/ccw/src/core/dashboard-generator.ts +797 -744
  404. package/ccw/src/core/data-aggregator.ts +667 -667
  405. package/ccw/src/core/lite-scanner.ts +156 -140
  406. package/ccw/src/core/routes/auth-routes.ts +98 -0
  407. package/ccw/src/core/routes/ccw-routes.ts +10 -20
  408. package/ccw/src/core/routes/claude-routes.ts +101 -51
  409. package/ccw/src/core/routes/cli-routes.ts +152 -55
  410. package/ccw/src/core/routes/cli-settings-routes.ts +232 -0
  411. package/ccw/src/core/routes/codexlens/README.md +37 -0
  412. package/ccw/src/core/routes/codexlens/config-handlers.ts +1269 -0
  413. package/ccw/src/core/routes/codexlens/index-handlers.ts +354 -0
  414. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +931 -0
  415. package/ccw/src/core/routes/codexlens/utils.ts +96 -0
  416. package/ccw/src/core/routes/codexlens/watcher-handlers.ts +265 -0
  417. package/ccw/src/core/routes/codexlens-routes.ts +11 -1044
  418. package/ccw/src/core/routes/discovery-routes.ts +1 -12
  419. package/ccw/src/core/routes/files-routes.ts +112 -40
  420. package/ccw/src/core/routes/graph-routes.ts +39 -46
  421. package/ccw/src/core/routes/help-routes.ts +2 -12
  422. package/ccw/src/core/routes/hooks-routes.ts +83 -44
  423. package/ccw/src/core/routes/issue-routes.ts +1 -12
  424. package/ccw/src/core/routes/litellm-api-routes.ts +574 -60
  425. package/ccw/src/core/routes/litellm-routes.ts +35 -27
  426. package/ccw/src/core/routes/mcp-routes.ts +157 -60
  427. package/ccw/src/core/routes/mcp-routes.ts.backup +549 -550
  428. package/ccw/src/core/routes/mcp-templates-db.ts +267 -268
  429. package/ccw/src/core/routes/memory-routes.ts +76 -22
  430. package/ccw/src/core/routes/nav-status-routes.ts +231 -0
  431. package/ccw/src/core/routes/rules-routes.ts +600 -81
  432. package/ccw/src/core/routes/session-routes.ts +28 -22
  433. package/ccw/src/core/routes/skills-routes.ts +452 -132
  434. package/ccw/src/core/routes/status-routes.ts +1 -12
  435. package/ccw/src/core/routes/system-routes.ts +15 -22
  436. package/ccw/src/core/routes/types.ts +25 -0
  437. package/ccw/src/core/server.ts +657 -468
  438. package/ccw/src/core/services/api-key-tester.ts +160 -0
  439. package/ccw/src/core/services/health-check-service.ts +366 -0
  440. package/ccw/src/core/websocket.ts +20 -12
  441. package/ccw/src/templates/dashboard-css/01-base.css +109 -0
  442. package/ccw/src/templates/dashboard-css/10-cli-status.css +202 -0
  443. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +308 -0
  444. package/ccw/src/templates/dashboard-css/30-core-memory.css +20 -0
  445. package/ccw/src/templates/dashboard-css/31-api-settings.css +751 -14
  446. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +230 -2
  447. package/ccw/src/templates/dashboard-js/api.js +5 -0
  448. package/ccw/src/templates/dashboard-js/components/cli-status.js +279 -107
  449. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +262 -20
  450. package/ccw/src/templates/dashboard-js/components/hook-manager.js +105 -5
  451. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +317 -0
  452. package/ccw/src/templates/dashboard-js/components/navigation.js +45 -0
  453. package/ccw/src/templates/dashboard-js/components/notifications.js +128 -0
  454. package/ccw/src/templates/dashboard-js/i18n.js +4448 -3983
  455. package/ccw/src/templates/dashboard-js/main.js +71 -0
  456. package/ccw/src/templates/dashboard-js/services.js +289 -0
  457. package/ccw/src/templates/dashboard-js/views/api-settings.js +5613 -3361
  458. package/ccw/src/templates/dashboard-js/views/claude-manager.js +1 -7
  459. package/ccw/src/templates/dashboard-js/views/cli-manager.js +581 -87
  460. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +6101 -1965
  461. package/ccw/src/templates/dashboard-js/views/core-memory.js +129 -20
  462. package/ccw/src/templates/dashboard-js/views/hook-manager.js +17 -3
  463. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +63 -0
  464. package/ccw/src/templates/dashboard-js/views/project-overview.js +182 -37
  465. package/ccw/src/templates/dashboard-js/views/rules-manager.js +26 -3
  466. package/ccw/src/templates/dashboard-js/views/skills-manager.js +2 -42
  467. package/ccw/src/templates/dashboard.html +6 -0
  468. package/ccw/src/tools/README.md +29 -0
  469. package/ccw/src/tools/claude-cli-tools.ts +640 -125
  470. package/ccw/src/tools/cli-config-manager.ts +102 -172
  471. package/ccw/src/tools/cli-executor-core.ts +1533 -0
  472. package/ccw/src/tools/cli-executor-state.ts +560 -0
  473. package/ccw/src/tools/cli-executor-utils.ts +349 -0
  474. package/ccw/src/tools/cli-executor.ts +3 -2309
  475. package/ccw/src/tools/cli-history-store.ts +2 -0
  476. package/ccw/src/tools/cli-output-converter.ts +1237 -0
  477. package/ccw/src/tools/cli-prompt-builder.ts +487 -0
  478. package/ccw/src/tools/codex-lens.ts +324 -59
  479. package/ccw/src/tools/detect-changed-modules.ts +24 -6
  480. package/ccw/src/tools/index.ts +2 -0
  481. package/ccw/src/tools/litellm-client.ts +10 -4
  482. package/ccw/src/tools/litellm-executor.ts +146 -114
  483. package/ccw/src/tools/native-session-discovery.ts +209 -1
  484. package/ccw/src/tools/session-manager.ts +88 -0
  485. package/ccw/src/tools/skill-context-loader.ts +213 -0
  486. package/ccw/src/tools/smart-search.ts +427 -76
  487. package/ccw/src/types/cli-settings.ts +137 -0
  488. package/ccw/src/types/litellm-api-config.ts +55 -1
  489. package/ccw/src/utils/exec-constants.ts +24 -0
  490. package/ccw/src/utils/path-resolver.ts +49 -3
  491. package/ccw/src/utils/path-validator.ts +28 -6
  492. package/ccw/src/utils/python-utils.ts +140 -121
  493. package/ccw/src/utils/shell-escape.ts +30 -0
  494. package/ccw/src/utils/uv-manager.ts +796 -0
  495. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
  496. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
  497. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
  498. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
  499. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  500. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  501. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  502. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
  503. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
  504. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
  505. package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +270 -251
  506. package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +33 -0
  507. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
  508. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
  509. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
  510. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
  511. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
  512. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
  513. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
  514. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
  515. package/ccw-litellm/src/ccw_litellm/config/loader.py +343 -316
  516. package/ccw-litellm/src/ccw_litellm/config/models.py +162 -130
  517. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
  518. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
  519. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
  520. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
  521. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
  522. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
  523. package/codex-lens/pyproject.toml +43 -0
  524. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
  525. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
  526. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
  527. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
  528. package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
  529. package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
  530. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  531. package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
  532. package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
  533. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  534. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
  535. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
  536. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
  537. package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
  538. package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
  539. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
  540. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  541. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
  542. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.pyc +0 -0
  543. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  544. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-310.pyc +0 -0
  545. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.pyc +0 -0
  546. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  547. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-310.pyc +0 -0
  548. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.pyc +0 -0
  549. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  550. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-310.pyc +0 -0
  551. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
  552. package/codex-lens/src/codexlens/cli/commands.py +4416 -2295
  553. package/codex-lens/src/codexlens/cli/embedding_manager.py +777 -15
  554. package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
  555. package/codex-lens/src/codexlens/config.py +356 -12
  556. package/codex-lens/src/codexlens/entities.py +4 -1
  557. package/codex-lens/src/codexlens/env_config.py +304 -0
  558. package/codex-lens/src/codexlens/indexing/__init__.py +23 -1
  559. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  560. package/codex-lens/src/codexlens/indexing/__pycache__/embedding.cpython-313.pyc +0 -0
  561. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  562. package/codex-lens/src/codexlens/indexing/embedding.py +582 -0
  563. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +62 -28
  564. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
  565. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
  566. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
  567. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.pyc +0 -0
  568. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  569. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-310.pyc +0 -0
  570. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
  571. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
  572. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
  573. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  574. package/codex-lens/src/codexlens/parsers/factory.py +139 -10
  575. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +487 -13
  576. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
  577. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
  578. package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
  579. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
  580. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.pyc +0 -0
  581. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  582. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  583. package/codex-lens/src/codexlens/search/__pycache__/graph_expander.cpython-313.pyc +0 -0
  584. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
  585. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
  586. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  587. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
  588. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
  589. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  590. package/codex-lens/src/codexlens/search/binary_searcher.py +277 -0
  591. package/codex-lens/src/codexlens/search/chain_search.py +1652 -8
  592. package/codex-lens/src/codexlens/search/enrichment.py +21 -0
  593. package/codex-lens/src/codexlens/search/graph_expander.py +264 -0
  594. package/codex-lens/src/codexlens/search/hybrid_search.py +772 -37
  595. package/codex-lens/src/codexlens/search/ranking.py +397 -8
  596. package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +225 -0
  597. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
  598. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
  599. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
  600. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
  601. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  602. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
  603. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
  604. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
  605. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
  606. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
  607. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
  608. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
  609. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
  610. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
  611. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
  612. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
  613. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
  614. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  615. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  616. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  617. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  618. package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
  619. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
  620. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
  621. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
  622. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
  623. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.pyc +0 -0
  624. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  625. package/codex-lens/src/codexlens/semantic/ann_index.py +654 -0
  626. package/codex-lens/src/codexlens/semantic/chunker.py +328 -23
  627. package/codex-lens/src/codexlens/semantic/factory.py +63 -3
  628. package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
  629. package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
  630. package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
  631. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
  632. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-312.pyc +0 -0
  633. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
  634. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
  635. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-312.pyc +0 -0
  636. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
  637. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
  638. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-312.pyc +0 -0
  639. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
  640. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
  641. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-312.pyc +0 -0
  642. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
  643. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
  644. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-312.pyc +0 -0
  645. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
  646. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
  647. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-312.pyc +0 -0
  648. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
  649. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
  650. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
  651. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-312.pyc +0 -0
  652. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
  653. package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
  654. package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
  655. package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
  656. package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
  657. package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
  658. package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
  659. package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
  660. package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
  661. package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
  662. package/codex-lens/src/codexlens/storage/__init__.py +3 -0
  663. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
  664. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
  665. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  666. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
  667. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
  668. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  669. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
  670. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
  671. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
  672. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
  673. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  674. package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
  675. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
  676. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
  677. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
  678. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
  679. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
  680. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
  681. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
  682. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
  683. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.pyc +0 -0
  684. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  685. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-310.pyc +0 -0
  686. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
  687. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
  688. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
  689. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
  690. package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
  691. package/codex-lens/src/codexlens/storage/index_tree.py +240 -25
  692. package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
  693. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
  694. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
  695. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
  696. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
  697. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
  698. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
  699. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
  700. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
  701. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
  702. package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
  703. package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
  704. package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
  705. package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
  706. package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
  707. package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
  708. package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
  709. package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
  710. package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
  711. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
  712. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
  713. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
  714. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
  715. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
  716. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
  717. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
  718. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
  719. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
  720. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
  721. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
  722. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
  723. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
  724. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
  725. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
  726. package/codex-lens/src/codexlens/watcher/events.py +82 -0
  727. package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
  728. package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
  729. package/codex-lens/src/codexlens/watcher/manager.py +255 -0
  730. package/package.json +4 -1
  731. package/.claude/commands/workflow/docs/analyze.md +0 -1467
  732. package/.claude/commands/workflow/docs/copyright.md +0 -1265
  733. package/.claude/skills/command-guide/SKILL.md +0 -388
  734. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
  735. package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
  736. package/.claude/skills/command-guide/guides/examples.md +0 -537
  737. package/.claude/skills/command-guide/guides/getting-started.md +0 -242
  738. package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
  739. package/.claude/skills/command-guide/guides/index-structure.md +0 -326
  740. package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
  741. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
  742. package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
  743. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
  744. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
  745. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
  746. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
  747. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
  748. package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
  749. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
  750. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
  751. package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
  752. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
  753. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
  754. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
  755. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
  756. package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
  757. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
  758. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
  759. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
  760. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
  761. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
  762. package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
  763. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
  764. package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
  765. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
  766. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
  767. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
  768. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
  769. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
  770. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
  771. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
  772. package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
  773. package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
  774. package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
  775. package/.claude/skills/command-guide/reference/commands/version.md +0 -254
  776. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
  777. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
  778. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
  779. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
  780. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
  781. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
  782. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
  783. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
  784. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  785. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
  786. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
  787. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
  788. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
  789. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
  790. package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
  791. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
  792. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
  793. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
  794. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
  795. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
  796. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
  797. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
  798. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
  799. package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
  800. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
  801. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
  802. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
  803. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
  804. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
  805. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
  806. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
  807. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
  808. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
  809. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
  810. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
  811. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
  812. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
  813. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  814. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
  815. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
  816. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
  817. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
  818. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
  819. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
  820. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
  821. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
  822. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
  823. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
  824. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
  825. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
  826. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
  827. package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
  828. package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
  829. package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
  830. package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
  831. package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
  832. package/.claude/skills/command-guide/templates/issue-question.md +0 -141
@@ -17,6 +17,25 @@ except ImportError:
17
17
  def is_embedding_backend_available(_backend: str): # type: ignore[no-redef]
18
18
  return False, "codexlens.semantic not available"
19
19
 
20
+ try:
21
+ from codexlens.config import VECTORS_META_DB_NAME
22
+ except ImportError:
23
+ VECTORS_META_DB_NAME = "_vectors_meta.db"
24
+
25
+ try:
26
+ from codexlens.search.ranking import get_file_category
27
+ except ImportError:
28
+ def get_file_category(path: str): # type: ignore[no-redef]
29
+ """Fallback: map common extensions to category."""
30
+ ext = Path(path).suffix.lower()
31
+ code_exts = {".py", ".js", ".jsx", ".ts", ".tsx", ".java", ".go", ".c", ".cpp", ".rs"}
32
+ doc_exts = {".md", ".mdx", ".txt", ".rst"}
33
+ if ext in code_exts:
34
+ return "code"
35
+ elif ext in doc_exts:
36
+ return "doc"
37
+ return None
38
+
20
39
  logger = logging.getLogger(__name__)
21
40
 
22
41
  # Embedding batch size - larger values improve throughput on modern hardware
@@ -24,6 +43,105 @@ logger = logging.getLogger(__name__)
24
43
  EMBEDDING_BATCH_SIZE = 256
25
44
 
26
45
 
46
+ def calculate_dynamic_batch_size(config, embedder) -> int:
47
+ """Calculate batch size dynamically based on model token capacity.
48
+
49
+ This function computes an optimal batch size by considering:
50
+ - Maximum chunk character size from parsing rules
51
+ - Estimated tokens per chunk (chars / chars_per_token_estimate)
52
+ - Model's maximum token capacity
53
+ - Utilization factor (default 80% to leave headroom)
54
+
55
+ Args:
56
+ config: Config object with api_batch_size_* settings
57
+ embedder: Embedding model object with max_tokens property
58
+
59
+ Returns:
60
+ Calculated batch size, clamped to [1, api_batch_size_max]
61
+ """
62
+ # If dynamic calculation is disabled, return static value
63
+ if not getattr(config, 'api_batch_size_dynamic', False):
64
+ return getattr(config, 'api_batch_size', 8)
65
+
66
+ # Get maximum chunk character size from ALL parsing rules (not just default)
67
+ # This ensures we use the worst-case chunk size across all languages
68
+ parsing_rules = getattr(config, 'parsing_rules', {})
69
+ all_max_chunk_chars = [
70
+ rule.get('max_chunk_chars', 0)
71
+ for rule in parsing_rules.values()
72
+ if isinstance(rule, dict)
73
+ ]
74
+ max_chunk_chars = max(all_max_chunk_chars) if all_max_chunk_chars else 4000
75
+ if max_chunk_chars <= 0:
76
+ max_chunk_chars = 4000 # Final fallback
77
+
78
+ # Get characters per token estimate
79
+ chars_per_token = getattr(config, 'chars_per_token_estimate', 4)
80
+ if chars_per_token <= 0:
81
+ chars_per_token = 4 # Safe default
82
+
83
+ # Estimate tokens per chunk
84
+ estimated_tokens_per_chunk = max_chunk_chars / chars_per_token
85
+
86
+ # Prevent division by zero
87
+ if estimated_tokens_per_chunk <= 0:
88
+ return getattr(config, 'api_batch_size', 8)
89
+
90
+ # Get model's maximum token capacity
91
+ model_max_tokens = getattr(embedder, 'max_tokens', 8192)
92
+
93
+ # Get utilization factor (default 80%, max 95% to leave safety margin)
94
+ utilization_factor = getattr(config, 'api_batch_size_utilization_factor', 0.8)
95
+ if utilization_factor <= 0 or utilization_factor > 0.95:
96
+ if utilization_factor > 0.95:
97
+ logger.warning(
98
+ "Utilization factor %.2f exceeds safe limit 0.95. "
99
+ "Token estimation is approximate, high values risk API errors. "
100
+ "Clamping to 0.95.",
101
+ utilization_factor
102
+ )
103
+ utilization_factor = 0.95
104
+ else:
105
+ utilization_factor = 0.8
106
+
107
+ # Calculate safe token limit
108
+ safe_token_limit = model_max_tokens * utilization_factor
109
+
110
+ # Calculate dynamic batch size
111
+ dynamic_batch_size = int(safe_token_limit / estimated_tokens_per_chunk)
112
+
113
+ # Get maximum batch size limit
114
+ batch_size_max = getattr(config, 'api_batch_size_max', 2048)
115
+
116
+ # Clamp to [1, batch_size_max]
117
+ result = max(1, min(dynamic_batch_size, batch_size_max))
118
+
119
+ logger.debug(
120
+ "Dynamic batch size calculated: %d (max_chunk_chars=%d, chars_per_token=%d, "
121
+ "model_max_tokens=%d, utilization=%.1f%%, limit=%d)",
122
+ result, max_chunk_chars, chars_per_token, model_max_tokens,
123
+ utilization_factor * 100, batch_size_max
124
+ )
125
+
126
+ return result
127
+
128
+
129
+ def _build_categories_from_batch(chunk_batch: List[Tuple[Any, str]]) -> List[str]:
130
+ """Build categories list from chunk batch for index-level category filtering.
131
+
132
+ Args:
133
+ chunk_batch: List of (chunk, file_path) tuples
134
+
135
+ Returns:
136
+ List of category strings ('code' or 'doc'), defaulting to 'code' for unknown
137
+ """
138
+ categories = []
139
+ for _, file_path in chunk_batch:
140
+ cat = get_file_category(file_path)
141
+ categories.append(cat if cat else "code") # Default to 'code' for unknown extensions
142
+ return categories
143
+
144
+
27
145
  def _cleanup_fastembed_resources() -> None:
28
146
  """Best-effort cleanup for fastembed/ONNX resources (no-op for other backends)."""
29
147
  try:
@@ -33,6 +151,15 @@ def _cleanup_fastembed_resources() -> None:
33
151
  pass
34
152
 
35
153
 
154
+ def _cleanup_splade_resources() -> None:
155
+ """Release SPLADE encoder ONNX resources."""
156
+ try:
157
+ from codexlens.semantic.splade_encoder import clear_splade_cache
158
+ clear_splade_cache()
159
+ except Exception:
160
+ pass
161
+
162
+
36
163
  def _generate_chunks_from_cursor(
37
164
  cursor,
38
165
  chunker,
@@ -271,6 +398,7 @@ def generate_embeddings(
271
398
  endpoints: Optional[List] = None,
272
399
  strategy: Optional[str] = None,
273
400
  cooldown: Optional[float] = None,
401
+ splade_db_path: Optional[Path] = None,
274
402
  ) -> Dict[str, any]:
275
403
  """Generate embeddings for an index using memory-efficient batch processing.
276
404
 
@@ -300,6 +428,9 @@ def generate_embeddings(
300
428
  Each dict has keys: model, api_key, api_base, weight.
301
429
  strategy: Selection strategy for multi-endpoint mode (round_robin, latency_aware).
302
430
  cooldown: Default cooldown seconds for rate-limited endpoints.
431
+ splade_db_path: Optional path to centralized SPLADE database. If None, SPLADE
432
+ is written to index_path (legacy behavior). Use index_root / SPLADE_DB_NAME
433
+ for centralized storage.
303
434
 
304
435
  Returns:
305
436
  Result dictionary with generation statistics
@@ -404,10 +535,15 @@ def generate_embeddings(
404
535
 
405
536
  # skip_token_count=True: Use fast estimation (len/4) instead of expensive tiktoken
406
537
  # This significantly reduces CPU usage with minimal impact on metadata accuracy
538
+ # Load chunk stripping config from settings
539
+ from codexlens.config import Config
540
+ chunk_cfg = Config.load()
407
541
  chunker = Chunker(config=ChunkConfig(
408
542
  max_chunk_size=chunk_size,
409
543
  overlap=overlap,
410
- skip_token_count=True
544
+ skip_token_count=True,
545
+ strip_comments=getattr(chunk_cfg, 'chunk_strip_comments', True),
546
+ strip_docstrings=getattr(chunk_cfg, 'chunk_strip_docstrings', True),
411
547
  ))
412
548
 
413
549
  # Log embedder info with endpoint count for multi-endpoint mode
@@ -416,6 +552,14 @@ def generate_embeddings(
416
552
  progress_callback(f"Using {endpoint_count} API endpoints with {strategy} strategy")
417
553
  progress_callback(f"Using model: {embedder.model_name} ({embedder.embedding_dim} dimensions)")
418
554
 
555
+ # Calculate dynamic batch size based on model capacity
556
+ from codexlens.config import Config
557
+ batch_config = Config.load()
558
+ effective_batch_size = calculate_dynamic_batch_size(batch_config, embedder)
559
+
560
+ if progress_callback and batch_config.api_batch_size_dynamic:
561
+ progress_callback(f"Dynamic batch size: {effective_batch_size} (model max_tokens={getattr(embedder, 'max_tokens', 8192)})")
562
+
419
563
  except Exception as e:
420
564
  return {
421
565
  "success": False,
@@ -429,7 +573,7 @@ def generate_embeddings(
429
573
  total_chunks_created = 0
430
574
  total_files_processed = 0
431
575
  FILE_BATCH_SIZE = 100 # Process 100 files at a time
432
- # EMBEDDING_BATCH_SIZE is defined at module level (default: 256)
576
+ # effective_batch_size is calculated above (dynamic or EMBEDDING_BATCH_SIZE fallback)
433
577
 
434
578
  try:
435
579
  with VectorStore(index_path) as vector_store:
@@ -487,7 +631,7 @@ def generate_embeddings(
487
631
  # Fallback to fixed-size batching for backward compatibility
488
632
  def fixed_size_batches():
489
633
  while True:
490
- batch = list(islice(chunk_generator, EMBEDDING_BATCH_SIZE))
634
+ batch = list(islice(chunk_generator, effective_batch_size))
491
635
  if not batch:
492
636
  break
493
637
  yield batch
@@ -518,7 +662,7 @@ def generate_embeddings(
518
662
  for attempt in range(max_retries + 1):
519
663
  try:
520
664
  batch_contents = [chunk.content for chunk, _ in chunk_batch]
521
- embeddings_numpy = embedder.embed_to_numpy(batch_contents, batch_size=EMBEDDING_BATCH_SIZE)
665
+ embeddings_numpy = embedder.embed_to_numpy(batch_contents, batch_size=effective_batch_size)
522
666
  return batch_num, chunk_batch, embeddings_numpy, batch_files, None
523
667
 
524
668
  except Exception as e:
@@ -566,10 +710,11 @@ def generate_embeddings(
566
710
  try:
567
711
  # Generate embeddings
568
712
  batch_contents = [chunk.content for chunk, _ in chunk_batch]
569
- embeddings_numpy = embedder.embed_to_numpy(batch_contents, batch_size=EMBEDDING_BATCH_SIZE)
713
+ embeddings_numpy = embedder.embed_to_numpy(batch_contents, batch_size=effective_batch_size)
570
714
 
571
- # Store embeddings
572
- vector_store.add_chunks_batch_numpy(chunk_batch, embeddings_numpy)
715
+ # Store embeddings with category
716
+ categories = _build_categories_from_batch(chunk_batch)
717
+ vector_store.add_chunks_batch_numpy(chunk_batch, embeddings_numpy, categories=categories)
573
718
 
574
719
  files_seen.update(batch_files)
575
720
  total_chunks_created += len(chunk_batch)
@@ -621,7 +766,8 @@ def generate_embeddings(
621
766
  batch_num, chunk_batch, embeddings_numpy, batch_files, error = f.result()
622
767
  if embeddings_numpy is not None and error is None:
623
768
  # Write to DB in main thread (no contention)
624
- vector_store.add_chunks_batch_numpy(chunk_batch, embeddings_numpy)
769
+ categories = _build_categories_from_batch(chunk_batch)
770
+ vector_store.add_chunks_batch_numpy(chunk_batch, embeddings_numpy, categories=categories)
625
771
  total_chunks_created += len(chunk_batch)
626
772
  files_seen.update(batch_files)
627
773
  total_files_processed = len(files_seen)
@@ -658,7 +804,8 @@ def generate_embeddings(
658
804
  try:
659
805
  batch_num, chunk_batch, embeddings_numpy, batch_files, error = future.result()
660
806
  if embeddings_numpy is not None and error is None:
661
- vector_store.add_chunks_batch_numpy(chunk_batch, embeddings_numpy)
807
+ categories = _build_categories_from_batch(chunk_batch)
808
+ vector_store.add_chunks_batch_numpy(chunk_batch, embeddings_numpy, categories=categories)
662
809
  total_chunks_created += len(chunk_batch)
663
810
  files_seen.update(batch_files)
664
811
  total_files_processed = len(files_seen)
@@ -675,10 +822,97 @@ def generate_embeddings(
675
822
  if progress_callback:
676
823
  progress_callback(f"Finalizing index... Building ANN index for {total_chunks_created} chunks")
677
824
 
825
+ # --- SPLADE SPARSE ENCODING (after dense embeddings) ---
826
+ # Add SPLADE encoding if enabled in config
827
+ splade_success = False
828
+ splade_error = None
829
+
830
+ try:
831
+ from codexlens.config import Config, SPLADE_DB_NAME
832
+ config = Config.load()
833
+
834
+ if config.enable_splade:
835
+ from codexlens.semantic.splade_encoder import check_splade_available, get_splade_encoder
836
+ from codexlens.storage.splade_index import SpladeIndex
837
+
838
+ ok, err = check_splade_available()
839
+ if ok:
840
+ if progress_callback:
841
+ progress_callback(f"Generating SPLADE sparse vectors for {total_chunks_created} chunks...")
842
+
843
+ # Initialize SPLADE encoder and index
844
+ splade_encoder = get_splade_encoder(use_gpu=use_gpu)
845
+ # Use centralized SPLADE database if provided, otherwise fallback to index_path
846
+ effective_splade_path = splade_db_path if splade_db_path else index_path
847
+ splade_index = SpladeIndex(effective_splade_path)
848
+ splade_index.create_tables()
849
+
850
+ # Retrieve all chunks from database for SPLADE encoding
851
+ with sqlite3.connect(index_path) as conn:
852
+ conn.row_factory = sqlite3.Row
853
+ cursor = conn.execute("SELECT id, content FROM semantic_chunks ORDER BY id")
854
+
855
+ # Batch encode for efficiency
856
+ SPLADE_BATCH_SIZE = 32
857
+ batch_postings = []
858
+ chunk_batch = []
859
+ chunk_ids = []
860
+
861
+ for row in cursor:
862
+ chunk_id = row["id"]
863
+ content = row["content"]
864
+
865
+ chunk_ids.append(chunk_id)
866
+ chunk_batch.append(content)
867
+
868
+ # Process batch when full
869
+ if len(chunk_batch) >= SPLADE_BATCH_SIZE:
870
+ sparse_vecs = splade_encoder.encode_batch(chunk_batch, batch_size=SPLADE_BATCH_SIZE)
871
+ for cid, sparse_vec in zip(chunk_ids, sparse_vecs):
872
+ batch_postings.append((cid, sparse_vec))
873
+
874
+ chunk_batch = []
875
+ chunk_ids = []
876
+
877
+ # Process remaining chunks
878
+ if chunk_batch:
879
+ sparse_vecs = splade_encoder.encode_batch(chunk_batch, batch_size=SPLADE_BATCH_SIZE)
880
+ for cid, sparse_vec in zip(chunk_ids, sparse_vecs):
881
+ batch_postings.append((cid, sparse_vec))
882
+
883
+ # Batch insert all postings
884
+ if batch_postings:
885
+ splade_index.add_postings_batch(batch_postings)
886
+
887
+ # Set metadata
888
+ splade_index.set_metadata(
889
+ model_name=splade_encoder.model_name,
890
+ vocab_size=splade_encoder.vocab_size
891
+ )
892
+
893
+ splade_success = True
894
+ if progress_callback:
895
+ stats = splade_index.get_stats()
896
+ progress_callback(
897
+ f"SPLADE index created: {stats['total_postings']} postings, "
898
+ f"{stats['unique_tokens']} unique tokens"
899
+ )
900
+ else:
901
+ logger.debug("SPLADE not available: %s", err)
902
+ splade_error = f"SPLADE not available: {err}"
903
+ except Exception as e:
904
+ splade_error = str(e)
905
+ logger.warning("SPLADE encoding failed: %s", e)
906
+
907
+ # Report SPLADE status after processing
908
+ if progress_callback and not splade_success and splade_error:
909
+ progress_callback(f"SPLADE index: FAILED - {splade_error}")
910
+
678
911
  except Exception as e:
679
912
  # Cleanup on error to prevent process hanging
680
913
  try:
681
914
  _cleanup_fastembed_resources()
915
+ _cleanup_splade_resources()
682
916
  gc.collect()
683
917
  except Exception:
684
918
  pass
@@ -690,6 +924,7 @@ def generate_embeddings(
690
924
  # This is critical - without it, ONNX Runtime threads prevent Python from exiting
691
925
  try:
692
926
  _cleanup_fastembed_resources()
927
+ _cleanup_splade_resources()
693
928
  gc.collect()
694
929
  except Exception:
695
930
  pass
@@ -709,8 +944,10 @@ def generate_embeddings(
709
944
  }
710
945
 
711
946
 
712
- def discover_all_index_dbs(index_root: Path) -> List[Path]:
713
- """Recursively find all _index.db files in an index tree.
947
+ def _discover_index_dbs_internal(index_root: Path) -> List[Path]:
948
+ """Internal helper to find all _index.db files (no deprecation warning).
949
+
950
+ Used internally by generate_dense_embeddings_centralized.
714
951
 
715
952
  Args:
716
953
  index_root: Root directory to scan for _index.db files
@@ -724,6 +961,30 @@ def discover_all_index_dbs(index_root: Path) -> List[Path]:
724
961
  return sorted(index_root.rglob("_index.db"))
725
962
 
726
963
 
964
+ def discover_all_index_dbs(index_root: Path) -> List[Path]:
965
+ """Recursively find all _index.db files in an index tree.
966
+
967
+ .. deprecated::
968
+ This function is deprecated. Use centralized indexing with
969
+ ``generate_dense_embeddings_centralized`` instead, which handles
970
+ index discovery internally.
971
+
972
+ Args:
973
+ index_root: Root directory to scan for _index.db files
974
+
975
+ Returns:
976
+ Sorted list of paths to _index.db files
977
+ """
978
+ import warnings
979
+ warnings.warn(
980
+ "discover_all_index_dbs is deprecated. Use centralized indexing with "
981
+ "generate_dense_embeddings_centralized instead.",
982
+ DeprecationWarning,
983
+ stacklevel=2
984
+ )
985
+ return _discover_index_dbs_internal(index_root)
986
+
987
+
727
988
  def find_all_indexes(scan_dir: Path) -> List[Path]:
728
989
  """Find all _index.db files in directory tree.
729
990
 
@@ -757,6 +1018,11 @@ def generate_embeddings_recursive(
757
1018
  ) -> Dict[str, any]:
758
1019
  """Generate embeddings for all index databases in a project recursively.
759
1020
 
1021
+ .. deprecated::
1022
+ This function is deprecated. Use ``generate_dense_embeddings_centralized``
1023
+ instead, which creates a single centralized vector index for the entire project
1024
+ rather than per-directory indexes.
1025
+
760
1026
  Args:
761
1027
  index_root: Root index directory containing _index.db files
762
1028
  embedding_backend: Embedding backend to use (fastembed or litellm).
@@ -782,6 +1048,14 @@ def generate_embeddings_recursive(
782
1048
  Returns:
783
1049
  Aggregated result dictionary with generation statistics
784
1050
  """
1051
+ import warnings
1052
+ warnings.warn(
1053
+ "generate_embeddings_recursive is deprecated. Use "
1054
+ "generate_dense_embeddings_centralized instead for centralized indexing.",
1055
+ DeprecationWarning,
1056
+ stacklevel=2
1057
+ )
1058
+
785
1059
  # Get defaults from config if not specified
786
1060
  (default_backend, default_model, default_gpu,
787
1061
  default_endpoints, default_strategy, default_cooldown) = _get_embedding_defaults()
@@ -812,8 +1086,8 @@ def generate_embeddings_recursive(
812
1086
  else:
813
1087
  max_workers = 1
814
1088
 
815
- # Discover all _index.db files
816
- index_files = discover_all_index_dbs(index_root)
1089
+ # Discover all _index.db files (using internal helper to avoid double deprecation warning)
1090
+ index_files = _discover_index_dbs_internal(index_root)
817
1091
 
818
1092
  if not index_files:
819
1093
  return {
@@ -824,6 +1098,10 @@ def generate_embeddings_recursive(
824
1098
  if progress_callback:
825
1099
  progress_callback(f"Found {len(index_files)} index databases to process")
826
1100
 
1101
+ # Calculate centralized SPLADE database path
1102
+ from codexlens.config import SPLADE_DB_NAME
1103
+ splade_db_path = index_root / SPLADE_DB_NAME
1104
+
827
1105
  # Process each index database
828
1106
  all_results = []
829
1107
  total_chunks = 0
@@ -853,6 +1131,7 @@ def generate_embeddings_recursive(
853
1131
  endpoints=endpoints,
854
1132
  strategy=strategy,
855
1133
  cooldown=cooldown,
1134
+ splade_db_path=splade_db_path, # Use centralized SPLADE storage
856
1135
  )
857
1136
 
858
1137
  all_results.append({
@@ -874,6 +1153,7 @@ def generate_embeddings_recursive(
874
1153
  # Each generate_embeddings() call does its own cleanup, but do a final one to be safe
875
1154
  try:
876
1155
  _cleanup_fastembed_resources()
1156
+ _cleanup_splade_resources()
877
1157
  gc.collect()
878
1158
  except Exception:
879
1159
  pass
@@ -893,6 +1173,488 @@ def generate_embeddings_recursive(
893
1173
  }
894
1174
 
895
1175
 
1176
+ def generate_dense_embeddings_centralized(
1177
+ index_root: Path,
1178
+ embedding_backend: Optional[str] = None,
1179
+ model_profile: Optional[str] = None,
1180
+ force: bool = False,
1181
+ chunk_size: int = 2000,
1182
+ overlap: int = 200,
1183
+ progress_callback: Optional[callable] = None,
1184
+ use_gpu: Optional[bool] = None,
1185
+ max_tokens_per_batch: Optional[int] = None,
1186
+ max_workers: Optional[int] = None,
1187
+ endpoints: Optional[List] = None,
1188
+ strategy: Optional[str] = None,
1189
+ cooldown: Optional[float] = None,
1190
+ ) -> Dict[str, any]:
1191
+ """Generate dense embeddings with centralized vector storage.
1192
+
1193
+ This function creates a single HNSW index at the project root instead of
1194
+ per-directory indexes. All chunks from all _index.db files are combined
1195
+ into one central _vectors.hnsw file.
1196
+
1197
+ Target architecture:
1198
+ <index_root>/
1199
+ |-- _vectors.hnsw # Centralized dense vector ANN index
1200
+ |-- _splade.db # Centralized sparse vector index
1201
+ |-- src/
1202
+ |-- _index.db # No longer contains .hnsw file
1203
+
1204
+ Args:
1205
+ index_root: Root index directory containing _index.db files
1206
+ embedding_backend: Embedding backend (fastembed or litellm)
1207
+ model_profile: Model profile or name
1208
+ force: If True, regenerate even if embeddings exist
1209
+ chunk_size: Maximum chunk size in characters
1210
+ overlap: Overlap size in characters
1211
+ progress_callback: Optional callback for progress updates
1212
+ use_gpu: Whether to use GPU acceleration
1213
+ max_tokens_per_batch: Maximum tokens per batch
1214
+ max_workers: Maximum concurrent workers
1215
+ endpoints: Multi-endpoint configurations
1216
+ strategy: Endpoint selection strategy
1217
+ cooldown: Rate-limit cooldown seconds
1218
+
1219
+ Returns:
1220
+ Result dictionary with generation statistics
1221
+ """
1222
+ from codexlens.config import VECTORS_HNSW_NAME, SPLADE_DB_NAME
1223
+
1224
+ # Get defaults from config if not specified
1225
+ (default_backend, default_model, default_gpu,
1226
+ default_endpoints, default_strategy, default_cooldown) = _get_embedding_defaults()
1227
+
1228
+ if embedding_backend is None:
1229
+ embedding_backend = default_backend
1230
+ if model_profile is None:
1231
+ model_profile = default_model
1232
+ if use_gpu is None:
1233
+ use_gpu = default_gpu
1234
+ if endpoints is None:
1235
+ endpoints = default_endpoints
1236
+ if strategy is None:
1237
+ strategy = default_strategy
1238
+ if cooldown is None:
1239
+ cooldown = default_cooldown
1240
+
1241
+ # Calculate endpoint count for worker scaling
1242
+ endpoint_count = len(endpoints) if endpoints else 1
1243
+
1244
+ if max_workers is None:
1245
+ if embedding_backend == "litellm":
1246
+ if endpoint_count > 1:
1247
+ max_workers = endpoint_count * 2
1248
+ else:
1249
+ max_workers = 4
1250
+ else:
1251
+ max_workers = 1
1252
+
1253
+ backend_available, backend_error = is_embedding_backend_available(embedding_backend)
1254
+ if not backend_available:
1255
+ return {"success": False, "error": backend_error or "Embedding backend not available"}
1256
+
1257
+ # Discover all _index.db files
1258
+ index_files = _discover_index_dbs_internal(index_root)
1259
+
1260
+ if not index_files:
1261
+ return {
1262
+ "success": False,
1263
+ "error": f"No index databases found in {index_root}",
1264
+ }
1265
+
1266
+ if progress_callback:
1267
+ progress_callback(f"Found {len(index_files)} index databases for centralized embedding")
1268
+
1269
+ # Pre-calculate estimated chunk count for HNSW capacity
1270
+ # This avoids expensive resize operations during indexing
1271
+ estimated_total_files = 0
1272
+ for index_path in index_files:
1273
+ try:
1274
+ with sqlite3.connect(index_path) as conn:
1275
+ cursor = conn.execute("SELECT COUNT(*) FROM files")
1276
+ estimated_total_files += cursor.fetchone()[0]
1277
+ except Exception:
1278
+ pass
1279
+ # Heuristic: ~15 chunks per file on average
1280
+ estimated_chunks = max(100000, estimated_total_files * 15)
1281
+
1282
+ if progress_callback:
1283
+ progress_callback(f"Estimated {estimated_total_files} files, ~{estimated_chunks} chunks")
1284
+
1285
+ # Check for existing centralized index
1286
+ central_hnsw_path = index_root / VECTORS_HNSW_NAME
1287
+ if central_hnsw_path.exists() and not force:
1288
+ return {
1289
+ "success": False,
1290
+ "error": f"Centralized vector index already exists at {central_hnsw_path}. Use --force to regenerate.",
1291
+ }
1292
+
1293
+ # Initialize embedder
1294
+ try:
1295
+ from codexlens.semantic.factory import get_embedder as get_embedder_factory
1296
+ from codexlens.semantic.chunker import Chunker, ChunkConfig
1297
+ from codexlens.semantic.ann_index import ANNIndex
1298
+
1299
+ if embedding_backend == "fastembed":
1300
+ embedder = get_embedder_factory(backend="fastembed", profile=model_profile, use_gpu=use_gpu)
1301
+ elif embedding_backend == "litellm":
1302
+ embedder = get_embedder_factory(
1303
+ backend="litellm",
1304
+ model=model_profile,
1305
+ endpoints=endpoints if endpoints else None,
1306
+ strategy=strategy,
1307
+ cooldown=cooldown,
1308
+ )
1309
+ else:
1310
+ return {
1311
+ "success": False,
1312
+ "error": f"Invalid embedding backend: {embedding_backend}",
1313
+ }
1314
+
1315
+ # Load chunk stripping config from settings
1316
+ from codexlens.config import Config
1317
+ chunk_cfg = Config.load()
1318
+ chunker = Chunker(config=ChunkConfig(
1319
+ max_chunk_size=chunk_size,
1320
+ overlap=overlap,
1321
+ skip_token_count=True,
1322
+ strip_comments=getattr(chunk_cfg, 'chunk_strip_comments', True),
1323
+ strip_docstrings=getattr(chunk_cfg, 'chunk_strip_docstrings', True),
1324
+ ))
1325
+
1326
+ if progress_callback:
1327
+ if endpoint_count > 1:
1328
+ progress_callback(f"Using {endpoint_count} API endpoints with {strategy} strategy")
1329
+ progress_callback(f"Using model: {embedder.model_name} ({embedder.embedding_dim} dimensions)")
1330
+
1331
+ # Calculate dynamic batch size based on model capacity
1332
+ batch_config = chunk_cfg # Reuse already loaded config
1333
+ effective_batch_size = calculate_dynamic_batch_size(batch_config, embedder)
1334
+
1335
+ if progress_callback and batch_config.api_batch_size_dynamic:
1336
+ progress_callback(f"Dynamic batch size: {effective_batch_size} (model max_tokens={getattr(embedder, 'max_tokens', 8192)})")
1337
+
1338
+ except Exception as e:
1339
+ return {
1340
+ "success": False,
1341
+ "error": f"Failed to initialize components: {str(e)}",
1342
+ }
1343
+
1344
+ # Create centralized ANN index with pre-calculated capacity
1345
+ # Using estimated_chunks avoids expensive resize operations during indexing
1346
+ central_ann_index = ANNIndex.create_central(
1347
+ index_root=index_root,
1348
+ dim=embedder.embedding_dim,
1349
+ initial_capacity=estimated_chunks,
1350
+ auto_save=False,
1351
+ )
1352
+
1353
+ # Process all index databases
1354
+ start_time = time.time()
1355
+ failed_files = []
1356
+ total_chunks_created = 0
1357
+ total_files_processed = 0
1358
+ all_chunk_ids = []
1359
+ all_embeddings = []
1360
+
1361
+ # Track chunk ID to file_path mapping for metadata
1362
+ chunk_id_to_info: Dict[int, Dict[str, Any]] = {}
1363
+ next_chunk_id = 1
1364
+ # Track current index_path for source_index_db field
1365
+ current_index_path: Optional[str] = None
1366
+
1367
+ for idx, index_path in enumerate(index_files, 1):
1368
+ if progress_callback:
1369
+ try:
1370
+ rel_path = index_path.relative_to(index_root)
1371
+ except ValueError:
1372
+ rel_path = index_path
1373
+ progress_callback(f"Processing {idx}/{len(index_files)}: {rel_path}")
1374
+
1375
+ # Track current index_path for source_index_db
1376
+ current_index_path = str(index_path)
1377
+
1378
+ try:
1379
+ with sqlite3.connect(index_path) as conn:
1380
+ conn.row_factory = sqlite3.Row
1381
+ path_column = _get_path_column(conn)
1382
+
1383
+ # Get files from this index
1384
+ cursor = conn.execute(f"SELECT {path_column}, content, language FROM files")
1385
+ file_rows = cursor.fetchall()
1386
+
1387
+ for file_row in file_rows:
1388
+ file_path = file_row[path_column]
1389
+ content = file_row["content"]
1390
+ language = file_row["language"] or "python"
1391
+
1392
+ try:
1393
+ chunks = chunker.chunk_sliding_window(
1394
+ content,
1395
+ file_path=file_path,
1396
+ language=language
1397
+ )
1398
+
1399
+ if not chunks:
1400
+ continue
1401
+
1402
+ total_files_processed += 1
1403
+
1404
+ # Generate embeddings for this file's chunks
1405
+ batch_contents = [chunk.content for chunk in chunks]
1406
+ embeddings_numpy = embedder.embed_to_numpy(batch_contents, batch_size=effective_batch_size)
1407
+
1408
+ # Assign chunk IDs and store embeddings
1409
+ for i, chunk in enumerate(chunks):
1410
+ chunk_id = next_chunk_id
1411
+ next_chunk_id += 1
1412
+
1413
+ all_chunk_ids.append(chunk_id)
1414
+ all_embeddings.append(embeddings_numpy[i])
1415
+
1416
+ # Store metadata for later retrieval
1417
+ chunk_id_to_info[chunk_id] = {
1418
+ "file_path": file_path,
1419
+ "content": chunk.content,
1420
+ "metadata": chunk.metadata,
1421
+ "category": get_file_category(file_path) or "code",
1422
+ "source_index_db": current_index_path,
1423
+ }
1424
+ total_chunks_created += 1
1425
+
1426
+ except Exception as e:
1427
+ logger.error(f"Failed to process {file_path}: {e}")
1428
+ failed_files.append((file_path, str(e)))
1429
+
1430
+ except Exception as e:
1431
+ logger.error(f"Failed to read index {index_path}: {e}")
1432
+ failed_files.append((str(index_path), str(e)))
1433
+
1434
+ # Add all embeddings to centralized ANN index
1435
+ if all_embeddings:
1436
+ if progress_callback:
1437
+ progress_callback(f"Building centralized ANN index with {len(all_embeddings)} vectors...")
1438
+
1439
+ try:
1440
+ import numpy as np
1441
+ embeddings_matrix = np.vstack(all_embeddings)
1442
+ central_ann_index.add_vectors(all_chunk_ids, embeddings_matrix)
1443
+ central_ann_index.save()
1444
+
1445
+ if progress_callback:
1446
+ progress_callback(f"Saved centralized index to {central_hnsw_path}")
1447
+
1448
+ except Exception as e:
1449
+ return {
1450
+ "success": False,
1451
+ "error": f"Failed to build centralized ANN index: {str(e)}",
1452
+ }
1453
+
1454
+ # Store chunk metadata in a centralized metadata database
1455
+ vectors_meta_path = index_root / VECTORS_META_DB_NAME
1456
+ if chunk_id_to_info:
1457
+ if progress_callback:
1458
+ progress_callback(f"Storing {len(chunk_id_to_info)} chunk metadata records...")
1459
+
1460
+ try:
1461
+ from codexlens.storage.vector_meta_store import VectorMetadataStore
1462
+
1463
+ with VectorMetadataStore(vectors_meta_path) as meta_store:
1464
+ # Convert chunk_id_to_info dict to list of dicts for batch insert
1465
+ chunks_to_store = []
1466
+ for cid, info in chunk_id_to_info.items():
1467
+ metadata = info.get("metadata", {})
1468
+ chunks_to_store.append({
1469
+ "chunk_id": cid,
1470
+ "file_path": info["file_path"],
1471
+ "content": info["content"],
1472
+ "start_line": metadata.get("start_line"),
1473
+ "end_line": metadata.get("end_line"),
1474
+ "category": info.get("category"),
1475
+ "metadata": metadata,
1476
+ "source_index_db": info.get("source_index_db"),
1477
+ })
1478
+
1479
+ meta_store.add_chunks(chunks_to_store)
1480
+
1481
+ if progress_callback:
1482
+ progress_callback(f"Saved metadata to {vectors_meta_path}")
1483
+
1484
+ except Exception as e:
1485
+ logger.warning("Failed to store vector metadata: %s", e)
1486
+ # Non-fatal: continue without centralized metadata
1487
+
1488
+ # --- Binary Vector Generation for Cascade Search (Memory-Mapped) ---
1489
+ binary_success = False
1490
+ binary_count = 0
1491
+ try:
1492
+ from codexlens.config import Config, BINARY_VECTORS_MMAP_NAME
1493
+ config = Config.load()
1494
+
1495
+ if getattr(config, 'enable_binary_cascade', True) and all_embeddings:
1496
+ import numpy as np
1497
+
1498
+ if progress_callback:
1499
+ progress_callback(f"Generating binary vectors for {len(all_embeddings)} chunks...")
1500
+
1501
+ # Binarize dense vectors: sign(x) -> 1 if x > 0, 0 otherwise
1502
+ # Pack into bytes for efficient storage and Hamming distance computation
1503
+ embeddings_matrix = np.vstack(all_embeddings)
1504
+ binary_matrix = (embeddings_matrix > 0).astype(np.uint8)
1505
+
1506
+ # Pack bits into bytes (8 bits per byte) - vectorized for all rows
1507
+ packed_matrix = np.packbits(binary_matrix, axis=1)
1508
+ binary_count = len(packed_matrix)
1509
+
1510
+ # Save as memory-mapped file for efficient loading
1511
+ binary_mmap_path = index_root / BINARY_VECTORS_MMAP_NAME
1512
+ mmap_array = np.memmap(
1513
+ str(binary_mmap_path),
1514
+ dtype=np.uint8,
1515
+ mode='w+',
1516
+ shape=packed_matrix.shape
1517
+ )
1518
+ mmap_array[:] = packed_matrix
1519
+ mmap_array.flush()
1520
+ del mmap_array # Close the memmap
1521
+
1522
+ # Save metadata (shape and chunk_ids) to sidecar JSON
1523
+ import json
1524
+ meta_path = binary_mmap_path.with_suffix('.meta.json')
1525
+ with open(meta_path, 'w') as f:
1526
+ json.dump({
1527
+ 'shape': list(packed_matrix.shape),
1528
+ 'chunk_ids': all_chunk_ids,
1529
+ 'embedding_dim': embeddings_matrix.shape[1],
1530
+ }, f)
1531
+
1532
+ # Also store in DB for backward compatibility
1533
+ from codexlens.storage.vector_meta_store import VectorMetadataStore
1534
+ binary_packed_bytes = [row.tobytes() for row in packed_matrix]
1535
+ with VectorMetadataStore(vectors_meta_path) as meta_store:
1536
+ meta_store.add_binary_vectors(all_chunk_ids, binary_packed_bytes)
1537
+
1538
+ binary_success = True
1539
+ if progress_callback:
1540
+ progress_callback(f"Generated {binary_count} binary vectors ({embeddings_matrix.shape[1]} dims -> {packed_matrix.shape[1]} bytes, mmap: {binary_mmap_path.name})")
1541
+
1542
+ except Exception as e:
1543
+ logger.warning("Binary vector generation failed: %s", e)
1544
+ # Non-fatal: continue without binary vectors
1545
+
1546
+ # --- SPLADE Sparse Index Generation (Centralized) ---
1547
+ splade_success = False
1548
+ splade_chunks_count = 0
1549
+ try:
1550
+ from codexlens.config import Config
1551
+ config = Config.load()
1552
+
1553
+ if config.enable_splade and chunk_id_to_info:
1554
+ from codexlens.semantic.splade_encoder import check_splade_available, get_splade_encoder
1555
+ from codexlens.storage.splade_index import SpladeIndex
1556
+ import json
1557
+
1558
+ ok, err = check_splade_available()
1559
+ if ok:
1560
+ if progress_callback:
1561
+ progress_callback(f"Generating SPLADE sparse vectors for {len(chunk_id_to_info)} chunks...")
1562
+
1563
+ # Initialize SPLADE encoder and index
1564
+ splade_encoder = get_splade_encoder(use_gpu=use_gpu)
1565
+ splade_db_path = index_root / SPLADE_DB_NAME
1566
+ splade_index = SpladeIndex(splade_db_path)
1567
+ splade_index.create_tables()
1568
+
1569
+ # Batch encode for efficiency
1570
+ SPLADE_BATCH_SIZE = 32
1571
+ all_postings = []
1572
+ all_chunk_metadata = []
1573
+
1574
+ # Create batches from chunk_id_to_info
1575
+ chunk_items = list(chunk_id_to_info.items())
1576
+
1577
+ for i in range(0, len(chunk_items), SPLADE_BATCH_SIZE):
1578
+ batch_items = chunk_items[i:i + SPLADE_BATCH_SIZE]
1579
+ chunk_ids = [item[0] for item in batch_items]
1580
+ chunk_contents = [item[1]["content"] for item in batch_items]
1581
+
1582
+ # Generate sparse vectors
1583
+ sparse_vecs = splade_encoder.encode_batch(chunk_contents, batch_size=SPLADE_BATCH_SIZE)
1584
+ for cid, sparse_vec in zip(chunk_ids, sparse_vecs):
1585
+ all_postings.append((cid, sparse_vec))
1586
+
1587
+ if progress_callback and (i + SPLADE_BATCH_SIZE) % 100 == 0:
1588
+ progress_callback(f"SPLADE encoding: {min(i + SPLADE_BATCH_SIZE, len(chunk_items))}/{len(chunk_items)}")
1589
+
1590
+ # Batch insert all postings
1591
+ if all_postings:
1592
+ splade_index.add_postings_batch(all_postings)
1593
+
1594
+ # CRITICAL FIX: Populate splade_chunks table
1595
+ for cid, info in chunk_id_to_info.items():
1596
+ metadata_str = json.dumps(info.get("metadata", {})) if info.get("metadata") else None
1597
+ all_chunk_metadata.append((
1598
+ cid,
1599
+ info["file_path"],
1600
+ info["content"],
1601
+ metadata_str,
1602
+ info.get("source_index_db")
1603
+ ))
1604
+
1605
+ if all_chunk_metadata:
1606
+ splade_index.add_chunks_metadata_batch(all_chunk_metadata)
1607
+ splade_chunks_count = len(all_chunk_metadata)
1608
+
1609
+ # Set metadata
1610
+ splade_index.set_metadata(
1611
+ model_name=splade_encoder.model_name,
1612
+ vocab_size=splade_encoder.vocab_size
1613
+ )
1614
+
1615
+ splade_index.close()
1616
+ splade_success = True
1617
+
1618
+ if progress_callback:
1619
+ progress_callback(f"SPLADE index created: {len(all_postings)} postings, {splade_chunks_count} chunks")
1620
+
1621
+ else:
1622
+ if progress_callback:
1623
+ progress_callback(f"SPLADE not available, skipping sparse index: {err}")
1624
+
1625
+ except Exception as e:
1626
+ logger.warning("SPLADE encoding failed: %s", e)
1627
+ if progress_callback:
1628
+ progress_callback(f"SPLADE encoding failed: {e}")
1629
+
1630
+ elapsed_time = time.time() - start_time
1631
+
1632
+ # Cleanup
1633
+ try:
1634
+ _cleanup_fastembed_resources()
1635
+ gc.collect()
1636
+ except Exception:
1637
+ pass
1638
+
1639
+ return {
1640
+ "success": True,
1641
+ "result": {
1642
+ "chunks_created": total_chunks_created,
1643
+ "files_processed": total_files_processed,
1644
+ "files_failed": len(failed_files),
1645
+ "elapsed_time": elapsed_time,
1646
+ "model_profile": model_profile,
1647
+ "model_name": embedder.model_name,
1648
+ "central_index_path": str(central_hnsw_path),
1649
+ "failed_files": failed_files[:5],
1650
+ "splade_success": splade_success,
1651
+ "splade_chunks": splade_chunks_count,
1652
+ "binary_success": binary_success,
1653
+ "binary_count": binary_count,
1654
+ },
1655
+ }
1656
+
1657
+
896
1658
  def get_embeddings_status(index_root: Path) -> Dict[str, any]:
897
1659
  """Get comprehensive embeddings coverage status for all indexes.
898
1660
 
@@ -902,7 +1664,7 @@ def get_embeddings_status(index_root: Path) -> Dict[str, any]:
902
1664
  Returns:
903
1665
  Aggregated status with coverage statistics, model info, and timestamps
904
1666
  """
905
- index_files = discover_all_index_dbs(index_root)
1667
+ index_files = _discover_index_dbs_internal(index_root)
906
1668
 
907
1669
  if not index_files:
908
1670
  return {
@@ -1071,7 +1833,7 @@ def scan_for_model_conflicts(
1071
1833
  - conflicts: List of conflicting index paths with their configs
1072
1834
  - indexes_with_embeddings: Count of indexes that have embeddings
1073
1835
  """
1074
- index_files = discover_all_index_dbs(index_root)
1836
+ index_files = _discover_index_dbs_internal(index_root)
1075
1837
 
1076
1838
  if not index_files:
1077
1839
  return {