claude-code-workflow 6.1.4 → 6.2.2

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 (437) hide show
  1. package/.claude/CLAUDE.md +10 -0
  2. package/.claude/agents/action-planning-agent.md +857 -778
  3. package/.claude/agents/cli-execution-agent.md +266 -269
  4. package/.claude/agents/cli-explore-agent.md +2 -2
  5. package/.claude/agents/cli-lite-planning-agent.md +142 -92
  6. package/.claude/agents/cli-planning-agent.md +4 -4
  7. package/.claude/agents/code-developer.md +7 -6
  8. package/.claude/agents/conceptual-planning-agent.md +2 -2
  9. package/.claude/agents/context-search-agent.md +31 -32
  10. package/.claude/agents/doc-generator.md +4 -4
  11. package/.claude/agents/memory-bridge.md +93 -93
  12. package/.claude/agents/test-context-search-agent.md +8 -7
  13. package/.claude/agents/test-fix-agent.md +7 -6
  14. package/.claude/commands/clean.md +516 -0
  15. package/.claude/commands/memory/compact.md +383 -0
  16. package/.claude/commands/memory/docs-full-cli.md +471 -471
  17. package/.claude/commands/memory/docs-related-cli.md +386 -386
  18. package/.claude/commands/memory/docs.md +615 -615
  19. package/.claude/commands/memory/load.md +5 -5
  20. package/.claude/commands/memory/tech-research-rules.md +310 -0
  21. package/.claude/commands/memory/update-full.md +332 -332
  22. package/.claude/commands/memory/workflow-skill-memory.md +4 -4
  23. package/.claude/commands/task/create.md +151 -151
  24. package/.claude/commands/version.md +254 -254
  25. package/.claude/commands/workflow/brainstorm/api-designer.md +587 -585
  26. package/.claude/commands/workflow/brainstorm/artifacts.md +1 -0
  27. package/.claude/commands/workflow/brainstorm/auto-parallel.md +443 -443
  28. package/.claude/commands/workflow/brainstorm/data-architect.md +220 -220
  29. package/.claude/commands/workflow/brainstorm/product-manager.md +200 -200
  30. package/.claude/commands/workflow/brainstorm/product-owner.md +200 -200
  31. package/.claude/commands/workflow/brainstorm/scrum-master.md +200 -200
  32. package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
  33. package/.claude/commands/workflow/brainstorm/system-architect.md +389 -387
  34. package/.claude/commands/workflow/brainstorm/ui-designer.md +221 -221
  35. package/.claude/commands/workflow/brainstorm/ux-expert.md +221 -221
  36. package/.claude/commands/workflow/debug.md +321 -0
  37. package/.claude/commands/workflow/execute.md +13 -0
  38. package/.claude/commands/workflow/init.md +165 -164
  39. package/.claude/commands/workflow/lite-execute.md +119 -13
  40. package/.claude/commands/workflow/lite-fix.md +623 -621
  41. package/.claude/commands/workflow/lite-plan.md +610 -592
  42. package/.claude/commands/workflow/plan.md +5 -5
  43. package/.claude/commands/workflow/review-module-cycle.md +2 -0
  44. package/.claude/commands/workflow/review-session-cycle.md +2 -0
  45. package/.claude/commands/workflow/review.md +297 -291
  46. package/.claude/commands/workflow/session/complete.md +153 -500
  47. package/.claude/commands/workflow/session/list.md +95 -95
  48. package/.claude/commands/workflow/session/resume.md +60 -60
  49. package/.claude/commands/workflow/session/start.md +199 -199
  50. package/.claude/commands/workflow/tdd-plan.md +3 -3
  51. package/.claude/commands/workflow/tdd-verify.md +23 -9
  52. package/.claude/commands/workflow/test-cycle-execute.md +2 -0
  53. package/.claude/commands/workflow/test-fix-gen.md +699 -699
  54. package/.claude/commands/workflow/tools/conflict-resolution.md +104 -18
  55. package/.claude/commands/workflow/tools/context-gather.md +436 -434
  56. package/.claude/commands/workflow/tools/task-generate-agent.md +490 -291
  57. package/.claude/commands/workflow/tools/task-generate-tdd.md +18 -10
  58. package/.claude/commands/workflow/tools/test-concept-enhanced.md +2 -1
  59. package/.claude/commands/workflow/tools/test-context-gather.md +1 -0
  60. package/.claude/commands/workflow/tools/test-task-generate.md +1 -0
  61. package/.claude/commands/workflow/ui-design/import-from-code.md +9 -6
  62. package/.claude/skills/command-guide/SKILL.md +5 -5
  63. package/.claude/skills/command-guide/index/all-commands.json +1 -1
  64. package/.claude/skills/command-guide/index/by-category.json +1 -1
  65. package/.claude/skills/command-guide/index/by-use-case.json +1 -1
  66. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +857 -778
  67. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +266 -269
  68. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +2 -2
  69. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +142 -92
  70. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +4 -4
  71. package/.claude/skills/command-guide/reference/agents/code-developer.md +7 -6
  72. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +2 -2
  73. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +31 -32
  74. package/.claude/skills/command-guide/reference/agents/doc-generator.md +4 -4
  75. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
  76. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +8 -7
  77. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +7 -6
  78. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
  79. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
  80. package/.claude/skills/command-guide/reference/commands/memory/docs.md +17 -16
  81. package/.claude/skills/command-guide/reference/commands/memory/load.md +5 -5
  82. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +194 -357
  83. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
  84. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +4 -4
  85. package/.claude/skills/command-guide/reference/commands/task/create.md +151 -151
  86. package/.claude/skills/command-guide/reference/commands/version.md +254 -254
  87. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +585 -585
  88. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +443 -443
  89. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +220 -220
  90. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +200 -200
  91. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +200 -200
  92. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +200 -200
  93. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
  94. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +387 -387
  95. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +221 -221
  96. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +221 -221
  97. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +25 -20
  98. package/.claude/skills/command-guide/reference/commands/workflow/init.md +164 -164
  99. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +748 -686
  100. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +664 -621
  101. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +645 -592
  102. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +5 -5
  103. package/.claude/skills/command-guide/reference/commands/workflow/review.md +25 -18
  104. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +547 -500
  105. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +45 -27
  106. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +35 -19
  107. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +90 -33
  108. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +3 -3
  109. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +23 -9
  110. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +699 -699
  111. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +103 -17
  112. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
  113. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +487 -291
  114. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +17 -10
  115. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +1 -1
  116. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +6 -6
  117. package/.claude/workflows/chinese-response.md +38 -0
  118. package/.claude/workflows/cli-templates/prompts/rules/rule-api.txt +122 -0
  119. package/.claude/workflows/cli-templates/prompts/rules/rule-components.txt +122 -0
  120. package/.claude/workflows/cli-templates/prompts/rules/rule-config.txt +89 -0
  121. package/.claude/workflows/cli-templates/prompts/rules/rule-core.txt +60 -0
  122. package/.claude/workflows/cli-templates/prompts/rules/rule-patterns.txt +70 -0
  123. package/.claude/workflows/cli-templates/prompts/rules/rule-testing.txt +81 -0
  124. package/.claude/workflows/cli-templates/prompts/rules/tech-rules-agent-prompt.txt +89 -0
  125. package/.claude/workflows/cli-templates/prompts/workflow/gemini-solution-design.txt +131 -131
  126. package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +5 -9
  127. package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +5 -9
  128. package/.claude/workflows/cli-templates/protocols/analysis-protocol.md +112 -0
  129. package/.claude/workflows/cli-templates/protocols/write-protocol.md +201 -0
  130. package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +137 -0
  131. package/.claude/workflows/cli-templates/schemas/debug-log-json-schema.json +127 -0
  132. package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +25 -0
  133. package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +25 -0
  134. package/.claude/workflows/cli-tools-usage.md +526 -0
  135. package/{CLAUDE.md → .claude/workflows/coding-philosophy.md} +24 -45
  136. package/.claude/workflows/context-tools.md +84 -0
  137. package/.claude/workflows/file-modification.md +64 -0
  138. package/.claude/workflows/tool-strategy.md +216 -79
  139. package/.claude/workflows/windows-platform.md +16 -0
  140. package/.claude/workflows/workflow-architecture.md +942 -942
  141. package/.codex/AGENTS.md +63 -330
  142. package/.codex/prompts/debug.md +318 -0
  143. package/.codex/prompts/execute.md +273 -0
  144. package/.codex/prompts/lite-execute.md +164 -0
  145. package/.codex/prompts/lite-plan.md +469 -0
  146. package/.codex/prompts.zip +0 -0
  147. package/.gemini/GEMINI.md +25 -164
  148. package/.qwen/QWEN.md +0 -139
  149. package/README.md +29 -9
  150. package/ccw/README.md +30 -6
  151. package/ccw/bin/ccw-mcp.js +7 -0
  152. package/ccw/bin/ccw.js +9 -9
  153. package/ccw/package.json +65 -47
  154. package/ccw/src/.workflow/.cli-history/history.db +0 -0
  155. package/ccw/src/.workflow/.cli-history/history.db-shm +0 -0
  156. package/ccw/src/.workflow/.cli-history/history.db-wal +0 -0
  157. package/ccw/src/cli.ts +244 -0
  158. package/ccw/src/commands/cli.ts +740 -0
  159. package/ccw/src/commands/core-memory.ts +770 -0
  160. package/ccw/src/commands/hook.ts +315 -0
  161. package/ccw/src/commands/install.ts +519 -0
  162. package/ccw/src/commands/{list.js → list.ts} +1 -1
  163. package/ccw/src/commands/memory.ts +1090 -0
  164. package/ccw/src/commands/{serve.js → serve.ts} +14 -5
  165. package/ccw/src/commands/session-path-resolver.ts +372 -0
  166. package/ccw/src/commands/session.ts +1141 -0
  167. package/ccw/src/commands/{stop.js → stop.ts} +16 -6
  168. package/ccw/src/commands/tool.ts +201 -0
  169. package/ccw/src/commands/{uninstall.js → uninstall.ts} +89 -40
  170. package/ccw/src/commands/{upgrade.js → upgrade.ts} +68 -23
  171. package/ccw/src/commands/{view.js → view.ts} +22 -8
  172. package/ccw/src/config/storage-paths.ts +670 -0
  173. package/ccw/src/core/cache-manager.ts +294 -0
  174. package/ccw/src/core/claude-freshness.ts +319 -0
  175. package/ccw/src/core/core-memory-store.ts +1528 -0
  176. package/ccw/src/core/{dashboard-generator-patch.js → dashboard-generator-patch.ts} +18 -0
  177. package/ccw/src/core/{dashboard-generator.js → dashboard-generator.ts} +69 -12
  178. package/ccw/src/core/data-aggregator.ts +584 -0
  179. package/ccw/src/core/history-importer.ts +625 -0
  180. package/ccw/src/core/{lite-scanner.js → lite-scanner-complete.ts} +162 -66
  181. package/ccw/src/core/lite-scanner.ts +469 -0
  182. package/ccw/src/core/{manifest.js → manifest.ts} +104 -34
  183. package/ccw/src/core/memory-embedder-bridge.ts +262 -0
  184. package/ccw/src/core/memory-store.ts +978 -0
  185. package/ccw/src/core/routes/ccw-routes.ts +96 -0
  186. package/ccw/src/core/routes/claude-routes.ts +1183 -0
  187. package/ccw/src/core/routes/cli-routes.ts +561 -0
  188. package/ccw/src/core/routes/codexlens-routes.ts +806 -0
  189. package/ccw/src/core/routes/core-memory-routes.ts +605 -0
  190. package/ccw/src/core/routes/files-routes.ts +428 -0
  191. package/ccw/src/core/routes/graph-routes.md +164 -0
  192. package/ccw/src/core/routes/graph-routes.ts +626 -0
  193. package/ccw/src/core/routes/help-routes.ts +308 -0
  194. package/ccw/src/core/routes/hooks-routes.ts +405 -0
  195. package/ccw/src/core/routes/mcp-routes.ts +1271 -0
  196. package/ccw/src/core/routes/mcp-routes.ts.backup +550 -0
  197. package/ccw/src/core/routes/mcp-templates-db.ts +268 -0
  198. package/ccw/src/core/routes/memory-routes.ts +1206 -0
  199. package/ccw/src/core/routes/rules-routes.ts +526 -0
  200. package/ccw/src/core/routes/session-routes.ts +467 -0
  201. package/ccw/src/core/routes/skills-routes.ts +599 -0
  202. package/ccw/src/core/routes/status-routes.ts +57 -0
  203. package/ccw/src/core/routes/system-routes.ts +427 -0
  204. package/ccw/src/core/server.ts +431 -0
  205. package/ccw/src/core/session-clustering-service.ts +1258 -0
  206. package/ccw/src/core/session-scanner.ts +283 -0
  207. package/ccw/src/core/websocket.ts +190 -0
  208. package/ccw/src/{index.js → index.ts} +1 -0
  209. package/ccw/src/mcp-server/index.ts +186 -0
  210. package/ccw/src/templates/assets/css/github-dark.min.css +10 -0
  211. package/ccw/src/templates/assets/css/github.min.css +10 -0
  212. package/ccw/src/templates/assets/js/cytoscape.min.js +32 -0
  213. package/ccw/src/templates/assets/js/d3.min.js +2 -0
  214. package/ccw/src/templates/assets/js/highlight.min.js +1244 -0
  215. package/ccw/src/templates/assets/js/lucide.min.js +12 -0
  216. package/ccw/src/templates/assets/js/marked.min.js +69 -0
  217. package/ccw/src/templates/assets/js/tailwind.js +83 -0
  218. package/ccw/src/templates/dashboard-css/01-base.css +11 -0
  219. package/ccw/src/templates/dashboard-css/02-session.css +22 -0
  220. package/ccw/src/templates/dashboard-css/04-lite-tasks.css +10 -0
  221. package/ccw/src/templates/dashboard-css/06-cards.css +10 -4
  222. package/ccw/src/templates/dashboard-css/07-managers.css +1178 -7
  223. package/ccw/src/templates/dashboard-css/09-explorer.css +23 -12
  224. package/ccw/src/templates/dashboard-css/10-cli-status.css +337 -0
  225. package/ccw/src/templates/dashboard-css/11-cli-history.css +271 -0
  226. package/ccw/src/templates/dashboard-css/12-cli-legacy.css +796 -0
  227. package/ccw/src/templates/dashboard-css/13-cli-ccw.css +199 -0
  228. package/ccw/src/templates/dashboard-css/14-cli-modals.css +258 -0
  229. package/ccw/src/templates/dashboard-css/15-cli-endpoints.css +305 -0
  230. package/ccw/src/templates/dashboard-css/16-cli-session.css +241 -0
  231. package/ccw/src/templates/dashboard-css/17-cli-conversation.css +283 -0
  232. package/ccw/src/templates/dashboard-css/18-cli-settings.css +160 -0
  233. package/ccw/src/templates/dashboard-css/19-cli-native-session.css +496 -0
  234. package/ccw/src/templates/dashboard-css/20-cli-taskqueue.css +188 -0
  235. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +310 -0
  236. package/ccw/src/templates/dashboard-css/22-cli-semantic.css +240 -0
  237. package/ccw/src/templates/dashboard-css/23-memory.css +2390 -0
  238. package/ccw/src/templates/dashboard-css/24-prompt-history.css +1089 -0
  239. package/ccw/src/templates/dashboard-css/25-skills-rules.css +326 -0
  240. package/ccw/src/templates/dashboard-css/26-claude-manager.css +908 -0
  241. package/ccw/src/templates/dashboard-css/27-graph-explorer.css +1678 -0
  242. package/ccw/src/templates/dashboard-css/28-mcp-manager.css +748 -0
  243. package/ccw/src/templates/dashboard-css/29-help.css +264 -0
  244. package/ccw/src/templates/dashboard-css/30-core-memory.css +1700 -0
  245. package/ccw/src/templates/dashboard-js/api.js +162 -142
  246. package/ccw/src/templates/dashboard-js/components/carousel.js +4 -4
  247. package/ccw/src/templates/dashboard-js/components/cli-history.js +876 -0
  248. package/ccw/src/templates/dashboard-js/components/cli-status.js +978 -0
  249. package/ccw/src/templates/dashboard-js/components/global-notifications.js +508 -219
  250. package/ccw/src/templates/dashboard-js/components/hook-manager.js +1277 -282
  251. package/ccw/src/templates/dashboard-js/components/index-manager.js +302 -0
  252. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +718 -27
  253. package/ccw/src/templates/dashboard-js/components/modals.js +66 -0
  254. package/ccw/src/templates/dashboard-js/components/navigation.js +80 -12
  255. package/ccw/src/templates/dashboard-js/components/notifications.js +758 -194
  256. package/ccw/src/templates/dashboard-js/components/storage-manager.js +478 -0
  257. package/ccw/src/templates/dashboard-js/components/tabs-other.js +157 -6
  258. package/ccw/src/templates/dashboard-js/components/task-queue-sidebar.js +716 -0
  259. package/ccw/src/templates/dashboard-js/help-i18n.js +272 -0
  260. package/ccw/src/templates/dashboard-js/i18n.js +2807 -0
  261. package/ccw/src/templates/dashboard-js/main.js +15 -0
  262. package/ccw/src/templates/dashboard-js/state.js +243 -42
  263. package/ccw/src/templates/dashboard-js/utils.js +47 -1
  264. package/ccw/src/templates/dashboard-js/views/claude-manager.js +912 -0
  265. package/ccw/src/templates/dashboard-js/views/cli-manager.js +2272 -0
  266. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +964 -0
  267. package/ccw/src/templates/dashboard-js/views/core-memory-clusters.js +503 -0
  268. package/ccw/src/templates/dashboard-js/views/core-memory.js +782 -0
  269. package/ccw/src/templates/dashboard-js/views/explorer.js +888 -852
  270. package/ccw/src/templates/dashboard-js/views/graph-explorer.js +1157 -0
  271. package/ccw/src/templates/dashboard-js/views/help.js +856 -0
  272. package/ccw/src/templates/dashboard-js/views/history.js +337 -0
  273. package/ccw/src/templates/dashboard-js/views/home.js +61 -15
  274. package/ccw/src/templates/dashboard-js/views/hook-manager.js +311 -43
  275. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +204 -28
  276. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +2187 -411
  277. package/ccw/src/templates/dashboard-js/views/mcp-manager.js.backup +1729 -0
  278. package/ccw/src/templates/dashboard-js/views/mcp-manager.js.new +928 -0
  279. package/ccw/src/templates/dashboard-js/views/memory.js +1221 -0
  280. package/ccw/src/templates/dashboard-js/views/prompt-history.js +713 -0
  281. package/ccw/src/templates/dashboard-js/views/rules-manager.js +828 -0
  282. package/ccw/src/templates/dashboard-js/views/session-detail.js +54 -53
  283. package/ccw/src/templates/dashboard-js/views/skills-manager.js +819 -0
  284. package/ccw/src/templates/dashboard.html +185 -85
  285. package/ccw/src/templates/hooks-config-example.json +60 -0
  286. package/ccw/src/tools/classify-folders.ts +245 -0
  287. package/ccw/src/tools/cli-config-manager.ts +268 -0
  288. package/ccw/src/tools/cli-executor.ts +2014 -0
  289. package/ccw/src/tools/cli-history-store.ts +1195 -0
  290. package/ccw/src/tools/codex-lens.ts +1141 -0
  291. package/ccw/src/tools/{convert-tokens-to-css.js → convert-tokens-to-css.ts} +73 -23
  292. package/ccw/src/tools/core-memory.ts +444 -0
  293. package/ccw/src/tools/detect-changed-modules.ts +325 -0
  294. package/ccw/src/tools/{discover-design-files.js → discover-design-files.ts} +74 -24
  295. package/ccw/src/tools/edit-file.ts +568 -0
  296. package/ccw/src/tools/{generate-module-docs.js → generate-module-docs.ts} +207 -185
  297. package/ccw/src/tools/{get-modules-by-depth.js → get-modules-by-depth.ts} +120 -79
  298. package/ccw/src/tools/index.ts +370 -0
  299. package/ccw/src/tools/native-session-discovery.ts +795 -0
  300. package/ccw/src/tools/notifier.ts +129 -0
  301. package/ccw/src/tools/read-file.ts +410 -0
  302. package/ccw/src/tools/resume-strategy.ts +345 -0
  303. package/ccw/src/tools/session-content-parser.ts +619 -0
  304. package/ccw/src/tools/session-manager.ts +1026 -0
  305. package/ccw/src/tools/smart-context.ts +228 -0
  306. package/ccw/src/tools/smart-search.ts +2065 -0
  307. package/ccw/src/tools/smart-search.ts.backup +1233 -0
  308. package/ccw/src/tools/storage-manager.ts +455 -0
  309. package/ccw/src/tools/write-file.ts +222 -0
  310. package/ccw/src/types/config.ts +11 -0
  311. package/ccw/src/types/index.ts +3 -0
  312. package/ccw/src/types/session.ts +25 -0
  313. package/ccw/src/types/tool.ts +41 -0
  314. package/ccw/src/utils/{browser-launcher.js → browser-launcher.ts} +10 -8
  315. package/ccw/src/utils/file-utils.ts +48 -0
  316. package/ccw/src/utils/{path-resolver.js → path-resolver.ts} +114 -78
  317. package/ccw/src/utils/path-validator.ts +153 -0
  318. package/ccw/src/utils/{ui.js → ui.ts} +32 -25
  319. package/codex-lens/pyproject.toml +48 -0
  320. package/codex-lens/src/codexlens/.workflow/.cli-history/history.db +0 -0
  321. package/codex-lens/src/codexlens/__init__.py +28 -0
  322. package/codex-lens/src/codexlens/__main__.py +14 -0
  323. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-313.pyc +0 -0
  324. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-313.pyc +0 -0
  325. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  326. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  327. package/codex-lens/src/codexlens/__pycache__/errors.cpython-313.pyc +0 -0
  328. package/codex-lens/src/codexlens/cli/__init__.py +27 -0
  329. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-313.pyc +0 -0
  330. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  331. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  332. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  333. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-313.pyc +0 -0
  334. package/codex-lens/src/codexlens/cli/commands.py +1931 -0
  335. package/codex-lens/src/codexlens/cli/embedding_manager.py +620 -0
  336. package/codex-lens/src/codexlens/cli/model_manager.py +289 -0
  337. package/codex-lens/src/codexlens/cli/output.py +124 -0
  338. package/codex-lens/src/codexlens/config.py +201 -0
  339. package/codex-lens/src/codexlens/entities.py +121 -0
  340. package/codex-lens/src/codexlens/errors.py +55 -0
  341. package/codex-lens/src/codexlens/indexing/README.md +77 -0
  342. package/codex-lens/src/codexlens/indexing/__init__.py +4 -0
  343. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  344. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  345. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +243 -0
  346. package/codex-lens/src/codexlens/parsers/__init__.py +8 -0
  347. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
  348. package/codex-lens/src/codexlens/parsers/__pycache__/encoding.cpython-313.pyc +0 -0
  349. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  350. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-313.pyc +0 -0
  351. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  352. package/codex-lens/src/codexlens/parsers/encoding.py +202 -0
  353. package/codex-lens/src/codexlens/parsers/factory.py +256 -0
  354. package/codex-lens/src/codexlens/parsers/tokenizer.py +98 -0
  355. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +335 -0
  356. package/codex-lens/src/codexlens/search/__init__.py +15 -0
  357. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-313.pyc +0 -0
  358. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  359. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  360. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  361. package/codex-lens/src/codexlens/search/__pycache__/query_parser.cpython-313.pyc +0 -0
  362. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  363. package/codex-lens/src/codexlens/search/chain_search.py +647 -0
  364. package/codex-lens/src/codexlens/search/enrichment.py +150 -0
  365. package/codex-lens/src/codexlens/search/hybrid_search.py +313 -0
  366. package/codex-lens/src/codexlens/search/query_parser.py +242 -0
  367. package/codex-lens/src/codexlens/search/ranking.py +274 -0
  368. package/codex-lens/src/codexlens/semantic/__init__.py +39 -0
  369. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-313.pyc +0 -0
  370. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  371. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
  372. package/codex-lens/src/codexlens/semantic/__pycache__/code_extractor.cpython-313.pyc +0 -0
  373. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-313.pyc +0 -0
  374. package/codex-lens/src/codexlens/semantic/__pycache__/graph_analyzer.cpython-313.pyc +0 -0
  375. package/codex-lens/src/codexlens/semantic/__pycache__/llm_enhancer.cpython-313.pyc +0 -0
  376. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  377. package/codex-lens/src/codexlens/semantic/ann_index.py +414 -0
  378. package/codex-lens/src/codexlens/semantic/chunker.py +448 -0
  379. package/codex-lens/src/codexlens/semantic/code_extractor.py +274 -0
  380. package/codex-lens/src/codexlens/semantic/embedder.py +185 -0
  381. package/codex-lens/src/codexlens/semantic/vector_store.py +955 -0
  382. package/codex-lens/src/codexlens/storage/__init__.py +29 -0
  383. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  384. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  385. package/codex-lens/src/codexlens/storage/__pycache__/file_cache.cpython-313.pyc +0 -0
  386. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  387. package/codex-lens/src/codexlens/storage/__pycache__/migration_manager.cpython-313.pyc +0 -0
  388. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-313.pyc +0 -0
  389. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-313.pyc +0 -0
  390. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  391. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-313.pyc +0 -0
  392. package/codex-lens/src/codexlens/storage/dir_index.py +1850 -0
  393. package/codex-lens/src/codexlens/storage/file_cache.py +32 -0
  394. package/codex-lens/src/codexlens/storage/index_tree.py +776 -0
  395. package/codex-lens/src/codexlens/storage/migration_manager.py +154 -0
  396. package/codex-lens/src/codexlens/storage/migrations/__init__.py +1 -0
  397. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  398. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_001_normalize_keywords.cpython-313.pyc +0 -0
  399. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_002_add_token_metadata.cpython-313.pyc +0 -0
  400. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_003_code_relationships.cpython-313.pyc +0 -0
  401. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_004_dual_fts.cpython-313.pyc +0 -0
  402. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_005_cleanup_unused_fields.cpython-313.pyc +0 -0
  403. package/codex-lens/src/codexlens/storage/migrations/migration_001_normalize_keywords.py +123 -0
  404. package/codex-lens/src/codexlens/storage/migrations/migration_002_add_token_metadata.py +48 -0
  405. package/codex-lens/src/codexlens/storage/migrations/migration_004_dual_fts.py +232 -0
  406. package/codex-lens/src/codexlens/storage/migrations/migration_005_cleanup_unused_fields.py +196 -0
  407. package/codex-lens/src/codexlens/storage/path_mapper.py +274 -0
  408. package/codex-lens/src/codexlens/storage/registry.py +670 -0
  409. package/codex-lens/src/codexlens/storage/sqlite_store.py +576 -0
  410. package/codex-lens/src/codexlens/storage/sqlite_utils.py +64 -0
  411. package/package.json +4 -1
  412. package/.claude/commands/memory/tech-research.md +0 -477
  413. package/.claude/scripts/classify-folders.sh +0 -39
  414. package/.claude/scripts/convert_tokens_to_css.sh +0 -229
  415. package/.claude/scripts/detect_changed_modules.sh +0 -161
  416. package/.claude/scripts/discover-design-files.sh +0 -87
  417. package/.claude/scripts/extract-animations.js +0 -243
  418. package/.claude/scripts/extract-computed-styles.js +0 -118
  419. package/.claude/scripts/extract-layout-structure.js +0 -411
  420. package/.claude/scripts/generate_module_docs.sh +0 -717
  421. package/.claude/scripts/get_modules_by_depth.sh +0 -170
  422. package/.claude/scripts/ui-generate-preview.sh +0 -395
  423. package/.claude/scripts/ui-instantiate-prototypes.sh +0 -815
  424. package/.claude/scripts/update_module_claude.sh +0 -337
  425. package/.claude/workflows/context-search-strategy.md +0 -77
  426. package/.claude/workflows/intelligent-tools-strategy.md +0 -662
  427. package/ccw/src/cli.js +0 -119
  428. package/ccw/src/commands/install.js +0 -324
  429. package/ccw/src/commands/tool.js +0 -138
  430. package/ccw/src/core/data-aggregator.js +0 -409
  431. package/ccw/src/core/server.js +0 -2063
  432. package/ccw/src/core/session-scanner.js +0 -235
  433. package/ccw/src/tools/classify-folders.js +0 -204
  434. package/ccw/src/tools/detect-changed-modules.js +0 -288
  435. package/ccw/src/tools/edit-file.js +0 -266
  436. package/ccw/src/tools/index.js +0 -176
  437. package/ccw/src/utils/file-utils.js +0 -48
