claude-code-workflow 6.3.18 → 6.3.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (822) hide show
  1. package/.claude/CLAUDE.md +8 -5
  2. package/.claude/agents/action-planning-agent.md +26 -2
  3. package/.claude/agents/code-developer.md +132 -43
  4. package/.claude/agents/debug-explore-agent.md +434 -0
  5. package/.claude/agents/test-fix-agent.md +14 -0
  6. package/.claude/commands/issue/discover.md +41 -0
  7. package/.claude/commands/issue/execute.md +200 -19
  8. package/.claude/commands/issue/new.md +1 -1
  9. package/.claude/commands/issue/plan.md +6 -1
  10. package/.claude/commands/issue/queue.md +94 -39
  11. package/.claude/commands/memory/swagger-docs.md +773 -0
  12. package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
  13. package/.claude/commands/workflow/execute.md +54 -34
  14. package/.claude/commands/workflow/lite-execute.md +48 -164
  15. package/.claude/commands/workflow/lite-fix.md +4 -4
  16. package/.claude/commands/workflow/lite-plan.md +5 -5
  17. package/.claude/commands/workflow/plan.md +27 -27
  18. package/.claude/commands/workflow/review.md +42 -17
  19. package/.claude/commands/workflow/tdd-plan.md +25 -25
  20. package/.claude/commands/workflow/test-fix-gen.md +10 -10
  21. package/.claude/commands/workflow/test-gen.md +14 -14
  22. package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
  23. package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
  24. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
  25. package/.claude/skills/ccw/SKILL.md +462 -0
  26. package/.claude/skills/ccw/index/command-capabilities.json +127 -0
  27. package/.claude/skills/ccw/index/intent-rules.json +136 -0
  28. package/.claude/skills/ccw/index/workflow-chains.json +451 -0
  29. package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
  30. package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
  31. package/.claude/skills/ccw/phases/actions/docs.md +93 -0
  32. package/.claude/skills/ccw/phases/actions/full.md +154 -0
  33. package/.claude/skills/ccw/phases/actions/issue.md +201 -0
  34. package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
  35. package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
  36. package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
  37. package/.claude/skills/ccw/phases/actions/ui.md +79 -0
  38. package/.claude/skills/ccw/phases/orchestrator.md +435 -0
  39. package/.claude/skills/ccw/specs/intent-classification.md +336 -0
  40. package/.claude/skills/ccw-help/SKILL.md +177 -0
  41. package/.claude/skills/ccw-help/index/all-agents.json +82 -0
  42. package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
  43. package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
  44. package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
  45. package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
  46. package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
  47. package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
  48. package/.claude/skills/code-reviewer/README.md +340 -0
  49. package/.claude/skills/code-reviewer/SKILL.md +308 -0
  50. package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
  51. package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
  52. package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
  53. package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
  54. package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
  55. package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
  56. package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
  57. package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
  58. package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
  59. package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
  60. package/.claude/skills/skill-generator/SKILL.md +187 -0
  61. package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
  62. package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
  63. package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
  64. package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
  65. package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
  66. package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
  67. package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
  68. package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
  69. package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
  70. package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
  71. package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
  72. package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
  73. package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
  74. package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
  75. package/.claude/skills/skill-generator/templates/script-python.md +198 -0
  76. package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
  77. package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
  78. package/.claude/workflows/chinese-response.md +15 -28
  79. package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
  80. package/.claude/workflows/cli-tools-usage.md +221 -177
  81. package/.claude/workflows/windows-platform.md +13 -10
  82. package/.codex/prompts/issue-execute.md +305 -82
  83. package/.codex/prompts/issue-queue.md +22 -0
  84. package/.codex/prompts/lite-execute.md +36 -11
  85. package/README.md +309 -305
  86. package/ccw/README.md +10 -4
  87. package/ccw/dist/cli.d.ts.map +1 -1
  88. package/ccw/dist/cli.js +4 -1
  89. package/ccw/dist/cli.js.map +1 -1
  90. package/ccw/dist/commands/cli.d.ts.map +1 -1
  91. package/ccw/dist/commands/cli.js +131 -34
  92. package/ccw/dist/commands/cli.js.map +1 -1
  93. package/ccw/dist/commands/issue.d.ts +152 -0
  94. package/ccw/dist/commands/issue.d.ts.map +1 -1
  95. package/ccw/dist/commands/issue.js +550 -85
  96. package/ccw/dist/commands/issue.js.map +1 -1
  97. package/ccw/dist/commands/serve.d.ts +1 -0
  98. package/ccw/dist/commands/serve.d.ts.map +1 -1
  99. package/ccw/dist/commands/serve.js +12 -5
  100. package/ccw/dist/commands/serve.js.map +1 -1
  101. package/ccw/dist/commands/stop.d.ts.map +1 -1
  102. package/ccw/dist/commands/stop.js +29 -5
  103. package/ccw/dist/commands/stop.js.map +1 -1
  104. package/ccw/dist/commands/tool.d.ts.map +1 -1
  105. package/ccw/dist/commands/tool.js +19 -2
  106. package/ccw/dist/commands/tool.js.map +1 -1
  107. package/ccw/dist/commands/view.d.ts +1 -0
  108. package/ccw/dist/commands/view.d.ts.map +1 -1
  109. package/ccw/dist/commands/view.js +10 -3
  110. package/ccw/dist/commands/view.js.map +1 -1
  111. package/ccw/dist/config/cli-settings-manager.d.ts +86 -0
  112. package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -0
  113. package/ccw/dist/config/cli-settings-manager.js +392 -0
  114. package/ccw/dist/config/cli-settings-manager.js.map +1 -0
  115. package/ccw/dist/config/litellm-api-config-manager.d.ts +71 -5
  116. package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
  117. package/ccw/dist/config/litellm-api-config-manager.js +290 -20
  118. package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
  119. package/ccw/dist/core/auth/csrf-manager.d.ts +18 -0
  120. package/ccw/dist/core/auth/csrf-manager.d.ts.map +1 -0
  121. package/ccw/dist/core/auth/csrf-manager.js +80 -0
  122. package/ccw/dist/core/auth/csrf-manager.js.map +1 -0
  123. package/ccw/dist/core/auth/csrf-middleware.d.ts +8 -0
  124. package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -0
  125. package/ccw/dist/core/auth/csrf-middleware.js +141 -0
  126. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -0
  127. package/ccw/dist/core/auth/middleware.d.ts +15 -0
  128. package/ccw/dist/core/auth/middleware.d.ts.map +1 -0
  129. package/ccw/dist/core/auth/middleware.js +76 -0
  130. package/ccw/dist/core/auth/middleware.js.map +1 -0
  131. package/ccw/dist/core/auth/token-manager.d.ts +41 -0
  132. package/ccw/dist/core/auth/token-manager.d.ts.map +1 -0
  133. package/ccw/dist/core/auth/token-manager.js +171 -0
  134. package/ccw/dist/core/auth/token-manager.js.map +1 -0
  135. package/ccw/dist/core/cache-manager.d.ts +6 -6
  136. package/ccw/dist/core/cache-manager.d.ts.map +1 -1
  137. package/ccw/dist/core/cache-manager.js +70 -48
  138. package/ccw/dist/core/cache-manager.js.map +1 -1
  139. package/ccw/dist/core/claude-freshness.d.ts.map +1 -1
  140. package/ccw/dist/core/claude-freshness.js +23 -3
  141. package/ccw/dist/core/claude-freshness.js.map +1 -1
  142. package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
  143. package/ccw/dist/core/core-memory-store.js +2 -1
  144. package/ccw/dist/core/core-memory-store.js.map +1 -1
  145. package/ccw/dist/core/cors.d.ts +3 -0
  146. package/ccw/dist/core/cors.d.ts.map +1 -0
  147. package/ccw/dist/core/cors.js +10 -0
  148. package/ccw/dist/core/cors.js.map +1 -0
  149. package/ccw/dist/core/dashboard-generator-patch.js +0 -1
  150. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
  151. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  152. package/ccw/dist/core/dashboard-generator.js +417 -416
  153. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  154. package/ccw/dist/core/data-aggregator.js +2 -2
  155. package/ccw/dist/core/data-aggregator.js.map +1 -1
  156. package/ccw/dist/core/lite-scanner.d.ts +1 -1
  157. package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
  158. package/ccw/dist/core/lite-scanner.js +130 -127
  159. package/ccw/dist/core/lite-scanner.js.map +1 -1
  160. package/ccw/dist/core/routes/auth-routes.d.ts +12 -0
  161. package/ccw/dist/core/routes/auth-routes.d.ts.map +1 -0
  162. package/ccw/dist/core/routes/auth-routes.js +80 -0
  163. package/ccw/dist/core/routes/auth-routes.js.map +1 -0
  164. package/ccw/dist/core/routes/ccw-routes.d.ts +1 -14
  165. package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
  166. package/ccw/dist/core/routes/ccw-routes.js +9 -4
  167. package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
  168. package/ccw/dist/core/routes/claude-routes.d.ts +1 -14
  169. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  170. package/ccw/dist/core/routes/claude-routes.js +98 -39
  171. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  172. package/ccw/dist/core/routes/cli-routes.d.ts +14 -12
  173. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  174. package/ccw/dist/core/routes/cli-routes.js +122 -43
  175. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  176. package/ccw/dist/core/routes/cli-settings-routes.d.ts +11 -0
  177. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -0
  178. package/ccw/dist/core/routes/cli-settings-routes.js +204 -0
  179. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -0
  180. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts +6 -0
  181. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -0
  182. package/ccw/dist/core/routes/codexlens/config-handlers.js +1195 -0
  183. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -0
  184. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts +10 -0
  185. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -0
  186. package/ccw/dist/core/routes/codexlens/index-handlers.js +322 -0
  187. package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -0
  188. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts +6 -0
  189. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -0
  190. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +865 -0
  191. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -0
  192. package/ccw/dist/core/routes/codexlens/utils.d.ts +23 -0
  193. package/ccw/dist/core/routes/codexlens/utils.d.ts.map +1 -0
  194. package/ccw/dist/core/routes/codexlens/utils.js +85 -0
  195. package/ccw/dist/core/routes/codexlens/utils.js.map +1 -0
  196. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts +13 -0
  197. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts.map +1 -0
  198. package/ccw/dist/core/routes/codexlens/watcher-handlers.js +235 -0
  199. package/ccw/dist/core/routes/codexlens/watcher-handlers.js.map +1 -0
  200. package/ccw/dist/core/routes/codexlens-routes.d.ts +2 -11
  201. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  202. package/ccw/dist/core/routes/codexlens-routes.js +10 -981
  203. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  204. package/ccw/dist/core/routes/discovery-routes.d.ts +1 -35
  205. package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -1
  206. package/ccw/dist/core/routes/discovery-routes.js +25 -0
  207. package/ccw/dist/core/routes/discovery-routes.js.map +1 -1
  208. package/ccw/dist/core/routes/files-routes.d.ts +1 -14
  209. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  210. package/ccw/dist/core/routes/files-routes.js +57 -14
  211. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  212. package/ccw/dist/core/routes/graph-routes.d.ts +1 -14
  213. package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
  214. package/ccw/dist/core/routes/graph-routes.js +36 -37
  215. package/ccw/dist/core/routes/graph-routes.js.map +1 -1
  216. package/ccw/dist/core/routes/help-routes.d.ts +1 -14
  217. package/ccw/dist/core/routes/help-routes.d.ts.map +1 -1
  218. package/ccw/dist/core/routes/help-routes.js +5 -0
  219. package/ccw/dist/core/routes/help-routes.js.map +1 -1
  220. package/ccw/dist/core/routes/hooks-routes.d.ts +4 -14
  221. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  222. package/ccw/dist/core/routes/hooks-routes.js +43 -21
  223. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  224. package/ccw/dist/core/routes/issue-routes.d.ts +1 -34
  225. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
  226. package/ccw/dist/core/routes/issue-routes.js +24 -0
  227. package/ccw/dist/core/routes/issue-routes.js.map +1 -1
  228. package/ccw/dist/core/routes/litellm-api-routes.d.ts +1 -14
  229. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
  230. package/ccw/dist/core/routes/litellm-api-routes.js +505 -48
  231. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
  232. package/ccw/dist/core/routes/litellm-routes.d.ts +1 -14
  233. package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -1
  234. package/ccw/dist/core/routes/litellm-routes.js +28 -11
  235. package/ccw/dist/core/routes/litellm-routes.js.map +1 -1
  236. package/ccw/dist/core/routes/mcp-routes.d.ts +1 -14
  237. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
  238. package/ccw/dist/core/routes/mcp-routes.js +99 -30
  239. package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
  240. package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
  241. package/ccw/dist/core/routes/mcp-templates-db.js +30 -31
  242. package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
  243. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  244. package/ccw/dist/core/routes/memory-routes.js +74 -24
  245. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  246. package/ccw/dist/core/routes/nav-status-routes.d.ts +3 -0
  247. package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -0
  248. package/ccw/dist/core/routes/nav-status-routes.js +217 -0
  249. package/ccw/dist/core/routes/nav-status-routes.js.map +1 -0
  250. package/ccw/dist/core/routes/rules-routes.d.ts +1 -14
  251. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
  252. package/ccw/dist/core/routes/rules-routes.js +481 -58
  253. package/ccw/dist/core/routes/rules-routes.js.map +1 -1
  254. package/ccw/dist/core/routes/session-routes.d.ts +1 -14
  255. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
  256. package/ccw/dist/core/routes/session-routes.js +15 -3
  257. package/ccw/dist/core/routes/session-routes.js.map +1 -1
  258. package/ccw/dist/core/routes/skills-routes.d.ts +1 -14
  259. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  260. package/ccw/dist/core/routes/skills-routes.js +394 -112
  261. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  262. package/ccw/dist/core/routes/status-routes.d.ts +1 -14
  263. package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
  264. package/ccw/dist/core/routes/status-routes.js +4 -0
  265. package/ccw/dist/core/routes/status-routes.js.map +1 -1
  266. package/ccw/dist/core/routes/system-routes.d.ts +4 -10
  267. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  268. package/ccw/dist/core/routes/system-routes.js +6 -4
  269. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  270. package/ccw/dist/core/routes/types.d.ts +19 -0
  271. package/ccw/dist/core/routes/types.d.ts.map +1 -0
  272. package/ccw/dist/core/routes/types.js +2 -0
  273. package/ccw/dist/core/routes/types.js.map +1 -0
  274. package/ccw/dist/core/server.d.ts.map +1 -1
  275. package/ccw/dist/core/server.js +201 -29
  276. package/ccw/dist/core/server.js.map +1 -1
  277. package/ccw/dist/core/services/api-key-tester.d.ts +31 -0
  278. package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
  279. package/ccw/dist/core/services/api-key-tester.js +106 -0
  280. package/ccw/dist/core/services/api-key-tester.js.map +1 -0
  281. package/ccw/dist/core/services/health-check-service.d.ts +82 -0
  282. package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
  283. package/ccw/dist/core/services/health-check-service.js +271 -0
  284. package/ccw/dist/core/services/health-check-service.js.map +1 -0
  285. package/ccw/dist/core/websocket.d.ts +9 -7
  286. package/ccw/dist/core/websocket.d.ts.map +1 -1
  287. package/ccw/dist/core/websocket.js +9 -4
  288. package/ccw/dist/core/websocket.js.map +1 -1
  289. package/ccw/dist/tools/claude-cli-tools.d.ts +152 -28
  290. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  291. package/ccw/dist/tools/claude-cli-tools.js +490 -100
  292. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  293. package/ccw/dist/tools/cli-config-manager.d.ts +24 -8
  294. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
  295. package/ccw/dist/tools/cli-config-manager.js +76 -156
  296. package/ccw/dist/tools/cli-config-manager.js.map +1 -1
  297. package/ccw/dist/tools/cli-executor-core.d.ts +85 -0
  298. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -0
  299. package/ccw/dist/tools/cli-executor-core.js +1310 -0
  300. package/ccw/dist/tools/cli-executor-core.js.map +1 -0
  301. package/ccw/dist/tools/cli-executor-state.d.ts +241 -0
  302. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -0
  303. package/ccw/dist/tools/cli-executor-state.js +392 -0
  304. package/ccw/dist/tools/cli-executor-state.js.map +1 -0
  305. package/ccw/dist/tools/cli-executor-utils.d.ts +36 -0
  306. package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -0
  307. package/ccw/dist/tools/cli-executor-utils.js +298 -0
  308. package/ccw/dist/tools/cli-executor-utils.js.map +1 -0
  309. package/ccw/dist/tools/cli-executor.d.ts +3 -377
  310. package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
  311. package/ccw/dist/tools/cli-executor.js +3 -1884
  312. package/ccw/dist/tools/cli-executor.js.map +1 -1
  313. package/ccw/dist/tools/cli-history-store.d.ts +2 -0
  314. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  315. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  316. package/ccw/dist/tools/cli-output-converter.d.ts +192 -0
  317. package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -0
  318. package/ccw/dist/tools/cli-output-converter.js +1047 -0
  319. package/ccw/dist/tools/cli-output-converter.js.map +1 -0
  320. package/ccw/dist/tools/cli-prompt-builder.d.ts +113 -0
  321. package/ccw/dist/tools/cli-prompt-builder.d.ts.map +1 -0
  322. package/ccw/dist/tools/cli-prompt-builder.js +363 -0
  323. package/ccw/dist/tools/cli-prompt-builder.js.map +1 -0
  324. package/ccw/dist/tools/codex-lens.d.ts +15 -1
  325. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  326. package/ccw/dist/tools/codex-lens.js +289 -55
  327. package/ccw/dist/tools/codex-lens.js.map +1 -1
  328. package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -1
  329. package/ccw/dist/tools/detect-changed-modules.js +22 -4
  330. package/ccw/dist/tools/detect-changed-modules.js.map +1 -1
  331. package/ccw/dist/tools/index.d.ts.map +1 -1
  332. package/ccw/dist/tools/index.js +2 -0
  333. package/ccw/dist/tools/index.js.map +1 -1
  334. package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
  335. package/ccw/dist/tools/litellm-client.js +10 -4
  336. package/ccw/dist/tools/litellm-client.js.map +1 -1
  337. package/ccw/dist/tools/litellm-executor.d.ts +2 -4
  338. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
  339. package/ccw/dist/tools/litellm-executor.js +39 -8
  340. package/ccw/dist/tools/litellm-executor.js.map +1 -1
  341. package/ccw/dist/tools/native-session-discovery.d.ts +2 -0
  342. package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
  343. package/ccw/dist/tools/native-session-discovery.js +197 -1
  344. package/ccw/dist/tools/native-session-discovery.js.map +1 -1
  345. package/ccw/dist/tools/session-manager.d.ts.map +1 -1
  346. package/ccw/dist/tools/session-manager.js +79 -0
  347. package/ccw/dist/tools/session-manager.js.map +1 -1
  348. package/ccw/dist/tools/skill-context-loader.d.ts +15 -0
  349. package/ccw/dist/tools/skill-context-loader.d.ts.map +1 -0
  350. package/ccw/dist/tools/skill-context-loader.js +198 -0
  351. package/ccw/dist/tools/skill-context-loader.js.map +1 -0
  352. package/ccw/dist/tools/smart-search.d.ts +8 -3
  353. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  354. package/ccw/dist/tools/smart-search.js +378 -75
  355. package/ccw/dist/tools/smart-search.js.map +1 -1
  356. package/ccw/dist/types/cli-settings.d.ts +86 -0
  357. package/ccw/dist/types/cli-settings.d.ts.map +1 -0
  358. package/ccw/dist/types/cli-settings.js +54 -0
  359. package/ccw/dist/types/cli-settings.js.map +1 -0
  360. package/ccw/dist/types/litellm-api-config.d.ts +40 -1
  361. package/ccw/dist/types/litellm-api-config.d.ts.map +1 -1
  362. package/ccw/dist/utils/exec-constants.d.ts +25 -0
  363. package/ccw/dist/utils/exec-constants.d.ts.map +1 -0
  364. package/ccw/dist/utils/exec-constants.js +25 -0
  365. package/ccw/dist/utils/exec-constants.js.map +1 -0
  366. package/ccw/dist/utils/path-resolver.d.ts +1 -0
  367. package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
  368. package/ccw/dist/utils/path-resolver.js +48 -3
  369. package/ccw/dist/utils/path-resolver.js.map +1 -1
  370. package/ccw/dist/utils/path-validator.d.ts.map +1 -1
  371. package/ccw/dist/utils/path-validator.js +25 -6
  372. package/ccw/dist/utils/path-validator.js.map +1 -1
  373. package/ccw/dist/utils/python-utils.d.ts.map +1 -1
  374. package/ccw/dist/utils/python-utils.js +27 -7
  375. package/ccw/dist/utils/python-utils.js.map +1 -1
  376. package/ccw/dist/utils/shell-escape.d.ts +8 -0
  377. package/ccw/dist/utils/shell-escape.d.ts.map +1 -0
  378. package/ccw/dist/utils/shell-escape.js +24 -0
  379. package/ccw/dist/utils/shell-escape.js.map +1 -0
  380. package/ccw/dist/utils/uv-manager.d.ts +167 -0
  381. package/ccw/dist/utils/uv-manager.d.ts.map +1 -0
  382. package/ccw/dist/utils/uv-manager.js +644 -0
  383. package/ccw/dist/utils/uv-manager.js.map +1 -0
  384. package/ccw/src/cli.ts +4 -1
  385. package/ccw/src/commands/cli.ts +132 -34
  386. package/ccw/src/commands/issue.ts +605 -91
  387. package/ccw/src/commands/serve.ts +15 -5
  388. package/ccw/src/commands/stop.ts +32 -5
  389. package/ccw/src/commands/tool.ts +17 -2
  390. package/ccw/src/commands/view.ts +13 -3
  391. package/ccw/src/config/cli-settings-manager.ts +460 -0
  392. package/ccw/src/config/litellm-api-config-manager.ts +392 -57
  393. package/ccw/src/core/auth/csrf-manager.ts +104 -0
  394. package/ccw/src/core/auth/csrf-middleware.ts +159 -0
  395. package/ccw/src/core/auth/middleware.ts +94 -0
  396. package/ccw/src/core/auth/token-manager.ts +219 -0
  397. package/ccw/src/core/cache-manager.ts +64 -52
  398. package/ccw/src/core/claude-freshness.ts +26 -6
  399. package/ccw/src/core/core-memory-store.ts +2 -1
  400. package/ccw/src/core/cors.ts +10 -0
  401. package/ccw/src/core/dashboard-generator-patch.ts +47 -48
  402. package/ccw/src/core/dashboard-generator.ts +797 -744
  403. package/ccw/src/core/data-aggregator.ts +667 -667
  404. package/ccw/src/core/lite-scanner.ts +156 -140
  405. package/ccw/src/core/routes/auth-routes.ts +98 -0
  406. package/ccw/src/core/routes/ccw-routes.ts +10 -20
  407. package/ccw/src/core/routes/claude-routes.ts +101 -51
  408. package/ccw/src/core/routes/cli-routes.ts +152 -55
  409. package/ccw/src/core/routes/cli-settings-routes.ts +232 -0
  410. package/ccw/src/core/routes/codexlens/README.md +37 -0
  411. package/ccw/src/core/routes/codexlens/config-handlers.ts +1269 -0
  412. package/ccw/src/core/routes/codexlens/index-handlers.ts +354 -0
  413. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +931 -0
  414. package/ccw/src/core/routes/codexlens/utils.ts +96 -0
  415. package/ccw/src/core/routes/codexlens/watcher-handlers.ts +265 -0
  416. package/ccw/src/core/routes/codexlens-routes.ts +11 -1044
  417. package/ccw/src/core/routes/discovery-routes.ts +1 -12
  418. package/ccw/src/core/routes/files-routes.ts +112 -40
  419. package/ccw/src/core/routes/graph-routes.ts +39 -46
  420. package/ccw/src/core/routes/help-routes.ts +2 -12
  421. package/ccw/src/core/routes/hooks-routes.ts +83 -44
  422. package/ccw/src/core/routes/issue-routes.ts +1 -12
  423. package/ccw/src/core/routes/litellm-api-routes.ts +566 -60
  424. package/ccw/src/core/routes/litellm-routes.ts +35 -27
  425. package/ccw/src/core/routes/mcp-routes.ts +157 -60
  426. package/ccw/src/core/routes/mcp-routes.ts.backup +549 -550
  427. package/ccw/src/core/routes/mcp-templates-db.ts +267 -268
  428. package/ccw/src/core/routes/memory-routes.ts +76 -22
  429. package/ccw/src/core/routes/nav-status-routes.ts +231 -0
  430. package/ccw/src/core/routes/rules-routes.ts +600 -81
  431. package/ccw/src/core/routes/session-routes.ts +28 -22
  432. package/ccw/src/core/routes/skills-routes.ts +452 -132
  433. package/ccw/src/core/routes/status-routes.ts +1 -12
  434. package/ccw/src/core/routes/system-routes.ts +15 -22
  435. package/ccw/src/core/routes/types.ts +25 -0
  436. package/ccw/src/core/server.ts +651 -468
  437. package/ccw/src/core/services/api-key-tester.ts +137 -0
  438. package/ccw/src/core/services/health-check-service.ts +340 -0
  439. package/ccw/src/core/websocket.ts +20 -12
  440. package/ccw/src/templates/dashboard-css/01-base.css +109 -0
  441. package/ccw/src/templates/dashboard-css/10-cli-status.css +202 -0
  442. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +308 -0
  443. package/ccw/src/templates/dashboard-css/30-core-memory.css +20 -0
  444. package/ccw/src/templates/dashboard-css/31-api-settings.css +751 -14
  445. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +230 -2
  446. package/ccw/src/templates/dashboard-js/api.js +5 -0
  447. package/ccw/src/templates/dashboard-js/components/cli-status.js +279 -107
  448. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +262 -20
  449. package/ccw/src/templates/dashboard-js/components/hook-manager.js +105 -5
  450. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +317 -0
  451. package/ccw/src/templates/dashboard-js/components/navigation.js +45 -0
  452. package/ccw/src/templates/dashboard-js/components/notifications.js +128 -0
  453. package/ccw/src/templates/dashboard-js/i18n.js +4438 -3983
  454. package/ccw/src/templates/dashboard-js/main.js +71 -0
  455. package/ccw/src/templates/dashboard-js/services.js +289 -0
  456. package/ccw/src/templates/dashboard-js/views/api-settings.js +5613 -3361
  457. package/ccw/src/templates/dashboard-js/views/claude-manager.js +1 -7
  458. package/ccw/src/templates/dashboard-js/views/cli-manager.js +581 -87
  459. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +6091 -1965
  460. package/ccw/src/templates/dashboard-js/views/core-memory.js +129 -20
  461. package/ccw/src/templates/dashboard-js/views/hook-manager.js +17 -3
  462. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +63 -0
  463. package/ccw/src/templates/dashboard-js/views/project-overview.js +182 -37
  464. package/ccw/src/templates/dashboard-js/views/rules-manager.js +26 -3
  465. package/ccw/src/templates/dashboard-js/views/skills-manager.js +2 -42
  466. package/ccw/src/templates/dashboard.html +6 -0
  467. package/ccw/src/tools/README.md +29 -0
  468. package/ccw/src/tools/claude-cli-tools.ts +640 -125
  469. package/ccw/src/tools/cli-config-manager.ts +102 -172
  470. package/ccw/src/tools/cli-executor-core.ts +1533 -0
  471. package/ccw/src/tools/cli-executor-state.ts +560 -0
  472. package/ccw/src/tools/cli-executor-utils.ts +349 -0
  473. package/ccw/src/tools/cli-executor.ts +3 -2309
  474. package/ccw/src/tools/cli-history-store.ts +2 -0
  475. package/ccw/src/tools/cli-output-converter.ts +1237 -0
  476. package/ccw/src/tools/cli-prompt-builder.ts +487 -0
  477. package/ccw/src/tools/codex-lens.ts +324 -59
  478. package/ccw/src/tools/detect-changed-modules.ts +24 -6
  479. package/ccw/src/tools/index.ts +2 -0
  480. package/ccw/src/tools/litellm-client.ts +10 -4
  481. package/ccw/src/tools/litellm-executor.ts +146 -114
  482. package/ccw/src/tools/native-session-discovery.ts +209 -1
  483. package/ccw/src/tools/session-manager.ts +88 -0
  484. package/ccw/src/tools/skill-context-loader.ts +213 -0
  485. package/ccw/src/tools/smart-search.ts +427 -76
  486. package/ccw/src/types/cli-settings.ts +137 -0
  487. package/ccw/src/types/litellm-api-config.ts +55 -1
  488. package/ccw/src/utils/exec-constants.ts +24 -0
  489. package/ccw/src/utils/path-resolver.ts +49 -3
  490. package/ccw/src/utils/path-validator.ts +28 -6
  491. package/ccw/src/utils/python-utils.ts +140 -121
  492. package/ccw/src/utils/shell-escape.ts +30 -0
  493. package/ccw/src/utils/uv-manager.ts +796 -0
  494. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
  495. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
  496. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
  497. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
  498. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  499. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  500. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  501. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
  502. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
  503. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
  504. package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +270 -251
  505. package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +33 -0
  506. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
  507. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
  508. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
  509. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
  510. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
  511. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
  512. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
  513. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
  514. package/ccw-litellm/src/ccw_litellm/config/loader.py +343 -316
  515. package/ccw-litellm/src/ccw_litellm/config/models.py +162 -130
  516. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
  517. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
  518. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
  519. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
  520. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
  521. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
  522. package/codex-lens/pyproject.toml +43 -0
  523. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
  524. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
  525. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
  526. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
  527. package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
  528. package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
  529. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  530. package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
  531. package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
  532. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  533. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
  534. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
  535. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
  536. package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
  537. package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
  538. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
  539. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  540. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
  541. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.pyc +0 -0
  542. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  543. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-310.pyc +0 -0
  544. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.pyc +0 -0
  545. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  546. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-310.pyc +0 -0
  547. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.pyc +0 -0
  548. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  549. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-310.pyc +0 -0
  550. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
  551. package/codex-lens/src/codexlens/cli/commands.py +4416 -2295
  552. package/codex-lens/src/codexlens/cli/embedding_manager.py +767 -14
  553. package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
  554. package/codex-lens/src/codexlens/config.py +321 -12
  555. package/codex-lens/src/codexlens/entities.py +4 -1
  556. package/codex-lens/src/codexlens/env_config.py +298 -0
  557. package/codex-lens/src/codexlens/indexing/__init__.py +23 -1
  558. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  559. package/codex-lens/src/codexlens/indexing/__pycache__/embedding.cpython-313.pyc +0 -0
  560. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  561. package/codex-lens/src/codexlens/indexing/embedding.py +582 -0
  562. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +62 -28
  563. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
  564. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
  565. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
  566. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.pyc +0 -0
  567. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  568. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-310.pyc +0 -0
  569. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
  570. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
  571. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
  572. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  573. package/codex-lens/src/codexlens/parsers/factory.py +139 -10
  574. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +487 -13
  575. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
  576. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
  577. package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
  578. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
  579. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.pyc +0 -0
  580. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  581. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  582. package/codex-lens/src/codexlens/search/__pycache__/graph_expander.cpython-313.pyc +0 -0
  583. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
  584. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
  585. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  586. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
  587. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
  588. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  589. package/codex-lens/src/codexlens/search/binary_searcher.py +277 -0
  590. package/codex-lens/src/codexlens/search/chain_search.py +1642 -8
  591. package/codex-lens/src/codexlens/search/enrichment.py +21 -0
  592. package/codex-lens/src/codexlens/search/graph_expander.py +264 -0
  593. package/codex-lens/src/codexlens/search/hybrid_search.py +772 -37
  594. package/codex-lens/src/codexlens/search/ranking.py +347 -8
  595. package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +225 -0
  596. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
  597. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
  598. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
  599. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
  600. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  601. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
  602. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
  603. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
  604. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
  605. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
  606. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
  607. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
  608. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
  609. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
  610. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
  611. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
  612. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  613. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  614. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  615. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  616. package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
  617. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
  618. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
  619. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
  620. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
  621. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.pyc +0 -0
  622. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  623. package/codex-lens/src/codexlens/semantic/ann_index.py +654 -0
  624. package/codex-lens/src/codexlens/semantic/factory.py +63 -3
  625. package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
  626. package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
  627. package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
  628. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
  629. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
  630. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
  631. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
  632. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
  633. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
  634. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
  635. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
  636. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
  637. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
  638. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
  639. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
  640. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
  641. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
  642. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
  643. package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
  644. package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
  645. package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
  646. package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
  647. package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
  648. package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
  649. package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
  650. package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
  651. package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
  652. package/codex-lens/src/codexlens/storage/__init__.py +3 -0
  653. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
  654. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
  655. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  656. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
  657. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
  658. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  659. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
  660. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
  661. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
  662. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
  663. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  664. package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
  665. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
  666. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
  667. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
  668. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
  669. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
  670. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
  671. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
  672. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
  673. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.pyc +0 -0
  674. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  675. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-310.pyc +0 -0
  676. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
  677. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
  678. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
  679. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
  680. package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
  681. package/codex-lens/src/codexlens/storage/index_tree.py +194 -23
  682. package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
  683. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
  684. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
  685. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
  686. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
  687. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
  688. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
  689. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
  690. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
  691. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
  692. package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
  693. package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
  694. package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
  695. package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
  696. package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
  697. package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
  698. package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
  699. package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
  700. package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
  701. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
  702. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
  703. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
  704. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
  705. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
  706. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
  707. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
  708. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
  709. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
  710. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
  711. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
  712. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
  713. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
  714. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
  715. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
  716. package/codex-lens/src/codexlens/watcher/events.py +82 -0
  717. package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
  718. package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
  719. package/codex-lens/src/codexlens/watcher/manager.py +255 -0
  720. package/package.json +4 -1
  721. package/.claude/commands/workflow/docs/analyze.md +0 -1467
  722. package/.claude/commands/workflow/docs/copyright.md +0 -1265
  723. package/.claude/skills/command-guide/SKILL.md +0 -388
  724. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
  725. package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
  726. package/.claude/skills/command-guide/guides/examples.md +0 -537
  727. package/.claude/skills/command-guide/guides/getting-started.md +0 -242
  728. package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
  729. package/.claude/skills/command-guide/guides/index-structure.md +0 -326
  730. package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
  731. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
  732. package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
  733. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
  734. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
  735. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
  736. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
  737. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
  738. package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
  739. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
  740. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
  741. package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
  742. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
  743. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
  744. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
  745. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
  746. package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
  747. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
  748. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
  749. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
  750. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
  751. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
  752. package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
  753. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
  754. package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
  755. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
  756. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
  757. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
  758. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
  759. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
  760. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
  761. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
  762. package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
  763. package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
  764. package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
  765. package/.claude/skills/command-guide/reference/commands/version.md +0 -254
  766. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
  767. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
  768. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
  769. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
  770. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
  771. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
  772. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
  773. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
  774. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  775. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
  776. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
  777. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
  778. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
  779. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
  780. package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
  781. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
  782. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
  783. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
  784. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
  785. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
  786. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
  787. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
  788. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
  789. package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
  790. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
  791. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
  792. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
  793. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
  794. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
  795. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
  796. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
  797. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
  798. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
  799. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
  800. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
  801. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
  802. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
  803. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  804. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
  805. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
  806. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
  807. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
  808. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
  809. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
  810. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
  811. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
  812. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
  813. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
  814. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
  815. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
  816. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
  817. package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
  818. package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
  819. package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
  820. package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
  821. package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
  822. package/.claude/skills/command-guide/templates/issue-question.md +0 -141
@@ -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
+ }