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
@@ -1,550 +1,549 @@
1
- // @ts-nocheck
2
- /**
3
- * MCP Routes Module
4
- * Handles all MCP-related API endpoints
5
- */
6
- import type { IncomingMessage, ServerResponse } from 'http';
7
- import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
8
- import { join, dirname } from 'path';
9
- import { homedir } from 'os';
10
-
11
- // Claude config file path
12
- const CLAUDE_CONFIG_PATH = join(homedir(), '.claude.json');
13
-
14
- export interface RouteContext {
15
- pathname: string;
16
- url: URL;
17
- req: IncomingMessage;
18
- res: ServerResponse;
19
- initialPath: string;
20
- handlePostRequest: (req: IncomingMessage, res: ServerResponse, handler: (body: unknown) => Promise<any>) => void;
21
- broadcastToClients: (data: unknown) => void;
22
- }
23
-
24
- // ========================================
25
- // Helper Functions
26
- // ========================================
27
-
28
- /**
29
- * Get enterprise managed MCP path (platform-specific)
30
- */
31
- function getEnterpriseMcpPath(): string {
32
- const platform = process.platform;
33
- if (platform === 'darwin') {
34
- return '/Library/Application Support/ClaudeCode/managed-mcp.json';
35
- } else if (platform === 'win32') {
36
- return 'C:\\Program Files\\ClaudeCode\\managed-mcp.json';
37
- } else {
38
- // Linux and WSL
39
- return '/etc/claude-code/managed-mcp.json';
40
- }
41
- }
42
-
43
- /**
44
- * Safely read and parse JSON file
45
- */
46
- function safeReadJson(filePath) {
47
- try {
48
- if (!existsSync(filePath)) return null;
49
- const content = readFileSync(filePath, 'utf8');
50
- return JSON.parse(content);
51
- } catch {
52
- return null;
53
- }
54
- }
55
-
56
- /**
57
- * Get MCP servers from a JSON file (expects mcpServers key at top level)
58
- * @param {string} filePath
59
- * @returns {Object} mcpServers object or empty object
60
- */
61
- function getMcpServersFromFile(filePath) {
62
- const config = safeReadJson(filePath);
63
- if (!config) return {};
64
- return config.mcpServers || {};
65
- }
66
-
67
- /**
68
- * Get MCP configuration from multiple sources (per official Claude Code docs):
69
- *
70
- * Priority (highest to lowest):
71
- * 1. Enterprise managed-mcp.json (cannot be overridden)
72
- * 2. Local scope (project-specific private in ~/.claude.json)
73
- * 3. Project scope (.mcp.json in project root)
74
- * 4. User scope (mcpServers in ~/.claude.json)
75
- *
76
- * Note: ~/.claude/settings.json is for MCP PERMISSIONS, NOT definitions!
77
- *
78
- * @returns {Object}
79
- */
80
- function getMcpConfig() {
81
- try {
82
- const result = {
83
- projects: {},
84
- userServers: {}, // User-level servers from ~/.claude.json mcpServers
85
- enterpriseServers: {}, // Enterprise managed servers (highest priority)
86
- configSources: [] // Track where configs came from for debugging
87
- };
88
-
89
- // 1. Read Enterprise managed MCP servers (highest priority)
90
- const enterprisePath = getEnterpriseMcpPath();
91
- if (existsSync(enterprisePath)) {
92
- const enterpriseConfig = safeReadJson(enterprisePath);
93
- if (enterpriseConfig?.mcpServers) {
94
- result.enterpriseServers = enterpriseConfig.mcpServers;
95
- result.configSources.push({ type: 'enterprise', path: enterprisePath, count: Object.keys(enterpriseConfig.mcpServers).length });
96
- }
97
- }
98
-
99
- // 2. Read from ~/.claude.json
100
- if (existsSync(CLAUDE_CONFIG_PATH)) {
101
- const claudeConfig = safeReadJson(CLAUDE_CONFIG_PATH);
102
- if (claudeConfig) {
103
- // 2a. User-level mcpServers (top-level mcpServers key)
104
- if (claudeConfig.mcpServers) {
105
- result.userServers = claudeConfig.mcpServers;
106
- result.configSources.push({ type: 'user', path: CLAUDE_CONFIG_PATH, count: Object.keys(claudeConfig.mcpServers).length });
107
- }
108
-
109
- // 2b. Project-specific configurations (projects[path].mcpServers)
110
- if (claudeConfig.projects) {
111
- result.projects = claudeConfig.projects;
112
- }
113
- }
114
- }
115
-
116
- // 3. For each known project, check for .mcp.json (project-level config)
117
- const projectPaths = Object.keys(result.projects);
118
- for (const projectPath of projectPaths) {
119
- const mcpJsonPath = join(projectPath, '.mcp.json');
120
- if (existsSync(mcpJsonPath)) {
121
- const mcpJsonConfig = safeReadJson(mcpJsonPath);
122
- if (mcpJsonConfig?.mcpServers) {
123
- // Merge .mcp.json servers into project config
124
- // Project's .mcp.json has lower priority than ~/.claude.json projects[path].mcpServers
125
- const existingServers = result.projects[projectPath]?.mcpServers || {};
126
- result.projects[projectPath] = {
127
- ...result.projects[projectPath],
128
- mcpServers: {
129
- ...mcpJsonConfig.mcpServers, // .mcp.json (lower priority)
130
- ...existingServers // ~/.claude.json projects[path] (higher priority)
131
- },
132
- mcpJsonPath: mcpJsonPath // Track source for debugging
133
- };
134
- result.configSources.push({ type: 'project-mcp-json', path: mcpJsonPath, count: Object.keys(mcpJsonConfig.mcpServers).length });
135
- }
136
- }
137
- }
138
-
139
- // Build globalServers by merging user and enterprise servers
140
- // Enterprise servers override user servers
141
- result.globalServers = {
142
- ...result.userServers,
143
- ...result.enterpriseServers
144
- };
145
-
146
- return result;
147
- } catch (error: unknown) {
148
- console.error('Error reading MCP config:', error);
149
- return { projects: {}, globalServers: {}, userServers: {}, enterpriseServers: {}, configSources: [], error: (error as Error).message };
150
- }
151
- }
152
-
153
- /**
154
- * Normalize project path for .claude.json (Windows backslash format)
155
- * @param {string} path
156
- * @returns {string}
157
- */
158
- function normalizeProjectPathForConfig(path) {
159
- // Convert forward slashes to backslashes for Windows .claude.json format
160
- let normalized = path.replace(/\//g, '\\');
161
-
162
- // Handle /d/path format -> D:\path
163
- if (normalized.match(/^\\[a-zA-Z]\\/)) {
164
- normalized = normalized.charAt(1).toUpperCase() + ':' + normalized.slice(2);
165
- }
166
-
167
- return normalized;
168
- }
169
-
170
- /**
171
- * Toggle MCP server enabled/disabled
172
- * @param {string} projectPath
173
- * @param {string} serverName
174
- * @param {boolean} enable
175
- * @returns {Object}
176
- */
177
- function toggleMcpServerEnabled(projectPath, serverName, enable) {
178
- try {
179
- if (!existsSync(CLAUDE_CONFIG_PATH)) {
180
- return { error: '.claude.json not found' };
181
- }
182
-
183
- const content = readFileSync(CLAUDE_CONFIG_PATH, 'utf8');
184
- const config = JSON.parse(content);
185
-
186
- const normalizedPath = normalizeProjectPathForConfig(projectPath);
187
-
188
- if (!config.projects || !config.projects[normalizedPath]) {
189
- return { error: `Project not found: ${normalizedPath}` };
190
- }
191
-
192
- const projectConfig = config.projects[normalizedPath];
193
-
194
- // Ensure disabledMcpServers array exists
195
- if (!projectConfig.disabledMcpServers) {
196
- projectConfig.disabledMcpServers = [];
197
- }
198
-
199
- if (enable) {
200
- // Remove from disabled list
201
- projectConfig.disabledMcpServers = projectConfig.disabledMcpServers.filter(s => s !== serverName);
202
- } else {
203
- // Add to disabled list if not already there
204
- if (!projectConfig.disabledMcpServers.includes(serverName)) {
205
- projectConfig.disabledMcpServers.push(serverName);
206
- }
207
- }
208
-
209
- // Write back to file
210
- writeFileSync(CLAUDE_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
211
-
212
- return {
213
- success: true,
214
- serverName,
215
- enabled: enable,
216
- disabledMcpServers: projectConfig.disabledMcpServers
217
- };
218
- } catch (error: unknown) {
219
- console.error('Error toggling MCP server:', error);
220
- return { error: (error as Error).message };
221
- }
222
- }
223
-
224
- /**
225
- * Add MCP server to project
226
- * @param {string} projectPath
227
- * @param {string} serverName
228
- * @param {Object} serverConfig
229
- * @returns {Object}
230
- */
231
- function addMcpServerToProject(projectPath, serverName, serverConfig) {
232
- try {
233
- if (!existsSync(CLAUDE_CONFIG_PATH)) {
234
- return { error: '.claude.json not found' };
235
- }
236
-
237
- const content = readFileSync(CLAUDE_CONFIG_PATH, 'utf8');
238
- const config = JSON.parse(content);
239
-
240
- const normalizedPath = normalizeProjectPathForConfig(projectPath);
241
-
242
- // Create project entry if it doesn't exist
243
- if (!config.projects) {
244
- config.projects = {};
245
- }
246
-
247
- if (!config.projects[normalizedPath]) {
248
- config.projects[normalizedPath] = {
249
- allowedTools: [],
250
- mcpContextUris: [],
251
- mcpServers: {},
252
- enabledMcpjsonServers: [],
253
- disabledMcpjsonServers: [],
254
- hasTrustDialogAccepted: false,
255
- projectOnboardingSeenCount: 0,
256
- hasClaudeMdExternalIncludesApproved: false,
257
- hasClaudeMdExternalIncludesWarningShown: false
258
- };
259
- }
260
-
261
- const projectConfig = config.projects[normalizedPath];
262
-
263
- // Ensure mcpServers exists
264
- if (!projectConfig.mcpServers) {
265
- projectConfig.mcpServers = {};
266
- }
267
-
268
- // Add the server
269
- projectConfig.mcpServers[serverName] = serverConfig;
270
-
271
- // Write back to file
272
- writeFileSync(CLAUDE_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
273
-
274
- return {
275
- success: true,
276
- serverName,
277
- serverConfig
278
- };
279
- } catch (error: unknown) {
280
- console.error('Error adding MCP server:', error);
281
- return { error: (error as Error).message };
282
- }
283
- }
284
-
285
- /**
286
- * Remove MCP server from project
287
- * @param {string} projectPath
288
- * @param {string} serverName
289
- * @returns {Object}
290
- */
291
- function removeMcpServerFromProject(projectPath, serverName) {
292
- try {
293
- if (!existsSync(CLAUDE_CONFIG_PATH)) {
294
- return { error: '.claude.json not found' };
295
- }
296
-
297
- const content = readFileSync(CLAUDE_CONFIG_PATH, 'utf8');
298
- const config = JSON.parse(content);
299
-
300
- const normalizedPath = normalizeProjectPathForConfig(projectPath);
301
-
302
- if (!config.projects || !config.projects[normalizedPath]) {
303
- return { error: `Project not found: ${normalizedPath}` };
304
- }
305
-
306
- const projectConfig = config.projects[normalizedPath];
307
-
308
- if (!projectConfig.mcpServers || !projectConfig.mcpServers[serverName]) {
309
- return { error: `Server not found: ${serverName}` };
310
- }
311
-
312
- // Remove the server
313
- delete projectConfig.mcpServers[serverName];
314
-
315
- // Also remove from disabled list if present
316
- if (projectConfig.disabledMcpServers) {
317
- projectConfig.disabledMcpServers = projectConfig.disabledMcpServers.filter(s => s !== serverName);
318
- }
319
-
320
- // Write back to file
321
- writeFileSync(CLAUDE_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
322
-
323
- return {
324
- success: true,
325
- serverName,
326
- removed: true
327
- };
328
- } catch (error: unknown) {
329
- console.error('Error removing MCP server:', error);
330
- return { error: (error as Error).message };
331
- }
332
- }
333
-
334
- /**
335
- * Add MCP server to global/user scope (top-level mcpServers in ~/.claude.json)
336
- * @param {string} serverName
337
- * @param {Object} serverConfig
338
- * @returns {Object}
339
- */
340
- function addGlobalMcpServer(serverName, serverConfig) {
341
- try {
342
- if (!existsSync(CLAUDE_CONFIG_PATH)) {
343
- return { error: '.claude.json not found' };
344
- }
345
-
346
- const content = readFileSync(CLAUDE_CONFIG_PATH, 'utf8');
347
- const config = JSON.parse(content);
348
-
349
- // Ensure top-level mcpServers exists
350
- if (!config.mcpServers) {
351
- config.mcpServers = {};
352
- }
353
-
354
- // Add the server to top-level mcpServers
355
- config.mcpServers[serverName] = serverConfig;
356
-
357
- // Write back to file
358
- writeFileSync(CLAUDE_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
359
-
360
- return {
361
- success: true,
362
- serverName,
363
- serverConfig,
364
- scope: 'global'
365
- };
366
- } catch (error: unknown) {
367
- console.error('Error adding global MCP server:', error);
368
- return { error: (error as Error).message };
369
- }
370
- }
371
-
372
- /**
373
- * Remove MCP server from global/user scope (top-level mcpServers)
374
- * @param {string} serverName
375
- * @returns {Object}
376
- */
377
- function removeGlobalMcpServer(serverName) {
378
- try {
379
- if (!existsSync(CLAUDE_CONFIG_PATH)) {
380
- return { error: '.claude.json not found' };
381
- }
382
-
383
- const content = readFileSync(CLAUDE_CONFIG_PATH, 'utf8');
384
- const config = JSON.parse(content);
385
-
386
- if (!config.mcpServers || !config.mcpServers[serverName]) {
387
- return { error: `Global server not found: ${serverName}` };
388
- }
389
-
390
- // Remove the server from top-level mcpServers
391
- delete config.mcpServers[serverName];
392
-
393
- // Write back to file
394
- writeFileSync(CLAUDE_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
395
-
396
- return {
397
- success: true,
398
- serverName,
399
- removed: true,
400
- scope: 'global'
401
- };
402
- } catch (error: unknown) {
403
- console.error('Error removing global MCP server:', error);
404
- return { error: (error as Error).message };
405
- }
406
- }
407
-
408
- /**
409
- * Read settings file safely
410
- * @param {string} filePath
411
- * @returns {Object}
412
- */
413
- function readSettingsFile(filePath) {
414
- try {
415
- if (!existsSync(filePath)) {
416
- return {};
417
- }
418
- const content = readFileSync(filePath, 'utf8');
419
- return JSON.parse(content);
420
- } catch (error: unknown) {
421
- console.error(`Error reading settings file ${filePath}:`, error);
422
- return {};
423
- }
424
- }
425
-
426
- /**
427
- * Write settings file safely
428
- * @param {string} filePath
429
- * @param {Object} settings
430
- */
431
- function writeSettingsFile(filePath, settings) {
432
- const dirPath = dirname(filePath);
433
- // Ensure directory exists
434
- if (!existsSync(dirPath)) {
435
- mkdirSync(dirPath, { recursive: true });
436
- }
437
- writeFileSync(filePath, JSON.stringify(settings, null, 2), 'utf8');
438
- }
439
-
440
- /**
441
- * Get project settings path
442
- * @param {string} projectPath
443
- * @returns {string}
444
- */
445
- function getProjectSettingsPath(projectPath) {
446
- const normalizedPath = projectPath.replace(/\//g, '\\').replace(/^\\([a-zA-Z])\\/, '$1:\\');
447
- return join(normalizedPath, '.claude', 'settings.json');
448
- }
449
-
450
- // ========================================
451
- // Route Handlers
452
- // ========================================
453
-
454
- /**
455
- * Handle MCP routes
456
- * @returns true if route was handled, false otherwise
457
- */
458
- export async function handleMcpRoutes(ctx: RouteContext): Promise<boolean> {
459
- const { pathname, url, req, res, initialPath, handlePostRequest, broadcastToClients } = ctx;
460
-
461
- // API: Get MCP configuration
462
- if (pathname === '/api/mcp-config') {
463
- const mcpData = getMcpConfig();
464
- res.writeHead(200, { 'Content-Type': 'application/json' });
465
- res.end(JSON.stringify(mcpData));
466
- return true;
467
- }
468
-
469
- // API: Toggle MCP server enabled/disabled
470
- if (pathname === '/api/mcp-toggle' && req.method === 'POST') {
471
- handlePostRequest(req, res, async (body) => {
472
- const { projectPath, serverName, enable } = body;
473
- if (!projectPath || !serverName) {
474
- return { error: 'projectPath and serverName are required', status: 400 };
475
- }
476
- return toggleMcpServerEnabled(projectPath, serverName, enable);
477
- });
478
- return true;
479
- }
480
-
481
- // API: Copy MCP server to project
482
- if (pathname === '/api/mcp-copy-server' && req.method === 'POST') {
483
- handlePostRequest(req, res, async (body) => {
484
- const { projectPath, serverName, serverConfig } = body;
485
- if (!projectPath || !serverName || !serverConfig) {
486
- return { error: 'projectPath, serverName, and serverConfig are required', status: 400 };
487
- }
488
- return addMcpServerToProject(projectPath, serverName, serverConfig);
489
- });
490
- return true;
491
- }
492
-
493
- // API: Install CCW MCP server to project
494
- if (pathname === '/api/mcp-install-ccw' && req.method === 'POST') {
495
- handlePostRequest(req, res, async (body) => {
496
- const { projectPath } = body;
497
- if (!projectPath) {
498
- return { error: 'projectPath is required', status: 400 };
499
- }
500
-
501
- // Generate CCW MCP server config
502
- const ccwMcpConfig = {
503
- command: "ccw-mcp",
504
- args: []
505
- };
506
-
507
- // Use existing addMcpServerToProject to install CCW MCP
508
- return addMcpServerToProject(projectPath, 'ccw-mcp', ccwMcpConfig);
509
- });
510
- return true;
511
- }
512
-
513
- // API: Remove MCP server from project
514
- if (pathname === '/api/mcp-remove-server' && req.method === 'POST') {
515
- handlePostRequest(req, res, async (body) => {
516
- const { projectPath, serverName } = body;
517
- if (!projectPath || !serverName) {
518
- return { error: 'projectPath and serverName are required', status: 400 };
519
- }
520
- return removeMcpServerFromProject(projectPath, serverName);
521
- });
522
- return true;
523
- }
524
-
525
- // API: Add MCP server to global scope (top-level mcpServers in ~/.claude.json)
526
- if (pathname === '/api/mcp-add-global-server' && req.method === 'POST') {
527
- handlePostRequest(req, res, async (body) => {
528
- const { serverName, serverConfig } = body;
529
- if (!serverName || !serverConfig) {
530
- return { error: 'serverName and serverConfig are required', status: 400 };
531
- }
532
- return addGlobalMcpServer(serverName, serverConfig);
533
- });
534
- return true;
535
- }
536
-
537
- // API: Remove MCP server from global scope
538
- if (pathname === '/api/mcp-remove-global-server' && req.method === 'POST') {
539
- handlePostRequest(req, res, async (body) => {
540
- const { serverName } = body;
541
- if (!serverName) {
542
- return { error: 'serverName is required', status: 400 };
543
- }
544
- return removeGlobalMcpServer(serverName);
545
- });
546
- return true;
547
- }
548
-
549
- return false;
550
- }
1
+ /**
2
+ * MCP Routes Module
3
+ * Handles all MCP-related API endpoints
4
+ */
5
+ import type { IncomingMessage, ServerResponse } from 'http';
6
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
7
+ import { join, dirname } from 'path';
8
+ import { homedir } from 'os';
9
+
10
+ // Claude config file path
11
+ const CLAUDE_CONFIG_PATH = join(homedir(), '.claude.json');
12
+
13
+ export interface RouteContext {
14
+ pathname: string;
15
+ url: URL;
16
+ req: IncomingMessage;
17
+ res: ServerResponse;
18
+ initialPath: string;
19
+ handlePostRequest: (req: IncomingMessage, res: ServerResponse, handler: (body: unknown) => Promise<any>) => void;
20
+ broadcastToClients: (data: unknown) => void;
21
+ }
22
+
23
+ // ========================================
24
+ // Helper Functions
25
+ // ========================================
26
+
27
+ /**
28
+ * Get enterprise managed MCP path (platform-specific)
29
+ */
30
+ function getEnterpriseMcpPath(): string {
31
+ const platform = process.platform;
32
+ if (platform === 'darwin') {
33
+ return '/Library/Application Support/ClaudeCode/managed-mcp.json';
34
+ } else if (platform === 'win32') {
35
+ return 'C:\\Program Files\\ClaudeCode\\managed-mcp.json';
36
+ } else {
37
+ // Linux and WSL
38
+ return '/etc/claude-code/managed-mcp.json';
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Safely read and parse JSON file
44
+ */
45
+ function safeReadJson(filePath) {
46
+ try {
47
+ if (!existsSync(filePath)) return null;
48
+ const content = readFileSync(filePath, 'utf8');
49
+ return JSON.parse(content);
50
+ } catch {
51
+ return null;
52
+ }
53
+ }
54
+
55
+ /**
56
+ * Get MCP servers from a JSON file (expects mcpServers key at top level)
57
+ * @param {string} filePath
58
+ * @returns {Object} mcpServers object or empty object
59
+ */
60
+ function getMcpServersFromFile(filePath) {
61
+ const config = safeReadJson(filePath);
62
+ if (!config) return {};
63
+ return config.mcpServers || {};
64
+ }
65
+
66
+ /**
67
+ * Get MCP configuration from multiple sources (per official Claude Code docs):
68
+ *
69
+ * Priority (highest to lowest):
70
+ * 1. Enterprise managed-mcp.json (cannot be overridden)
71
+ * 2. Local scope (project-specific private in ~/.claude.json)
72
+ * 3. Project scope (.mcp.json in project root)
73
+ * 4. User scope (mcpServers in ~/.claude.json)
74
+ *
75
+ * Note: ~/.claude/settings.json is for MCP PERMISSIONS, NOT definitions!
76
+ *
77
+ * @returns {Object}
78
+ */
79
+ function getMcpConfig() {
80
+ try {
81
+ const result = {
82
+ projects: {},
83
+ userServers: {}, // User-level servers from ~/.claude.json mcpServers
84
+ enterpriseServers: {}, // Enterprise managed servers (highest priority)
85
+ configSources: [] // Track where configs came from for debugging
86
+ };
87
+
88
+ // 1. Read Enterprise managed MCP servers (highest priority)
89
+ const enterprisePath = getEnterpriseMcpPath();
90
+ if (existsSync(enterprisePath)) {
91
+ const enterpriseConfig = safeReadJson(enterprisePath);
92
+ if (enterpriseConfig?.mcpServers) {
93
+ result.enterpriseServers = enterpriseConfig.mcpServers;
94
+ result.configSources.push({ type: 'enterprise', path: enterprisePath, count: Object.keys(enterpriseConfig.mcpServers).length });
95
+ }
96
+ }
97
+
98
+ // 2. Read from ~/.claude.json
99
+ if (existsSync(CLAUDE_CONFIG_PATH)) {
100
+ const claudeConfig = safeReadJson(CLAUDE_CONFIG_PATH);
101
+ if (claudeConfig) {
102
+ // 2a. User-level mcpServers (top-level mcpServers key)
103
+ if (claudeConfig.mcpServers) {
104
+ result.userServers = claudeConfig.mcpServers;
105
+ result.configSources.push({ type: 'user', path: CLAUDE_CONFIG_PATH, count: Object.keys(claudeConfig.mcpServers).length });
106
+ }
107
+
108
+ // 2b. Project-specific configurations (projects[path].mcpServers)
109
+ if (claudeConfig.projects) {
110
+ result.projects = claudeConfig.projects;
111
+ }
112
+ }
113
+ }
114
+
115
+ // 3. For each known project, check for .mcp.json (project-level config)
116
+ const projectPaths = Object.keys(result.projects);
117
+ for (const projectPath of projectPaths) {
118
+ const mcpJsonPath = join(projectPath, '.mcp.json');
119
+ if (existsSync(mcpJsonPath)) {
120
+ const mcpJsonConfig = safeReadJson(mcpJsonPath);
121
+ if (mcpJsonConfig?.mcpServers) {
122
+ // Merge .mcp.json servers into project config
123
+ // Project's .mcp.json has lower priority than ~/.claude.json projects[path].mcpServers
124
+ const existingServers = result.projects[projectPath]?.mcpServers || {};
125
+ result.projects[projectPath] = {
126
+ ...result.projects[projectPath],
127
+ mcpServers: {
128
+ ...mcpJsonConfig.mcpServers, // .mcp.json (lower priority)
129
+ ...existingServers // ~/.claude.json projects[path] (higher priority)
130
+ },
131
+ mcpJsonPath: mcpJsonPath // Track source for debugging
132
+ };
133
+ result.configSources.push({ type: 'project-mcp-json', path: mcpJsonPath, count: Object.keys(mcpJsonConfig.mcpServers).length });
134
+ }
135
+ }
136
+ }
137
+
138
+ // Build globalServers by merging user and enterprise servers
139
+ // Enterprise servers override user servers
140
+ result.globalServers = {
141
+ ...result.userServers,
142
+ ...result.enterpriseServers
143
+ };
144
+
145
+ return result;
146
+ } catch (error: unknown) {
147
+ console.error('Error reading MCP config:', error);
148
+ return { projects: {}, globalServers: {}, userServers: {}, enterpriseServers: {}, configSources: [], error: (error as Error).message };
149
+ }
150
+ }
151
+
152
+ /**
153
+ * Normalize project path for .claude.json (Windows backslash format)
154
+ * @param {string} path
155
+ * @returns {string}
156
+ */
157
+ function normalizeProjectPathForConfig(path) {
158
+ // Convert forward slashes to backslashes for Windows .claude.json format
159
+ let normalized = path.replace(/\//g, '\\');
160
+
161
+ // Handle /d/path format -> D:\path
162
+ if (normalized.match(/^\\[a-zA-Z]\\/)) {
163
+ normalized = normalized.charAt(1).toUpperCase() + ':' + normalized.slice(2);
164
+ }
165
+
166
+ return normalized;
167
+ }
168
+
169
+ /**
170
+ * Toggle MCP server enabled/disabled
171
+ * @param {string} projectPath
172
+ * @param {string} serverName
173
+ * @param {boolean} enable
174
+ * @returns {Object}
175
+ */
176
+ function toggleMcpServerEnabled(projectPath, serverName, enable) {
177
+ try {
178
+ if (!existsSync(CLAUDE_CONFIG_PATH)) {
179
+ return { error: '.claude.json not found' };
180
+ }
181
+
182
+ const content = readFileSync(CLAUDE_CONFIG_PATH, 'utf8');
183
+ const config = JSON.parse(content);
184
+
185
+ const normalizedPath = normalizeProjectPathForConfig(projectPath);
186
+
187
+ if (!config.projects || !config.projects[normalizedPath]) {
188
+ return { error: `Project not found: ${normalizedPath}` };
189
+ }
190
+
191
+ const projectConfig = config.projects[normalizedPath];
192
+
193
+ // Ensure disabledMcpServers array exists
194
+ if (!projectConfig.disabledMcpServers) {
195
+ projectConfig.disabledMcpServers = [];
196
+ }
197
+
198
+ if (enable) {
199
+ // Remove from disabled list
200
+ projectConfig.disabledMcpServers = projectConfig.disabledMcpServers.filter(s => s !== serverName);
201
+ } else {
202
+ // Add to disabled list if not already there
203
+ if (!projectConfig.disabledMcpServers.includes(serverName)) {
204
+ projectConfig.disabledMcpServers.push(serverName);
205
+ }
206
+ }
207
+
208
+ // Write back to file
209
+ writeFileSync(CLAUDE_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
210
+
211
+ return {
212
+ success: true,
213
+ serverName,
214
+ enabled: enable,
215
+ disabledMcpServers: projectConfig.disabledMcpServers
216
+ };
217
+ } catch (error: unknown) {
218
+ console.error('Error toggling MCP server:', error);
219
+ return { error: (error as Error).message };
220
+ }
221
+ }
222
+
223
+ /**
224
+ * Add MCP server to project
225
+ * @param {string} projectPath
226
+ * @param {string} serverName
227
+ * @param {Object} serverConfig
228
+ * @returns {Object}
229
+ */
230
+ function addMcpServerToProject(projectPath, serverName, serverConfig) {
231
+ try {
232
+ if (!existsSync(CLAUDE_CONFIG_PATH)) {
233
+ return { error: '.claude.json not found' };
234
+ }
235
+
236
+ const content = readFileSync(CLAUDE_CONFIG_PATH, 'utf8');
237
+ const config = JSON.parse(content);
238
+
239
+ const normalizedPath = normalizeProjectPathForConfig(projectPath);
240
+
241
+ // Create project entry if it doesn't exist
242
+ if (!config.projects) {
243
+ config.projects = {};
244
+ }
245
+
246
+ if (!config.projects[normalizedPath]) {
247
+ config.projects[normalizedPath] = {
248
+ allowedTools: [],
249
+ mcpContextUris: [],
250
+ mcpServers: {},
251
+ enabledMcpjsonServers: [],
252
+ disabledMcpjsonServers: [],
253
+ hasTrustDialogAccepted: false,
254
+ projectOnboardingSeenCount: 0,
255
+ hasClaudeMdExternalIncludesApproved: false,
256
+ hasClaudeMdExternalIncludesWarningShown: false
257
+ };
258
+ }
259
+
260
+ const projectConfig = config.projects[normalizedPath];
261
+
262
+ // Ensure mcpServers exists
263
+ if (!projectConfig.mcpServers) {
264
+ projectConfig.mcpServers = {};
265
+ }
266
+
267
+ // Add the server
268
+ projectConfig.mcpServers[serverName] = serverConfig;
269
+
270
+ // Write back to file
271
+ writeFileSync(CLAUDE_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
272
+
273
+ return {
274
+ success: true,
275
+ serverName,
276
+ serverConfig
277
+ };
278
+ } catch (error: unknown) {
279
+ console.error('Error adding MCP server:', error);
280
+ return { error: (error as Error).message };
281
+ }
282
+ }
283
+
284
+ /**
285
+ * Remove MCP server from project
286
+ * @param {string} projectPath
287
+ * @param {string} serverName
288
+ * @returns {Object}
289
+ */
290
+ function removeMcpServerFromProject(projectPath, serverName) {
291
+ try {
292
+ if (!existsSync(CLAUDE_CONFIG_PATH)) {
293
+ return { error: '.claude.json not found' };
294
+ }
295
+
296
+ const content = readFileSync(CLAUDE_CONFIG_PATH, 'utf8');
297
+ const config = JSON.parse(content);
298
+
299
+ const normalizedPath = normalizeProjectPathForConfig(projectPath);
300
+
301
+ if (!config.projects || !config.projects[normalizedPath]) {
302
+ return { error: `Project not found: ${normalizedPath}` };
303
+ }
304
+
305
+ const projectConfig = config.projects[normalizedPath];
306
+
307
+ if (!projectConfig.mcpServers || !projectConfig.mcpServers[serverName]) {
308
+ return { error: `Server not found: ${serverName}` };
309
+ }
310
+
311
+ // Remove the server
312
+ delete projectConfig.mcpServers[serverName];
313
+
314
+ // Also remove from disabled list if present
315
+ if (projectConfig.disabledMcpServers) {
316
+ projectConfig.disabledMcpServers = projectConfig.disabledMcpServers.filter(s => s !== serverName);
317
+ }
318
+
319
+ // Write back to file
320
+ writeFileSync(CLAUDE_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
321
+
322
+ return {
323
+ success: true,
324
+ serverName,
325
+ removed: true
326
+ };
327
+ } catch (error: unknown) {
328
+ console.error('Error removing MCP server:', error);
329
+ return { error: (error as Error).message };
330
+ }
331
+ }
332
+
333
+ /**
334
+ * Add MCP server to global/user scope (top-level mcpServers in ~/.claude.json)
335
+ * @param {string} serverName
336
+ * @param {Object} serverConfig
337
+ * @returns {Object}
338
+ */
339
+ function addGlobalMcpServer(serverName, serverConfig) {
340
+ try {
341
+ if (!existsSync(CLAUDE_CONFIG_PATH)) {
342
+ return { error: '.claude.json not found' };
343
+ }
344
+
345
+ const content = readFileSync(CLAUDE_CONFIG_PATH, 'utf8');
346
+ const config = JSON.parse(content);
347
+
348
+ // Ensure top-level mcpServers exists
349
+ if (!config.mcpServers) {
350
+ config.mcpServers = {};
351
+ }
352
+
353
+ // Add the server to top-level mcpServers
354
+ config.mcpServers[serverName] = serverConfig;
355
+
356
+ // Write back to file
357
+ writeFileSync(CLAUDE_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
358
+
359
+ return {
360
+ success: true,
361
+ serverName,
362
+ serverConfig,
363
+ scope: 'global'
364
+ };
365
+ } catch (error: unknown) {
366
+ console.error('Error adding global MCP server:', error);
367
+ return { error: (error as Error).message };
368
+ }
369
+ }
370
+
371
+ /**
372
+ * Remove MCP server from global/user scope (top-level mcpServers)
373
+ * @param {string} serverName
374
+ * @returns {Object}
375
+ */
376
+ function removeGlobalMcpServer(serverName) {
377
+ try {
378
+ if (!existsSync(CLAUDE_CONFIG_PATH)) {
379
+ return { error: '.claude.json not found' };
380
+ }
381
+
382
+ const content = readFileSync(CLAUDE_CONFIG_PATH, 'utf8');
383
+ const config = JSON.parse(content);
384
+
385
+ if (!config.mcpServers || !config.mcpServers[serverName]) {
386
+ return { error: `Global server not found: ${serverName}` };
387
+ }
388
+
389
+ // Remove the server from top-level mcpServers
390
+ delete config.mcpServers[serverName];
391
+
392
+ // Write back to file
393
+ writeFileSync(CLAUDE_CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
394
+
395
+ return {
396
+ success: true,
397
+ serverName,
398
+ removed: true,
399
+ scope: 'global'
400
+ };
401
+ } catch (error: unknown) {
402
+ console.error('Error removing global MCP server:', error);
403
+ return { error: (error as Error).message };
404
+ }
405
+ }
406
+
407
+ /**
408
+ * Read settings file safely
409
+ * @param {string} filePath
410
+ * @returns {Object}
411
+ */
412
+ function readSettingsFile(filePath) {
413
+ try {
414
+ if (!existsSync(filePath)) {
415
+ return {};
416
+ }
417
+ const content = readFileSync(filePath, 'utf8');
418
+ return JSON.parse(content);
419
+ } catch (error: unknown) {
420
+ console.error(`Error reading settings file ${filePath}:`, error);
421
+ return {};
422
+ }
423
+ }
424
+
425
+ /**
426
+ * Write settings file safely
427
+ * @param {string} filePath
428
+ * @param {Object} settings
429
+ */
430
+ function writeSettingsFile(filePath, settings) {
431
+ const dirPath = dirname(filePath);
432
+ // Ensure directory exists
433
+ if (!existsSync(dirPath)) {
434
+ mkdirSync(dirPath, { recursive: true });
435
+ }
436
+ writeFileSync(filePath, JSON.stringify(settings, null, 2), 'utf8');
437
+ }
438
+
439
+ /**
440
+ * Get project settings path
441
+ * @param {string} projectPath
442
+ * @returns {string}
443
+ */
444
+ function getProjectSettingsPath(projectPath) {
445
+ const normalizedPath = projectPath.replace(/\//g, '\\').replace(/^\\([a-zA-Z])\\/, '$1:\\');
446
+ return join(normalizedPath, '.claude', 'settings.json');
447
+ }
448
+
449
+ // ========================================
450
+ // Route Handlers
451
+ // ========================================
452
+
453
+ /**
454
+ * Handle MCP routes
455
+ * @returns true if route was handled, false otherwise
456
+ */
457
+ export async function handleMcpRoutes(ctx: RouteContext): Promise<boolean> {
458
+ const { pathname, url, req, res, initialPath, handlePostRequest, broadcastToClients } = ctx;
459
+
460
+ // API: Get MCP configuration
461
+ if (pathname === '/api/mcp-config') {
462
+ const mcpData = getMcpConfig();
463
+ res.writeHead(200, { 'Content-Type': 'application/json' });
464
+ res.end(JSON.stringify(mcpData));
465
+ return true;
466
+ }
467
+
468
+ // API: Toggle MCP server enabled/disabled
469
+ if (pathname === '/api/mcp-toggle' && req.method === 'POST') {
470
+ handlePostRequest(req, res, async (body) => {
471
+ const { projectPath, serverName, enable } = body;
472
+ if (!projectPath || !serverName) {
473
+ return { error: 'projectPath and serverName are required', status: 400 };
474
+ }
475
+ return toggleMcpServerEnabled(projectPath, serverName, enable);
476
+ });
477
+ return true;
478
+ }
479
+
480
+ // API: Copy MCP server to project
481
+ if (pathname === '/api/mcp-copy-server' && req.method === 'POST') {
482
+ handlePostRequest(req, res, async (body) => {
483
+ const { projectPath, serverName, serverConfig } = body;
484
+ if (!projectPath || !serverName || !serverConfig) {
485
+ return { error: 'projectPath, serverName, and serverConfig are required', status: 400 };
486
+ }
487
+ return addMcpServerToProject(projectPath, serverName, serverConfig);
488
+ });
489
+ return true;
490
+ }
491
+
492
+ // API: Install CCW MCP server to project
493
+ if (pathname === '/api/mcp-install-ccw' && req.method === 'POST') {
494
+ handlePostRequest(req, res, async (body) => {
495
+ const { projectPath } = body;
496
+ if (!projectPath) {
497
+ return { error: 'projectPath is required', status: 400 };
498
+ }
499
+
500
+ // Generate CCW MCP server config
501
+ const ccwMcpConfig = {
502
+ command: "ccw-mcp",
503
+ args: []
504
+ };
505
+
506
+ // Use existing addMcpServerToProject to install CCW MCP
507
+ return addMcpServerToProject(projectPath, 'ccw-mcp', ccwMcpConfig);
508
+ });
509
+ return true;
510
+ }
511
+
512
+ // API: Remove MCP server from project
513
+ if (pathname === '/api/mcp-remove-server' && req.method === 'POST') {
514
+ handlePostRequest(req, res, async (body) => {
515
+ const { projectPath, serverName } = body;
516
+ if (!projectPath || !serverName) {
517
+ return { error: 'projectPath and serverName are required', status: 400 };
518
+ }
519
+ return removeMcpServerFromProject(projectPath, serverName);
520
+ });
521
+ return true;
522
+ }
523
+
524
+ // API: Add MCP server to global scope (top-level mcpServers in ~/.claude.json)
525
+ if (pathname === '/api/mcp-add-global-server' && req.method === 'POST') {
526
+ handlePostRequest(req, res, async (body) => {
527
+ const { serverName, serverConfig } = body;
528
+ if (!serverName || !serverConfig) {
529
+ return { error: 'serverName and serverConfig are required', status: 400 };
530
+ }
531
+ return addGlobalMcpServer(serverName, serverConfig);
532
+ });
533
+ return true;
534
+ }
535
+
536
+ // API: Remove MCP server from global scope
537
+ if (pathname === '/api/mcp-remove-global-server' && req.method === 'POST') {
538
+ handlePostRequest(req, res, async (body) => {
539
+ const { serverName } = body;
540
+ if (!serverName) {
541
+ return { error: 'serverName is required', status: 400 };
542
+ }
543
+ return removeGlobalMcpServer(serverName);
544
+ });
545
+ return true;
546
+ }
547
+
548
+ return false;
549
+ }