@@ -0,0 +1,806 @@
1
+ // @ts-nocheck
2
+ /**
3
+ * CodexLens Routes Module
4
+ * Handles all CodexLens-related API endpoints
5
+ */
6
+ import type { IncomingMessage, ServerResponse } from 'http';
7
+ import {
8
+ checkVenvStatus,
9
+ bootstrapVenv,
10
+ executeCodexLens,
11
+ checkSemanticStatus,
12
+ installSemantic,
13
+ uninstallCodexLens,
14
+ cancelIndexing,
15
+ isIndexingInProgress
16
+ } from '../../tools/codex-lens.js';
17
+ import type { ProgressInfo } from '../../tools/codex-lens.js';
18
+
19
+ export interface RouteContext {
20
+ pathname: string;
21
+ url: URL;
22
+ req: IncomingMessage;
23
+ res: ServerResponse;
24
+ initialPath: string;
25
+ handlePostRequest: (req: IncomingMessage, res: ServerResponse, handler: (body: unknown) => Promise<any>) => void;
26
+ broadcastToClients: (data: unknown) => void;
27
+ }
28
+
29
+ /**
30
+ * Strip ANSI color codes from string
31
+ * Rich library adds color codes even with --json flag
32
+ */
33
+ function stripAnsiCodes(str: string): string {
34
+ // ANSI escape code pattern: \x1b[...m or \x1b]...
35
+ return str.replace(/\x1b\[[0-9;]*m/g, '')
36
+ .replace(/\x1b\][0-9;]*\x07/g, '')
37
+ .replace(/\x1b\][^\x07]*\x07/g, '');
38
+ }
39
+
40
+ /**
41
+ * Format file size to human readable string
42
+ */
43
+ function formatSize(bytes: number): string {
44
+ if (bytes === 0) return '0 B';
45
+ const units = ['B', 'KB', 'MB', 'GB', 'TB'];
46
+ const k = 1024;
47
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
48
+ const size = parseFloat((bytes / Math.pow(k, i)).toFixed(i < 2 ? 0 : 1));
49
+ return size + ' ' + units[i];
50
+ }
51
+
52
+ /**
53
+ * Extract JSON from CLI output that may contain logging messages
54
+ * CodexLens CLI outputs logs like "INFO ..." before the JSON
55
+ * Also strips ANSI color codes that Rich library adds
56
+ */
57
+ function extractJSON(output: string): any {
58
+ // Strip ANSI color codes first
59
+ const cleanOutput = stripAnsiCodes(output);
60
+
61
+ // Find the first { or [ character (start of JSON)
62
+ const jsonStart = cleanOutput.search(/[{\[]/);
63
+ if (jsonStart === -1) {
64
+ throw new Error('No JSON found in output');
65
+ }
66
+
67
+ // Extract everything from the first { or [ onwards
68
+ const jsonString = cleanOutput.substring(jsonStart);
69
+ return JSON.parse(jsonString);
70
+ }
71
+
72
+ /**
73
+ * Handle CodexLens routes
74
+ * @returns true if route was handled, false otherwise
75
+ */
76
+ export async function handleCodexLensRoutes(ctx: RouteContext): Promise<boolean> {
77
+ const { pathname, url, req, res, initialPath, handlePostRequest, broadcastToClients } = ctx;
78
+
79
+ // API: CodexLens Index List - Get all indexed projects with details
80
+ if (pathname === '/api/codexlens/indexes') {
81
+ try {
82
+ // Get config for index directory path
83
+ const configResult = await executeCodexLens(['config', '--json']);
84
+ let indexDir = '';
85
+
86
+ if (configResult.success) {
87
+ try {
88
+ const config = extractJSON(configResult.output);
89
+ if (config.success && config.result) {
90
+ // CLI returns index_dir (not index_root)
91
+ indexDir = config.result.index_dir || config.result.index_root || '';
92
+ }
93
+ } catch (e) {
94
+ console.error('[CodexLens] Failed to parse config for index list:', e.message);
95
+ }
96
+ }
97
+
98
+ // Get project list using 'projects list' command
99
+ const projectsResult = await executeCodexLens(['projects', 'list', '--json']);
100
+ let indexes: any[] = [];
101
+ let totalSize = 0;
102
+ let vectorIndexCount = 0;
103
+ let normalIndexCount = 0;
104
+
105
+ if (projectsResult.success) {
106
+ try {
107
+ const projectsData = extractJSON(projectsResult.output);
108
+ if (projectsData.success && Array.isArray(projectsData.result)) {
109
+ const { statSync, existsSync } = await import('fs');
110
+ const { basename, join } = await import('path');
111
+
112
+ for (const project of projectsData.result) {
113
+ // Skip test/temp projects
114
+ if (project.source_root && (
115
+ project.source_root.includes('\\Temp\\') ||
116
+ project.source_root.includes('/tmp/') ||
117
+ project.total_files === 0
118
+ )) {
119
+ continue;
120
+ }
121
+
122
+ let projectSize = 0;
123
+ let hasVectorIndex = false;
124
+ let hasNormalIndex = true; // All projects have FTS index
125
+ let lastModified = null;
126
+
127
+ // Try to get actual index size from index_root
128
+ if (project.index_root && existsSync(project.index_root)) {
129
+ try {
130
+ const { readdirSync } = await import('fs');
131
+ const files = readdirSync(project.index_root);
132
+ for (const file of files) {
133
+ try {
134
+ const filePath = join(project.index_root, file);
135
+ const stat = statSync(filePath);
136
+ projectSize += stat.size;
137
+ if (!lastModified || stat.mtime > lastModified) {
138
+ lastModified = stat.mtime;
139
+ }
140
+ // Check for vector/embedding files
141
+ if (file.includes('vector') || file.includes('embedding') ||
142
+ file.endsWith('.faiss') || file.endsWith('.npy') ||
143
+ file.includes('semantic_chunks')) {
144
+ hasVectorIndex = true;
145
+ }
146
+ } catch (e) {
147
+ // Skip files we can't stat
148
+ }
149
+ }
150
+ } catch (e) {
151
+ // Can't read index directory
152
+ }
153
+ }
154
+
155
+ if (hasVectorIndex) vectorIndexCount++;
156
+ if (hasNormalIndex) normalIndexCount++;
157
+ totalSize += projectSize;
158
+
159
+ // Use source_root as the display name
160
+ const displayName = project.source_root ? basename(project.source_root) : `project_${project.id}`;
161
+
162
+ indexes.push({
163
+ id: displayName,
164
+ path: project.source_root || '',
165
+ indexPath: project.index_root || '',
166
+ size: projectSize,
167
+ sizeFormatted: formatSize(projectSize),
168
+ fileCount: project.total_files || 0,
169
+ dirCount: project.total_dirs || 0,
170
+ hasVectorIndex,
171
+ hasNormalIndex,
172
+ status: project.status || 'active',
173
+ lastModified: lastModified ? lastModified.toISOString() : null
174
+ });
175
+ }
176
+
177
+ // Sort by file count (most files first), then by name
178
+ indexes.sort((a, b) => {
179
+ if (b.fileCount !== a.fileCount) return b.fileCount - a.fileCount;
180
+ return a.id.localeCompare(b.id);
181
+ });
182
+ }
183
+ } catch (e) {
184
+ console.error('[CodexLens] Failed to parse projects list:', e.message);
185
+ }
186
+ }
187
+
188
+ // Also get summary stats from status command
189
+ const statusResult = await executeCodexLens(['status', '--json']);
190
+ let statusSummary: any = {};
191
+
192
+ if (statusResult.success) {
193
+ try {
194
+ const status = extractJSON(statusResult.output);
195
+ if (status.success && status.result) {
196
+ statusSummary = {
197
+ totalProjects: status.result.projects_count || indexes.length,
198
+ totalFiles: status.result.total_files || 0,
199
+ totalDirs: status.result.total_dirs || 0,
200
+ // Keep calculated totalSize for consistency with per-project sizes
201
+ // status.index_size_bytes includes shared resources (models, cache)
202
+ indexSizeBytes: totalSize,
203
+ indexSizeMb: totalSize / (1024 * 1024),
204
+ embeddings: status.result.embeddings || {},
205
+ // Store full index dir size separately for reference
206
+ fullIndexDirSize: status.result.index_size_bytes || 0,
207
+ fullIndexDirSizeFormatted: formatSize(status.result.index_size_bytes || 0)
208
+ };
209
+ }
210
+ } catch (e) {
211
+ console.error('[CodexLens] Failed to parse status:', e.message);
212
+ }
213
+ }
214
+
215
+ res.writeHead(200, { 'Content-Type': 'application/json' });
216
+ res.end(JSON.stringify({
217
+ success: true,
218
+ indexDir,
219
+ indexes,
220
+ summary: {
221
+ totalProjects: indexes.length,
222
+ totalSize,
223
+ totalSizeFormatted: formatSize(totalSize),
224
+ vectorIndexCount,
225
+ normalIndexCount,
226
+ ...statusSummary
227
+ }
228
+ }));
229
+ } catch (err) {
230
+ res.writeHead(500, { 'Content-Type': 'application/json' });
231
+ res.end(JSON.stringify({ success: false, error: err.message }));
232
+ }
233
+ return true;
234
+ }
235
+
236
+ // API: CodexLens Status
237
+ if (pathname === '/api/codexlens/status') {
238
+ const status = await checkVenvStatus();
239
+ res.writeHead(200, { 'Content-Type': 'application/json' });
240
+ res.end(JSON.stringify(status));
241
+ return true;
242
+ }
243
+
244
+ // API: CodexLens Bootstrap (Install)
245
+ if (pathname === '/api/codexlens/bootstrap' && req.method === 'POST') {
246
+ handlePostRequest(req, res, async () => {
247
+ try {
248
+ const result = await bootstrapVenv();
249
+ if (result.success) {
250
+ const status = await checkVenvStatus();
251
+ // Broadcast installation event
252
+ broadcastToClients({
253
+ type: 'CODEXLENS_INSTALLED',
254
+ payload: { version: status.version, timestamp: new Date().toISOString() }
255
+ });
256
+ return { success: true, message: 'CodexLens installed successfully', version: status.version };
257
+ } else {
258
+ return { success: false, error: result.error, status: 500 };
259
+ }
260
+ } catch (err) {
261
+ return { success: false, error: err.message, status: 500 };
262
+ }
263
+ });
264
+ return true;
265
+ }
266
+
267
+ // API: CodexLens Uninstall
268
+ if (pathname === '/api/codexlens/uninstall' && req.method === 'POST') {
269
+ handlePostRequest(req, res, async () => {
270
+ try {
271
+ const result = await uninstallCodexLens();
272
+ if (result.success) {
273
+ // Broadcast uninstallation event
274
+ broadcastToClients({
275
+ type: 'CODEXLENS_UNINSTALLED',
276
+ payload: { timestamp: new Date().toISOString() }
277
+ });
278
+ return { success: true, message: 'CodexLens uninstalled successfully' };
279
+ } else {
280
+ return { success: false, error: result.error, status: 500 };
281
+ }
282
+ } catch (err) {
283
+ return { success: false, error: err.message, status: 500 };
284
+ }
285
+ });
286
+ return true;
287
+ }
288
+
289
+ // API: CodexLens Config - GET (Get current configuration with index count)
290
+ if (pathname === '/api/codexlens/config' && req.method === 'GET') {
291
+ try {
292
+ // Fetch both config and status to merge index_count
293
+ const [configResult, statusResult] = await Promise.all([
294
+ executeCodexLens(['config', '--json']),
295
+ executeCodexLens(['status', '--json'])
296
+ ]);
297
+
298
+ let responseData = { index_dir: '~/.codexlens/indexes', index_count: 0 };
299
+
300
+ // Parse config (extract JSON from output that may contain log messages)
301
+ if (configResult.success) {
302
+ try {
303
+ const config = extractJSON(configResult.output);
304
+ if (config.success && config.result) {
305
+ // CLI returns index_dir (not index_root)
306
+ responseData.index_dir = config.result.index_dir || config.result.index_root || responseData.index_dir;
307
+ }
308
+ } catch (e) {
309
+ console.error('[CodexLens] Failed to parse config:', e.message);
310
+ console.error('[CodexLens] Config output:', configResult.output.substring(0, 200));
311
+ }
312
+ }
313
+
314
+ // Parse status to get index_count (projects_count)
315
+ if (statusResult.success) {
316
+ try {
317
+ const status = extractJSON(statusResult.output);
318
+ if (status.success && status.result) {
319
+ responseData.index_count = status.result.projects_count || 0;
320
+ }
321
+ } catch (e) {
322
+ console.error('[CodexLens] Failed to parse status:', e.message);
323
+ console.error('[CodexLens] Status output:', statusResult.output.substring(0, 200));
324
+ }
325
+ }
326
+
327
+ res.writeHead(200, { 'Content-Type': 'application/json' });
328
+ res.end(JSON.stringify(responseData));
329
+ } catch (err) {
330
+ res.writeHead(500, { 'Content-Type': 'application/json' });
331
+ res.end(JSON.stringify({ error: err.message }));
332
+ }
333
+ return true;
334
+ }
335
+
336
+ // API: CodexLens Config - POST (Set configuration)
337
+ if (pathname === '/api/codexlens/config' && req.method === 'POST') {
338
+ handlePostRequest(req, res, async (body) => {
339
+ const { index_dir } = body;
340
+
341
+ if (!index_dir) {
342
+ return { success: false, error: 'index_dir is required', status: 400 };
343
+ }
344
+
345
+ try {
346
+ const result = await executeCodexLens(['config-set', '--key', 'index_dir', '--value', index_dir, '--json']);
347
+ if (result.success) {
348
+ return { success: true, message: 'Configuration updated successfully' };
349
+ } else {
350
+ return { success: false, error: result.error || 'Failed to update configuration', status: 500 };
351
+ }
352
+ } catch (err) {
353
+ return { success: false, error: err.message, status: 500 };
354
+ }
355
+ });
356
+ return true;
357
+ }
358
+
359
+ // API: CodexLens Clean (Clean indexes)
360
+ if (pathname === '/api/codexlens/clean' && req.method === 'POST') {
361
+ handlePostRequest(req, res, async (body) => {
362
+ const { all = false, path } = body;
363
+
364
+ try {
365
+ const args = ['clean'];
366
+ if (all) {
367
+ args.push('--all');
368
+ } else if (path) {
369
+ // Path is passed as a positional argument, not as a flag
370
+ args.push(path);
371
+ }
372
+ args.push('--json');
373
+
374
+ const result = await executeCodexLens(args);
375
+ if (result.success) {
376
+ return { success: true, message: 'Indexes cleaned successfully' };
377
+ } else {
378
+ return { success: false, error: result.error || 'Failed to clean indexes', status: 500 };
379
+ }
380
+ } catch (err) {
381
+ return { success: false, error: err.message, status: 500 };
382
+ }
383
+ });
384
+ return true;
385
+ }
386
+
387
+ // API: CodexLens Init (Initialize workspace index)
388
+ if (pathname === '/api/codexlens/init' && req.method === 'POST') {
389
+ handlePostRequest(req, res, async (body) => {
390
+ const { path: projectPath, indexType = 'vector', embeddingModel = 'code' } = body;
391
+ const targetPath = projectPath || initialPath;
392
+
393
+ // Build CLI arguments based on index type
394
+ const args = ['init', targetPath, '--json'];
395
+ if (indexType === 'normal') {
396
+ args.push('--no-embeddings');
397
+ } else {
398
+ // Add embedding model selection for vector index
399
+ args.push('--embedding-model', embeddingModel);
400
+ }
401
+
402
+ // Broadcast start event
403
+ broadcastToClients({
404
+ type: 'CODEXLENS_INDEX_PROGRESS',
405
+ payload: { stage: 'start', message: 'Starting index...', percent: 0, path: targetPath, indexType }
406
+ });
407
+
408
+ try {
409
+ const result = await executeCodexLens(args, {
410
+ cwd: targetPath,
411
+ timeout: 1800000, // 30 minutes for large codebases
412
+ onProgress: (progress: ProgressInfo) => {
413
+ // Broadcast progress to all connected clients
414
+ broadcastToClients({
415
+ type: 'CODEXLENS_INDEX_PROGRESS',
416
+ payload: { ...progress, path: targetPath }
417
+ });
418
+ }
419
+ });
420
+
421
+ if (result.success) {
422
+ // Broadcast completion
423
+ broadcastToClients({
424
+ type: 'CODEXLENS_INDEX_PROGRESS',
425
+ payload: { stage: 'complete', message: 'Index complete', percent: 100, path: targetPath }
426
+ });
427
+
428
+ try {
429
+ const parsed = extractJSON(result.output);
430
+ return { success: true, result: parsed };
431
+ } catch {
432
+ return { success: true, output: result.output };
433
+ }
434
+ } else {
435
+ // Broadcast error
436
+ broadcastToClients({
437
+ type: 'CODEXLENS_INDEX_PROGRESS',
438
+ payload: { stage: 'error', message: result.error || 'Unknown error', percent: 0, path: targetPath }
439
+ });
440
+ return { success: false, error: result.error, status: 500 };
441
+ }
442
+ } catch (err) {
443
+ // Broadcast error
444
+ broadcastToClients({
445
+ type: 'CODEXLENS_INDEX_PROGRESS',
446
+ payload: { stage: 'error', message: err.message, percent: 0, path: targetPath }
447
+ });
448
+ return { success: false, error: err.message, status: 500 };
449
+ }
450
+ });
451
+ return true;
452
+ }
453
+
454
+ // API: Cancel CodexLens Indexing
455
+ if (pathname === '/api/codexlens/cancel' && req.method === 'POST') {
456
+ const result = cancelIndexing();
457
+
458
+ // Broadcast cancellation event
459
+ if (result.success) {
460
+ broadcastToClients({
461
+ type: 'CODEXLENS_INDEX_PROGRESS',
462
+ payload: { stage: 'cancelled', message: 'Indexing cancelled by user', percent: 0 }
463
+ });
464
+ }
465
+
466
+ res.writeHead(result.success ? 200 : 400, { 'Content-Type': 'application/json' });
467
+ res.end(JSON.stringify(result));
468
+ return true;
469
+ }
470
+
471
+ // API: Check if indexing is in progress
472
+ if (pathname === '/api/codexlens/indexing-status') {
473
+ const inProgress = isIndexingInProgress();
474
+ res.writeHead(200, { 'Content-Type': 'application/json' });
475
+ res.end(JSON.stringify({ success: true, inProgress }));
476
+ return true;
477
+ }
478
+
479
+ // API: CodexLens Semantic Search Status
480
+ if (pathname === '/api/codexlens/semantic/status') {
481
+ const status = await checkSemanticStatus();
482
+ res.writeHead(200, { 'Content-Type': 'application/json' });
483
+ res.end(JSON.stringify(status));
484
+ return true;
485
+ }
486
+
487
+ // API: CodexLens Semantic Metadata List
488
+ if (pathname === '/api/codexlens/semantic/metadata') {
489
+ const offset = parseInt(url.searchParams.get('offset') || '0', 10);
490
+ const limit = parseInt(url.searchParams.get('limit') || '50', 10);
491
+ const tool = url.searchParams.get('tool') || '';
492
+ const projectPath = url.searchParams.get('path') || initialPath;
493
+
494
+ try {
495
+ const args = [
496
+ 'semantic-list',
497
+ '--path', projectPath,
498
+ '--offset', offset.toString(),
499
+ '--limit', limit.toString(),
500
+ '--json'
501
+ ];
502
+ if (tool) {
503
+ args.push('--tool', tool);
504
+ }
505
+
506
+ const result = await executeCodexLens(args, { cwd: projectPath });
507
+
508
+ if (result.success) {
509
+ res.writeHead(200, { 'Content-Type': 'application/json' });
510
+ res.end(result.output);
511
+ } else {
512
+ res.writeHead(500, { 'Content-Type': 'application/json' });
513
+ res.end(JSON.stringify({ success: false, error: result.error }));
514
+ }
515
+ } catch (err) {
516
+ res.writeHead(500, { 'Content-Type': 'application/json' });
517
+ res.end(JSON.stringify({ success: false, error: err.message }));
518
+ }
519
+ return true;
520
+ }
521
+
522
+ // API: CodexLens LLM Enhancement (run enhance command)
523
+ if (pathname === '/api/codexlens/enhance' && req.method === 'POST') {
524
+ handlePostRequest(req, res, async (body) => {
525
+ const { path: projectPath, tool = 'gemini', batchSize = 5, timeoutMs = 300000 } = body;
526
+ const targetPath = projectPath || initialPath;
527
+
528
+ try {
529
+ const args = ['enhance', targetPath, '--tool', tool, '--batch-size', batchSize.toString()];
530
+ const result = await executeCodexLens(args, { cwd: targetPath, timeout: timeoutMs + 30000 });
531
+ if (result.success) {
532
+ try {
533
+ const parsed = extractJSON(result.output);
534
+ return { success: true, result: parsed };
535
+ } catch {
536
+ return { success: true, output: result.output };
537
+ }
538
+ } else {
539
+ return { success: false, error: result.error, status: 500 };
540
+ }
541
+ } catch (err) {
542
+ return { success: false, error: err.message, status: 500 };
543
+ }
544
+ });
545
+ return true;
546
+ }
547
+
548
+
549
+ // API: CodexLens Search (FTS5 text search with mode support)
550
+ if (pathname === '/api/codexlens/search') {
551
+ const query = url.searchParams.get('query') || '';
552
+ const limit = parseInt(url.searchParams.get('limit') || '20', 10);
553
+ const mode = url.searchParams.get('mode') || 'exact'; // exact, fuzzy, hybrid, vector
554
+ const projectPath = url.searchParams.get('path') || initialPath;
555
+
556
+ if (!query) {
557
+ res.writeHead(400, { 'Content-Type': 'application/json' });
558
+ res.end(JSON.stringify({ success: false, error: 'Query parameter is required' }));
559
+ return true;
560
+ }
561
+
562
+ try {
563
+ const args = ['search', query, '--path', projectPath, '--limit', limit.toString(), '--mode', mode, '--json'];
564
+
565
+ const result = await executeCodexLens(args, { cwd: projectPath });
566
+
567
+ if (result.success) {
568
+ try {
569
+ const parsed = extractJSON(result.output);
570
+ res.writeHead(200, { 'Content-Type': 'application/json' });
571
+ res.end(JSON.stringify({ success: true, ...parsed.result }));
572
+ } catch {
573
+ res.writeHead(200, { 'Content-Type': 'application/json' });
574
+ res.end(JSON.stringify({ success: true, results: [], output: result.output }));
575
+ }
576
+ } else {
577
+ res.writeHead(500, { 'Content-Type': 'application/json' });
578
+ res.end(JSON.stringify({ success: false, error: result.error }));
579
+ }
580
+ } catch (err) {
581
+ res.writeHead(500, { 'Content-Type': 'application/json' });
582
+ res.end(JSON.stringify({ success: false, error: err.message }));
583
+ }
584
+ return true;
585
+ }
586
+
587
+ // API: CodexLens Search Files Only (return file paths only, with mode support)
588
+ if (pathname === '/api/codexlens/search_files') {
589
+ const query = url.searchParams.get('query') || '';
590
+ const limit = parseInt(url.searchParams.get('limit') || '20', 10);
591
+ const mode = url.searchParams.get('mode') || 'exact'; // exact, fuzzy, hybrid, vector
592
+ const projectPath = url.searchParams.get('path') || initialPath;
593
+
594
+ if (!query) {
595
+ res.writeHead(400, { 'Content-Type': 'application/json' });
596
+ res.end(JSON.stringify({ success: false, error: 'Query parameter is required' }));
597
+ return true;
598
+ }
599
+
600
+ try {
601
+ const args = ['search', query, '--path', projectPath, '--limit', limit.toString(), '--mode', mode, '--files-only', '--json'];
602
+
603
+ const result = await executeCodexLens(args, { cwd: projectPath });
604
+
605
+ if (result.success) {
606
+ try {
607
+ const parsed = extractJSON(result.output);
608
+ res.writeHead(200, { 'Content-Type': 'application/json' });
609
+ res.end(JSON.stringify({ success: true, ...parsed.result }));
610
+ } catch {
611
+ res.writeHead(200, { 'Content-Type': 'application/json' });
612
+ res.end(JSON.stringify({ success: true, files: [], output: result.output }));
613
+ }
614
+ } else {
615
+ res.writeHead(500, { 'Content-Type': 'application/json' });
616
+ res.end(JSON.stringify({ success: false, error: result.error }));
617
+ }
618
+ } catch (err) {
619
+ res.writeHead(500, { 'Content-Type': 'application/json' });
620
+ res.end(JSON.stringify({ success: false, error: err.message }));
621
+ }
622
+ return true;
623
+ }
624
+
625
+ // API: CodexLens Symbol Search (search for symbols by name)
626
+ if (pathname === '/api/codexlens/symbol') {
627
+ const query = url.searchParams.get('query') || '';
628
+ const file = url.searchParams.get('file');
629
+ const limit = parseInt(url.searchParams.get('limit') || '20', 10);
630
+ const projectPath = url.searchParams.get('path') || initialPath;
631
+
632
+ if (!query && !file) {
633
+ res.writeHead(400, { 'Content-Type': 'application/json' });
634
+ res.end(JSON.stringify({ success: false, error: 'Either query or file parameter is required' }));
635
+ return true;
636
+ }
637
+
638
+ try {
639
+ let args;
640
+ if (file) {
641
+ // Get symbols from a specific file
642
+ args = ['symbol', '--file', file, '--json'];
643
+ } else {
644
+ // Search for symbols by name
645
+ args = ['symbol', query, '--path', projectPath, '--limit', limit.toString(), '--json'];
646
+ }
647
+
648
+ const result = await executeCodexLens(args, { cwd: projectPath });
649
+
650
+ if (result.success) {
651
+ try {
652
+ const parsed = extractJSON(result.output);
653
+ res.writeHead(200, { 'Content-Type': 'application/json' });
654
+ res.end(JSON.stringify({ success: true, ...parsed.result }));
655
+ } catch {
656
+ res.writeHead(200, { 'Content-Type': 'application/json' });
657
+ res.end(JSON.stringify({ success: true, symbols: [], output: result.output }));
658
+ }
659
+ } else {
660
+ res.writeHead(500, { 'Content-Type': 'application/json' });
661
+ res.end(JSON.stringify({ success: false, error: result.error }));
662
+ }
663
+ } catch (err) {
664
+ res.writeHead(500, { 'Content-Type': 'application/json' });
665
+ res.end(JSON.stringify({ success: false, error: err.message }));
666
+ }
667
+ return true;
668
+ }
669
+
670
+
671
+ // API: CodexLens Semantic Search Install (fastembed, ONNX-based, ~200MB)
672
+ if (pathname === '/api/codexlens/semantic/install' && req.method === 'POST') {
673
+ handlePostRequest(req, res, async () => {
674
+ try {
675
+ const result = await installSemantic();
676
+ if (result.success) {
677
+ const status = await checkSemanticStatus();
678
+ return {
679
+ success: true,
680
+ message: 'Semantic search installed successfully (fastembed)',
681
+ ...status
682
+ };
683
+ } else {
684
+ return { success: false, error: result.error, status: 500 };
685
+ }
686
+ } catch (err) {
687
+ return { success: false, error: err.message, status: 500 };
688
+ }
689
+ });
690
+ return true;
691
+ }
692
+
693
+ // API: CodexLens Model List (list available embedding models)
694
+ if (pathname === '/api/codexlens/models' && req.method === 'GET') {
695
+ try {
696
+ const result = await executeCodexLens(['model-list', '--json']);
697
+ if (result.success) {
698
+ try {
699
+ const parsed = extractJSON(result.output);
700
+ res.writeHead(200, { 'Content-Type': 'application/json' });
701
+ res.end(JSON.stringify(parsed));
702
+ } catch {
703
+ res.writeHead(200, { 'Content-Type': 'application/json' });
704
+ res.end(JSON.stringify({ success: true, result: { models: [] }, output: result.output }));
705
+ }
706
+ } else {
707
+ res.writeHead(500, { 'Content-Type': 'application/json' });
708
+ res.end(JSON.stringify({ success: false, error: result.error }));
709
+ }
710
+ } catch (err) {
711
+ res.writeHead(500, { 'Content-Type': 'application/json' });
712
+ res.end(JSON.stringify({ success: false, error: err.message }));
713
+ }
714
+ return true;
715
+ }
716
+
717
+ // API: CodexLens Model Download (download embedding model by profile)
718
+ if (pathname === '/api/codexlens/models/download' && req.method === 'POST') {
719
+ handlePostRequest(req, res, async (body) => {
720
+ const { profile } = body;
721
+
722
+ if (!profile) {
723
+ return { success: false, error: 'profile is required', status: 400 };
724
+ }
725
+
726
+ try {
727
+ const result = await executeCodexLens(['model-download', profile, '--json'], { timeout: 600000 }); // 10 min for download
728
+ if (result.success) {
729
+ try {
730
+ const parsed = extractJSON(result.output);
731
+ return { success: true, ...parsed };
732
+ } catch {
733
+ return { success: true, output: result.output };
734
+ }
735
+ } else {
736
+ return { success: false, error: result.error, status: 500 };
737
+ }
738
+ } catch (err) {
739
+ return { success: false, error: err.message, status: 500 };
740
+ }
741
+ });
742
+ return true;
743
+ }
744
+
745
+ // API: CodexLens Model Delete (delete embedding model by profile)
746
+ if (pathname === '/api/codexlens/models/delete' && req.method === 'POST') {
747
+ handlePostRequest(req, res, async (body) => {
748
+ const { profile } = body;
749
+
750
+ if (!profile) {
751
+ return { success: false, error: 'profile is required', status: 400 };
752
+ }
753
+
754
+ try {
755
+ const result = await executeCodexLens(['model-delete', profile, '--json']);
756
+ if (result.success) {
757
+ try {
758
+ const parsed = extractJSON(result.output);
759
+ return { success: true, ...parsed };
760
+ } catch {
761
+ return { success: true, output: result.output };
762
+ }
763
+ } else {
764
+ return { success: false, error: result.error, status: 500 };
765
+ }
766
+ } catch (err) {
767
+ return { success: false, error: err.message, status: 500 };
768
+ }
769
+ });
770
+ return true;
771
+ }
772
+
773
+ // API: CodexLens Model Info (get model info by profile)
774
+ if (pathname === '/api/codexlens/models/info' && req.method === 'GET') {
775
+ const profile = url.searchParams.get('profile');
776
+
777
+ if (!profile) {
778
+ res.writeHead(400, { 'Content-Type': 'application/json' });
779
+ res.end(JSON.stringify({ success: false, error: 'profile parameter is required' }));
780
+ return true;
781
+ }
782
+
783
+ try {
784
+ const result = await executeCodexLens(['model-info', profile, '--json']);
785
+ if (result.success) {
786
+ try {
787
+ const parsed = extractJSON(result.output);
788
+ res.writeHead(200, { 'Content-Type': 'application/json' });
789
+ res.end(JSON.stringify(parsed));
790
+ } catch {
791
+ res.writeHead(200, { 'Content-Type': 'application/json' });
792
+ res.end(JSON.stringify({ success: false, error: 'Failed to parse response' }));
793
+ }
794
+ } else {
795
+ res.writeHead(500, { 'Content-Type': 'application/json' });
796
+ res.end(JSON.stringify({ success: false, error: result.error }));
797
+ }
798
+ } catch (err) {
799
+ res.writeHead(500, { 'Content-Type': 'application/json' });
800
+ res.end(JSON.stringify({ success: false, error: err.message }));
801
+ }
802
+ return true;
803
+ }
804
+
805
+ return false;
806
+ }