claude-code-workflow 6.3.53 → 7.0.0

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 (1908) hide show
  1. package/.claude/agents/action-planning-agent.md +358 -188
  2. package/.claude/agents/cli-execution-agent.md +13 -12
  3. package/.claude/agents/cli-explore-agent.md +66 -11
  4. package/.claude/agents/cli-lite-planning-agent.md +908 -892
  5. package/.claude/agents/cli-roadmap-plan-agent.md +1001 -0
  6. package/.claude/agents/code-developer.md +75 -85
  7. package/.claude/agents/conceptual-planning-agent.md +49 -19
  8. package/.claude/agents/context-search-agent.md +96 -19
  9. package/.claude/agents/debug-explore-agent.md +439 -436
  10. package/.claude/agents/issue-plan-agent.md +15 -11
  11. package/.claude/agents/memory-bridge.md +2 -2
  12. package/.claude/agents/tdd-developer.md +84 -107
  13. package/.claude/agents/team-worker.md +440 -0
  14. package/.claude/agents/test-action-planning-agent.md +684 -0
  15. package/.claude/agents/test-fix-agent.md +24 -12
  16. package/.claude/agents/ui-design-agent.md +3 -3
  17. package/.claude/agents/universal-executor.md +1 -1
  18. package/.claude/commands/ccw-coordinator.md +316 -62
  19. package/.claude/commands/ccw.md +502 -172
  20. package/.claude/commands/cli/cli-init.md +441 -441
  21. package/.claude/commands/flow-create.md +666 -0
  22. package/.claude/commands/issue/convert-to-plan.md +21 -19
  23. package/.claude/commands/issue/discover-by-prompt.md +2 -2
  24. package/.claude/commands/issue/discover.md +4 -4
  25. package/.claude/commands/issue/execute.md +43 -15
  26. package/.claude/commands/issue/from-brainstorm.md +5 -5
  27. package/.claude/commands/issue/plan.md +335 -335
  28. package/.claude/commands/issue/queue.md +1 -1
  29. package/.claude/commands/memory/prepare.md +240 -0
  30. package/.claude/commands/memory/style-skill-memory.md +2 -2
  31. package/.claude/commands/workflow/analyze-with-file.md +639 -667
  32. package/.claude/commands/workflow/brainstorm-with-file.md +779 -1153
  33. package/.claude/commands/workflow/clean.md +572 -548
  34. package/.claude/commands/workflow/collaborative-plan-with-file.md +635 -761
  35. package/.claude/commands/workflow/debug-with-file.md +648 -672
  36. package/.claude/commands/workflow/init-guidelines.md +447 -0
  37. package/.claude/commands/workflow/init-specs.md +380 -0
  38. package/.claude/commands/workflow/init.md +291 -224
  39. package/.claude/commands/workflow/integration-test-cycle.md +932 -0
  40. package/.claude/commands/workflow/refactor-cycle.md +852 -0
  41. package/.claude/commands/workflow/roadmap-with-file.md +544 -0
  42. package/.claude/commands/workflow/session/complete.md +139 -203
  43. package/.claude/commands/workflow/session/solidify.md +453 -303
  44. package/.claude/commands/workflow/session/start.md +202 -202
  45. package/.claude/commands/workflow/session/sync.md +201 -0
  46. package/.claude/commands/workflow/ui-design/codify-style.md +20 -20
  47. package/.claude/commands/workflow/ui-design/design-sync.md +7 -7
  48. package/.claude/commands/workflow/ui-design/explore-auto.md +16 -16
  49. package/.claude/commands/workflow/ui-design/generate.md +1 -1
  50. package/.claude/commands/workflow/ui-design/imitate-auto.md +19 -19
  51. package/.claude/commands/workflow/ui-design/import-from-code.md +540 -540
  52. package/.claude/commands/workflow/unified-execute-with-file.md +864 -904
  53. package/.claude/scripts/cleanup-ghost-commands.mjs +402 -0
  54. package/.claude/skills/_shared/COMMAND-TO-SKILL-CONVERSION.md +741 -0
  55. package/.claude/skills/brainstorm/SKILL.md +382 -0
  56. package/.claude/skills/brainstorm/phases/01-mode-routing.md +207 -0
  57. package/.claude/skills/brainstorm/phases/02-artifacts.md +457 -0
  58. package/.claude/skills/brainstorm/phases/03-role-analysis.md +718 -0
  59. package/.claude/skills/brainstorm/phases/04-synthesis.md +817 -0
  60. package/.claude/skills/ccw-help/SKILL.md +176 -176
  61. package/.claude/skills/ccw-help/index/all-commands.json +376 -805
  62. package/.claude/skills/ccw-help/index/by-category.json +400 -833
  63. package/.claude/skills/ccw-help/index/by-use-case.json +388 -819
  64. package/.claude/skills/ccw-help/index/command-relationships.json +15 -160
  65. package/.claude/skills/ccw-help/index/essential-commands.json +13 -90
  66. package/.claude/skills/command-generator/SKILL.md +190 -0
  67. package/.claude/skills/command-generator/phases/01-parameter-validation.md +174 -0
  68. package/.claude/skills/command-generator/phases/02-target-path-resolution.md +171 -0
  69. package/.claude/skills/command-generator/phases/03-template-loading.md +123 -0
  70. package/.claude/skills/command-generator/phases/04-content-formatting.md +184 -0
  71. package/.claude/skills/command-generator/phases/05-file-generation.md +185 -0
  72. package/.claude/skills/command-generator/specs/command-design-spec.md +160 -0
  73. package/.claude/skills/command-generator/templates/command-md.md +75 -0
  74. package/.claude/skills/issue-manage/SKILL.md +291 -285
  75. package/.claude/skills/memory-capture/SKILL.md +129 -0
  76. package/.claude/skills/memory-capture/phases/01-compact.md +254 -0
  77. package/.claude/skills/memory-capture/phases/02-tips.md +206 -0
  78. package/.claude/skills/memory-manage/SKILL.md +229 -0
  79. package/.claude/skills/memory-manage/phases/01-update-full.md +316 -0
  80. package/.claude/skills/memory-manage/phases/02-update-related.md +267 -0
  81. package/.claude/skills/memory-manage/phases/03-update-single.md +306 -0
  82. package/.claude/skills/memory-manage/phases/04-docs-full.md +435 -0
  83. package/.claude/skills/memory-manage/phases/05-docs-related.md +315 -0
  84. package/.claude/skills/review-cycle/SKILL.md +128 -0
  85. package/.claude/skills/review-cycle/phases/review-fix.md +760 -0
  86. package/.claude/skills/review-cycle/phases/review-module.md +764 -0
  87. package/.claude/skills/review-cycle/phases/review-session.md +775 -0
  88. package/.claude/skills/skill-generator/templates/llm-action.md +3 -3
  89. package/.claude/skills/spec-generator/README.md +81 -0
  90. package/.claude/skills/spec-generator/SKILL.md +290 -0
  91. package/.claude/skills/spec-generator/phases/01-5-requirement-clarification.md +404 -0
  92. package/.claude/skills/spec-generator/phases/01-discovery.md +242 -0
  93. package/.claude/skills/spec-generator/phases/02-product-brief.md +247 -0
  94. package/.claude/skills/spec-generator/phases/03-requirements.md +179 -0
  95. package/.claude/skills/spec-generator/phases/04-architecture.md +213 -0
  96. package/.claude/skills/spec-generator/phases/05-epics-stories.md +168 -0
  97. package/.claude/skills/spec-generator/phases/06-readiness-check.md +449 -0
  98. package/.claude/skills/spec-generator/specs/document-standards.md +248 -0
  99. package/.claude/skills/spec-generator/specs/quality-gates.md +219 -0
  100. package/.claude/skills/spec-generator/templates/architecture-doc.md +254 -0
  101. package/.claude/skills/spec-generator/templates/epics-template.md +196 -0
  102. package/.claude/skills/spec-generator/templates/product-brief.md +133 -0
  103. package/.claude/skills/spec-generator/templates/requirements-prd.md +224 -0
  104. package/.claude/skills/team-brainstorm/SKILL.md +407 -0
  105. package/.claude/skills/team-brainstorm/roles/challenger.md +167 -0
  106. package/.claude/skills/team-brainstorm/roles/coordinator.md +257 -0
  107. package/.claude/skills/team-brainstorm/roles/evaluator.md +157 -0
  108. package/.claude/skills/team-brainstorm/roles/ideator.md +160 -0
  109. package/.claude/skills/team-brainstorm/roles/synthesizer.md +168 -0
  110. package/.claude/skills/team-brainstorm/specs/team-config.json +86 -0
  111. package/.claude/skills/team-coordinate/SKILL.md +445 -0
  112. package/.claude/skills/team-coordinate/roles/coordinator/commands/analyze-task.md +197 -0
  113. package/.claude/skills/team-coordinate/roles/coordinator/commands/dispatch.md +85 -0
  114. package/.claude/skills/team-coordinate/roles/coordinator/commands/monitor.md +296 -0
  115. package/.claude/skills/team-coordinate/roles/coordinator/role.md +283 -0
  116. package/.claude/skills/team-coordinate/specs/role-template.md +434 -0
  117. package/.claude/skills/team-coordinate/subagents/discuss-subagent.md +133 -0
  118. package/.claude/skills/team-coordinate/subagents/explore-subagent.md +120 -0
  119. package/.claude/skills/team-coordinate-v2/SKILL.md +265 -0
  120. package/.claude/skills/team-coordinate-v2/roles/coordinator/commands/analyze-task.md +185 -0
  121. package/.claude/skills/team-coordinate-v2/roles/coordinator/commands/dispatch.md +87 -0
  122. package/.claude/skills/team-coordinate-v2/roles/coordinator/commands/monitor.md +301 -0
  123. package/.claude/skills/team-coordinate-v2/roles/coordinator/role.md +297 -0
  124. package/.claude/skills/team-coordinate-v2/specs/role-spec-template.md +295 -0
  125. package/.claude/skills/team-coordinate-v2/subagents/discuss-subagent.md +133 -0
  126. package/.claude/skills/team-coordinate-v2/subagents/explore-subagent.md +120 -0
  127. package/.claude/skills/team-executor/SKILL.md +372 -0
  128. package/.claude/skills/team-executor/roles/executor/commands/monitor.md +277 -0
  129. package/.claude/skills/team-executor/roles/executor/role.md +202 -0
  130. package/.claude/skills/team-executor/specs/session-schema.md +272 -0
  131. package/.claude/skills/team-executor-v2/SKILL.md +215 -0
  132. package/.claude/skills/team-executor-v2/roles/executor/commands/monitor.md +239 -0
  133. package/.claude/skills/team-executor-v2/roles/executor/role.md +171 -0
  134. package/.claude/skills/team-executor-v2/specs/session-schema.md +264 -0
  135. package/.claude/skills/team-frontend/SKILL.md +426 -0
  136. package/.claude/skills/team-frontend/roles/analyst/commands/design-intelligence.md +150 -0
  137. package/.claude/skills/team-frontend/roles/analyst/role.md +225 -0
  138. package/.claude/skills/team-frontend/roles/architect/role.md +219 -0
  139. package/.claude/skills/team-frontend/roles/coordinator/role.md +257 -0
  140. package/.claude/skills/team-frontend/roles/developer/role.md +238 -0
  141. package/.claude/skills/team-frontend/roles/qa/commands/pre-delivery-checklist.md +116 -0
  142. package/.claude/skills/team-frontend/roles/qa/role.md +257 -0
  143. package/.claude/skills/team-frontend/specs/team-config.json +84 -0
  144. package/.claude/skills/team-issue/SKILL.md +425 -0
  145. package/.claude/skills/team-issue/roles/coordinator.md +340 -0
  146. package/.claude/skills/team-issue/roles/explorer.md +212 -0
  147. package/.claude/skills/team-issue/roles/implementer.md +322 -0
  148. package/.claude/skills/team-issue/roles/integrator.md +241 -0
  149. package/.claude/skills/team-issue/roles/planner.md +207 -0
  150. package/.claude/skills/team-issue/roles/reviewer.md +268 -0
  151. package/.claude/skills/team-issue/specs/team-config.json +70 -0
  152. package/.claude/skills/team-iterdev/SKILL.md +493 -0
  153. package/.claude/skills/team-iterdev/roles/architect.md +265 -0
  154. package/.claude/skills/team-iterdev/roles/coordinator.md +423 -0
  155. package/.claude/skills/team-iterdev/roles/developer.md +280 -0
  156. package/.claude/skills/team-iterdev/roles/reviewer.md +307 -0
  157. package/.claude/skills/team-iterdev/roles/tester.md +253 -0
  158. package/.claude/skills/team-iterdev/specs/team-config.json +172 -0
  159. package/.claude/skills/team-lifecycle-v3/SKILL.md +384 -0
  160. package/.claude/skills/team-lifecycle-v3/roles/analyst/role.md +113 -0
  161. package/.claude/skills/team-lifecycle-v3/roles/architect/commands/assess.md +193 -0
  162. package/.claude/skills/team-lifecycle-v3/roles/architect/role.md +103 -0
  163. package/.claude/skills/team-lifecycle-v3/roles/coordinator/commands/dispatch.md +142 -0
  164. package/.claude/skills/team-lifecycle-v3/roles/coordinator/commands/monitor.md +180 -0
  165. package/.claude/skills/team-lifecycle-v3/roles/coordinator/role.md +209 -0
  166. package/.claude/skills/team-lifecycle-v3/roles/discussant/commands/critique.md +136 -0
  167. package/.claude/skills/team-lifecycle-v3/roles/discussant/role.md +128 -0
  168. package/.claude/skills/team-lifecycle-v3/roles/executor/commands/implement.md +166 -0
  169. package/.claude/skills/team-lifecycle-v3/roles/executor/role.md +103 -0
  170. package/.claude/skills/team-lifecycle-v3/roles/explorer/role.md +91 -0
  171. package/.claude/skills/team-lifecycle-v3/roles/fe-developer/role.md +111 -0
  172. package/.claude/skills/team-lifecycle-v3/roles/fe-qa/commands/pre-delivery-checklist.md +152 -0
  173. package/.claude/skills/team-lifecycle-v3/roles/fe-qa/role.md +113 -0
  174. package/.claude/skills/team-lifecycle-v3/roles/planner/commands/explore.md +154 -0
  175. package/.claude/skills/team-lifecycle-v3/roles/planner/role.md +120 -0
  176. package/.claude/skills/team-lifecycle-v3/roles/reviewer/commands/code-review.md +163 -0
  177. package/.claude/skills/team-lifecycle-v3/roles/reviewer/commands/spec-quality.md +202 -0
  178. package/.claude/skills/team-lifecycle-v3/roles/reviewer/role.md +104 -0
  179. package/.claude/skills/team-lifecycle-v3/roles/tester/commands/validate.md +152 -0
  180. package/.claude/skills/team-lifecycle-v3/roles/tester/role.md +108 -0
  181. package/.claude/skills/team-lifecycle-v3/roles/writer/commands/generate-doc.md +187 -0
  182. package/.claude/skills/team-lifecycle-v3/roles/writer/role.md +96 -0
  183. package/.claude/skills/team-lifecycle-v3/specs/document-standards.md +192 -0
  184. package/.claude/skills/team-lifecycle-v3/specs/quality-gates.md +207 -0
  185. package/.claude/skills/team-lifecycle-v3/specs/team-config.json +158 -0
  186. package/.claude/skills/team-lifecycle-v3/templates/architecture-doc.md +254 -0
  187. package/.claude/skills/team-lifecycle-v3/templates/epics-template.md +196 -0
  188. package/.claude/skills/team-lifecycle-v3/templates/product-brief.md +133 -0
  189. package/.claude/skills/team-lifecycle-v3/templates/requirements-prd.md +224 -0
  190. package/.claude/skills/team-lifecycle-v4/SKILL.md +643 -0
  191. package/.claude/skills/team-lifecycle-v4/roles/analyst/role.md +174 -0
  192. package/.claude/skills/team-lifecycle-v4/roles/architect/commands/assess.md +193 -0
  193. package/.claude/skills/team-lifecycle-v4/roles/architect/role.md +103 -0
  194. package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/dispatch.md +198 -0
  195. package/.claude/skills/team-lifecycle-v4/roles/coordinator/commands/monitor.md +413 -0
  196. package/.claude/skills/team-lifecycle-v4/roles/coordinator/role.md +230 -0
  197. package/.claude/skills/team-lifecycle-v4/roles/executor/commands/implement.md +166 -0
  198. package/.claude/skills/team-lifecycle-v4/roles/executor/role.md +103 -0
  199. package/.claude/skills/team-lifecycle-v4/roles/fe-developer/role.md +111 -0
  200. package/.claude/skills/team-lifecycle-v4/roles/fe-qa/commands/pre-delivery-checklist.md +152 -0
  201. package/.claude/skills/team-lifecycle-v4/roles/fe-qa/role.md +113 -0
  202. package/.claude/skills/team-lifecycle-v4/roles/planner/commands/explore.md +172 -0
  203. package/.claude/skills/team-lifecycle-v4/roles/planner/role.md +139 -0
  204. package/.claude/skills/team-lifecycle-v4/roles/reviewer/commands/code-review.md +163 -0
  205. package/.claude/skills/team-lifecycle-v4/roles/reviewer/commands/spec-quality.md +202 -0
  206. package/.claude/skills/team-lifecycle-v4/roles/reviewer/role.md +150 -0
  207. package/.claude/skills/team-lifecycle-v4/roles/tester/commands/validate.md +152 -0
  208. package/.claude/skills/team-lifecycle-v4/roles/tester/role.md +108 -0
  209. package/.claude/skills/team-lifecycle-v4/roles/writer/commands/generate-doc.md +192 -0
  210. package/.claude/skills/team-lifecycle-v4/roles/writer/role.md +246 -0
  211. package/.claude/skills/team-lifecycle-v4/specs/document-standards.md +192 -0
  212. package/.claude/skills/team-lifecycle-v4/specs/quality-gates.md +207 -0
  213. package/.claude/skills/team-lifecycle-v4/specs/team-config.json +200 -0
  214. package/.claude/skills/team-lifecycle-v4/subagents/discuss-subagent.md +169 -0
  215. package/.claude/skills/team-lifecycle-v4/subagents/doc-generation-subagent.md +62 -0
  216. package/.claude/skills/team-lifecycle-v4/subagents/explore-subagent.md +172 -0
  217. package/.claude/skills/team-lifecycle-v4/templates/architecture-doc.md +254 -0
  218. package/.claude/skills/team-lifecycle-v4/templates/epics-template.md +196 -0
  219. package/.claude/skills/team-lifecycle-v4/templates/product-brief.md +133 -0
  220. package/.claude/skills/team-lifecycle-v4/templates/requirements-prd.md +224 -0
  221. package/.claude/skills/team-lifecycle-v5/SKILL.md +320 -0
  222. package/.claude/skills/team-lifecycle-v5/role-specs/analyst.md +93 -0
  223. package/.claude/skills/team-lifecycle-v5/role-specs/architect.md +76 -0
  224. package/.claude/skills/team-lifecycle-v5/role-specs/executor.md +67 -0
  225. package/.claude/skills/team-lifecycle-v5/role-specs/fe-developer.md +79 -0
  226. package/.claude/skills/team-lifecycle-v5/role-specs/fe-qa.md +79 -0
  227. package/.claude/skills/team-lifecycle-v5/role-specs/planner.md +98 -0
  228. package/.claude/skills/team-lifecycle-v5/role-specs/reviewer.md +94 -0
  229. package/.claude/skills/team-lifecycle-v5/role-specs/tester.md +76 -0
  230. package/.claude/skills/team-lifecycle-v5/role-specs/writer.md +126 -0
  231. package/.claude/skills/team-lifecycle-v5/roles/coordinator/commands/dispatch.md +178 -0
  232. package/.claude/skills/team-lifecycle-v5/roles/coordinator/commands/monitor.md +237 -0
  233. package/.claude/skills/team-lifecycle-v5/roles/coordinator/role.md +194 -0
  234. package/.claude/skills/team-lifecycle-v5/specs/document-standards.md +192 -0
  235. package/.claude/skills/team-lifecycle-v5/specs/quality-gates.md +207 -0
  236. package/.claude/skills/team-lifecycle-v5/specs/team-config.json +218 -0
  237. package/.claude/skills/team-lifecycle-v5/subagents/discuss-subagent.md +169 -0
  238. package/.claude/skills/team-lifecycle-v5/subagents/doc-generation-subagent.md +62 -0
  239. package/.claude/skills/team-lifecycle-v5/subagents/explore-subagent.md +172 -0
  240. package/.claude/skills/team-lifecycle-v5/templates/architecture-doc.md +254 -0
  241. package/.claude/skills/team-lifecycle-v5/templates/epics-template.md +196 -0
  242. package/.claude/skills/team-lifecycle-v5/templates/product-brief.md +133 -0
  243. package/.claude/skills/team-lifecycle-v5/templates/requirements-prd.md +224 -0
  244. package/.claude/skills/team-planex/SKILL.md +439 -0
  245. package/.claude/skills/team-planex/roles/executor.md +356 -0
  246. package/.claude/skills/team-planex/roles/planner.md +315 -0
  247. package/.claude/skills/team-quality-assurance/SKILL.md +466 -0
  248. package/.claude/skills/team-quality-assurance/roles/analyst/commands/quality-report.md +360 -0
  249. package/.claude/skills/team-quality-assurance/roles/analyst/role.md +186 -0
  250. package/.claude/skills/team-quality-assurance/roles/coordinator/commands/dispatch.md +169 -0
  251. package/.claude/skills/team-quality-assurance/roles/coordinator/commands/monitor.md +336 -0
  252. package/.claude/skills/team-quality-assurance/roles/coordinator/role.md +195 -0
  253. package/.claude/skills/team-quality-assurance/roles/executor/commands/run-fix-cycle.md +220 -0
  254. package/.claude/skills/team-quality-assurance/roles/executor/role.md +179 -0
  255. package/.claude/skills/team-quality-assurance/roles/generator/commands/generate-tests.md +258 -0
  256. package/.claude/skills/team-quality-assurance/roles/generator/role.md +172 -0
  257. package/.claude/skills/team-quality-assurance/roles/scout/commands/scan.md +216 -0
  258. package/.claude/skills/team-quality-assurance/roles/scout/role.md +244 -0
  259. package/.claude/skills/team-quality-assurance/roles/strategist/commands/analyze-scope.md +221 -0
  260. package/.claude/skills/team-quality-assurance/roles/strategist/role.md +166 -0
  261. package/.claude/skills/team-quality-assurance/specs/team-config.json +131 -0
  262. package/.claude/skills/team-review/SKILL.md +264 -0
  263. package/.claude/skills/team-review/roles/coordinator/commands/dispatch.md +145 -0
  264. package/.claude/skills/team-review/roles/coordinator/commands/monitor.md +218 -0
  265. package/.claude/skills/team-review/roles/coordinator/role.md +244 -0
  266. package/.claude/skills/team-review/roles/fixer/commands/execute-fixes.md +163 -0
  267. package/.claude/skills/team-review/roles/fixer/commands/plan-fixes.md +187 -0
  268. package/.claude/skills/team-review/roles/fixer/role.md +247 -0
  269. package/.claude/skills/team-review/roles/reviewer/commands/deep-analyze.md +186 -0
  270. package/.claude/skills/team-review/roles/reviewer/commands/generate-report.md +174 -0
  271. package/.claude/skills/team-review/roles/reviewer/role.md +233 -0
  272. package/.claude/skills/team-review/roles/scanner/commands/semantic-scan.md +186 -0
  273. package/.claude/skills/team-review/roles/scanner/commands/toolchain-scan.md +187 -0
  274. package/.claude/skills/team-review/roles/scanner/role.md +255 -0
  275. package/.claude/skills/team-review/specs/dimensions.md +82 -0
  276. package/.claude/skills/team-review/specs/finding-schema.json +82 -0
  277. package/.claude/skills/team-review/specs/team-config.json +27 -0
  278. package/.claude/skills/team-roadmap-dev/SKILL.md +389 -0
  279. package/.claude/skills/team-roadmap-dev/roles/coordinator/commands/dispatch.md +213 -0
  280. package/.claude/skills/team-roadmap-dev/roles/coordinator/commands/monitor.md +378 -0
  281. package/.claude/skills/team-roadmap-dev/roles/coordinator/commands/pause.md +91 -0
  282. package/.claude/skills/team-roadmap-dev/roles/coordinator/commands/resume.md +138 -0
  283. package/.claude/skills/team-roadmap-dev/roles/coordinator/commands/roadmap-discuss.md +287 -0
  284. package/.claude/skills/team-roadmap-dev/roles/coordinator/role.md +237 -0
  285. package/.claude/skills/team-roadmap-dev/roles/executor/commands/implement.md +309 -0
  286. package/.claude/skills/team-roadmap-dev/roles/executor/role.md +220 -0
  287. package/.claude/skills/team-roadmap-dev/roles/planner/commands/create-plans.md +362 -0
  288. package/.claude/skills/team-roadmap-dev/roles/planner/commands/research.md +219 -0
  289. package/.claude/skills/team-roadmap-dev/roles/planner/role.md +243 -0
  290. package/.claude/skills/team-roadmap-dev/roles/verifier/commands/verify.md +335 -0
  291. package/.claude/skills/team-roadmap-dev/roles/verifier/role.md +247 -0
  292. package/.claude/skills/team-roadmap-dev/specs/team-config.json +96 -0
  293. package/.claude/skills/team-tech-debt/SKILL.md +473 -0
  294. package/.claude/skills/team-tech-debt/roles/assessor/commands/evaluate.md +164 -0
  295. package/.claude/skills/team-tech-debt/roles/assessor/role.md +187 -0
  296. package/.claude/skills/team-tech-debt/roles/coordinator/commands/dispatch.md +157 -0
  297. package/.claude/skills/team-tech-debt/roles/coordinator/commands/monitor.md +434 -0
  298. package/.claude/skills/team-tech-debt/roles/coordinator/role.md +387 -0
  299. package/.claude/skills/team-tech-debt/roles/executor/commands/remediate.md +180 -0
  300. package/.claude/skills/team-tech-debt/roles/executor/role.md +228 -0
  301. package/.claude/skills/team-tech-debt/roles/planner/commands/create-plan.md +165 -0
  302. package/.claude/skills/team-tech-debt/roles/planner/role.md +190 -0
  303. package/.claude/skills/team-tech-debt/roles/scanner/commands/scan-debt.md +388 -0
  304. package/.claude/skills/team-tech-debt/roles/scanner/role.md +225 -0
  305. package/.claude/skills/team-tech-debt/roles/validator/commands/verify.md +203 -0
  306. package/.claude/skills/team-tech-debt/roles/validator/role.md +237 -0
  307. package/.claude/skills/team-tech-debt/specs/team-config.json +132 -0
  308. package/.claude/skills/team-testing/SKILL.md +362 -0
  309. package/.claude/skills/team-testing/roles/analyst.md +265 -0
  310. package/.claude/skills/team-testing/roles/coordinator.md +304 -0
  311. package/.claude/skills/team-testing/roles/executor.md +300 -0
  312. package/.claude/skills/team-testing/roles/generator.md +272 -0
  313. package/.claude/skills/team-testing/roles/strategist.md +218 -0
  314. package/.claude/skills/team-testing/specs/team-config.json +93 -0
  315. package/.claude/skills/team-uidesign/SKILL.md +419 -0
  316. package/.claude/skills/team-uidesign/roles/coordinator.md +315 -0
  317. package/.claude/skills/team-uidesign/roles/designer.md +251 -0
  318. package/.claude/skills/team-uidesign/roles/implementer.md +280 -0
  319. package/.claude/skills/team-uidesign/roles/researcher.md +286 -0
  320. package/.claude/skills/team-uidesign/roles/reviewer.md +301 -0
  321. package/.claude/skills/team-uidesign/specs/team-config.json +107 -0
  322. package/.claude/skills/team-ultra-analyze/SKILL.md +444 -0
  323. package/.claude/skills/team-ultra-analyze/roles/analyst/commands/analyze.md +210 -0
  324. package/.claude/skills/team-ultra-analyze/roles/analyst/role.md +253 -0
  325. package/.claude/skills/team-ultra-analyze/roles/coordinator/commands/dispatch.md +237 -0
  326. package/.claude/skills/team-ultra-analyze/roles/coordinator/commands/monitor.md +461 -0
  327. package/.claude/skills/team-ultra-analyze/roles/coordinator/role.md +354 -0
  328. package/.claude/skills/team-ultra-analyze/roles/discussant/commands/deepen.md +222 -0
  329. package/.claude/skills/team-ultra-analyze/roles/discussant/role.md +227 -0
  330. package/.claude/skills/team-ultra-analyze/roles/explorer/commands/explore.md +194 -0
  331. package/.claude/skills/team-ultra-analyze/roles/explorer/role.md +219 -0
  332. package/.claude/skills/team-ultra-analyze/roles/synthesizer/commands/synthesize.md +255 -0
  333. package/.claude/skills/team-ultra-analyze/roles/synthesizer/role.md +251 -0
  334. package/.claude/skills/team-ultra-analyze/specs/team-config.json +131 -0
  335. package/.claude/skills/workflow-execute/SKILL.md +625 -0
  336. package/.claude/skills/workflow-execute/phases/06-review.md +215 -0
  337. package/.claude/skills/workflow-lite-plan/SKILL.md +174 -0
  338. package/.claude/skills/workflow-lite-plan/phases/01-lite-plan.md +762 -0
  339. package/.claude/skills/workflow-lite-plan/phases/02-lite-execute.md +786 -0
  340. package/.claude/skills/workflow-multi-cli-plan/SKILL.md +163 -0
  341. package/.claude/skills/workflow-multi-cli-plan/phases/01-multi-cli-plan.md +604 -0
  342. package/.claude/skills/workflow-multi-cli-plan/phases/02-lite-execute.md +788 -0
  343. package/.claude/skills/workflow-plan/SKILL.md +441 -0
  344. package/.claude/skills/workflow-plan/phases/01-session-discovery.md +99 -0
  345. package/.claude/skills/workflow-plan/phases/02-context-gathering.md +338 -0
  346. package/.claude/skills/workflow-plan/phases/03-conflict-resolution.md +422 -0
  347. package/.claude/skills/workflow-plan/phases/04-task-generation.md +433 -0
  348. package/.claude/skills/workflow-plan/phases/05-plan-verify.md +391 -0
  349. package/.claude/skills/workflow-plan/phases/06-replan.md +594 -0
  350. package/.claude/skills/workflow-skill-designer/SKILL.md +496 -0
  351. package/.claude/skills/workflow-skill-designer/phases/01-requirements-analysis.md +356 -0
  352. package/.claude/skills/workflow-skill-designer/phases/02-orchestrator-design.md +444 -0
  353. package/.claude/skills/workflow-skill-designer/phases/03-phase-design.md +458 -0
  354. package/.claude/skills/workflow-skill-designer/phases/04-validation.md +471 -0
  355. package/.claude/skills/workflow-tdd/SKILL.md +502 -0
  356. package/.claude/skills/workflow-tdd/phases/01-session-discovery.md +57 -0
  357. package/.claude/skills/workflow-tdd/phases/02-context-gathering.md +406 -0
  358. package/.claude/skills/workflow-tdd/phases/03-test-coverage-analysis.md +172 -0
  359. package/.claude/skills/workflow-tdd/phases/04-conflict-resolution.md +426 -0
  360. package/.claude/skills/workflow-tdd/phases/05-tdd-task-generation.md +472 -0
  361. package/.claude/skills/workflow-tdd/phases/06-tdd-structure-validation.md +189 -0
  362. package/.claude/skills/workflow-tdd/phases/07-tdd-verify.md +635 -0
  363. package/.claude/skills/workflow-test-fix/SKILL.md +458 -0
  364. package/.claude/skills/workflow-test-fix/phases/01-session-start.md +60 -0
  365. package/.claude/skills/workflow-test-fix/phases/02-test-context-gather.md +492 -0
  366. package/.claude/skills/workflow-test-fix/phases/03-test-concept-enhanced.md +150 -0
  367. package/.claude/skills/workflow-test-fix/phases/04-test-task-generate.md +346 -0
  368. package/.claude/skills/workflow-test-fix/phases/05-test-cycle-execute.md +537 -0
  369. package/.codex/AGENTS.md +126 -122
  370. package/.codex/agents/action-planning-agent.md +88 -93
  371. package/.codex/agents/cli-execution-agent.md +4 -4
  372. package/.codex/agents/cli-explore-agent.md +56 -11
  373. package/.codex/agents/cli-lite-planning-agent.md +906 -736
  374. package/.codex/agents/code-developer.md +147 -38
  375. package/.codex/agents/conceptual-planning-agent.md +5 -5
  376. package/.codex/agents/context-search-agent.md +8 -4
  377. package/.codex/agents/issue-plan-agent.md +11 -11
  378. package/.codex/agents/memory-bridge.md +2 -2
  379. package/.codex/agents/tdd-developer.md +512 -0
  380. package/.codex/agents/test-action-planning-agent.md +684 -0
  381. package/.codex/agents/test-fix-agent.md +19 -7
  382. package/.codex/agents/ui-design-agent.md +3 -3
  383. package/.codex/prompts/prep-cycle.md +416 -0
  384. package/.codex/prompts/prep-plan.md +371 -0
  385. package/.codex/skills/analyze-with-file/EXECUTE.md +716 -0
  386. package/.codex/skills/analyze-with-file/SKILL.md +1049 -0
  387. package/.codex/skills/brainstorm-with-file/SKILL.md +1033 -0
  388. package/.codex/skills/clean/SKILL.md +421 -0
  389. package/.codex/skills/collaborative-plan-with-file/SKILL.md +822 -0
  390. package/.codex/skills/debug-with-file/SKILL.md +617 -0
  391. package/.codex/skills/issue-discover/SKILL.md +353 -0
  392. package/.codex/skills/issue-discover/phases/01-issue-new.md +334 -0
  393. package/.codex/skills/issue-discover/phases/02-discover.md +369 -0
  394. package/.codex/skills/issue-discover/phases/03-discover-by-prompt.md +531 -0
  395. package/.codex/skills/issue-discover/phases/04-quick-execute.md +241 -0
  396. package/.codex/skills/memory-compact/SKILL.md +381 -0
  397. package/.codex/skills/parallel-dev-cycle/SKILL.md +401 -0
  398. package/.codex/skills/parallel-dev-cycle/phases/00-prep-checklist.md +191 -0
  399. package/.codex/skills/parallel-dev-cycle/phases/01-session-init.md +261 -0
  400. package/.codex/skills/parallel-dev-cycle/phases/02-agent-execution.md +449 -0
  401. package/.codex/skills/parallel-dev-cycle/phases/03-result-aggregation.md +230 -0
  402. package/.codex/skills/parallel-dev-cycle/phases/04-completion-summary.md +109 -0
  403. package/.codex/skills/parallel-dev-cycle/roles/code-developer.md +392 -0
  404. package/.codex/skills/parallel-dev-cycle/roles/exploration-planner.md +352 -0
  405. package/.codex/skills/parallel-dev-cycle/roles/requirements-analyst.md +433 -0
  406. package/.codex/skills/parallel-dev-cycle/roles/validation-archivist.md +447 -0
  407. package/.codex/skills/review-cycle/SKILL.md +476 -0
  408. package/.codex/skills/review-cycle/phases/01-discovery-initialization.md +341 -0
  409. package/.codex/skills/review-cycle/phases/02-parallel-review.md +546 -0
  410. package/.codex/skills/review-cycle/phases/03-aggregation.md +74 -0
  411. package/.codex/skills/review-cycle/phases/04-iterative-deep-dive.md +333 -0
  412. package/.codex/skills/review-cycle/phases/05-review-completion.md +173 -0
  413. package/.codex/skills/review-cycle/phases/06-fix-discovery-batching.md +238 -0
  414. package/.codex/skills/review-cycle/phases/07-fix-parallel-planning.md +223 -0
  415. package/.codex/skills/review-cycle/phases/08-fix-execution.md +238 -0
  416. package/.codex/skills/review-cycle/phases/09-fix-completion.md +141 -0
  417. package/.codex/skills/roadmap-with-file/SKILL.md +898 -0
  418. package/.codex/skills/team-lifecycle/agents/analyst.md +424 -0
  419. package/.codex/skills/team-lifecycle/agents/architect.md +274 -0
  420. package/.codex/skills/team-lifecycle/agents/discuss-agent.md +422 -0
  421. package/.codex/skills/team-lifecycle/agents/executor.md +423 -0
  422. package/.codex/skills/team-lifecycle/agents/explore-agent.md +471 -0
  423. package/.codex/skills/team-lifecycle/agents/fe-developer.md +239 -0
  424. package/.codex/skills/team-lifecycle/agents/fe-qa.md +357 -0
  425. package/.codex/skills/team-lifecycle/agents/planner.md +437 -0
  426. package/.codex/skills/team-lifecycle/agents/reviewer.md +483 -0
  427. package/.codex/skills/team-lifecycle/agents/tester.md +423 -0
  428. package/.codex/skills/team-lifecycle/agents/writer.md +502 -0
  429. package/.codex/skills/team-lifecycle/orchestrator.md +817 -0
  430. package/.codex/skills/team-lifecycle/phases/01-requirement-clarification.md +209 -0
  431. package/.codex/skills/team-lifecycle/phases/02-team-initialization.md +205 -0
  432. package/.codex/skills/team-lifecycle/phases/03-task-chain-creation.md +251 -0
  433. package/.codex/skills/team-lifecycle/phases/04-pipeline-coordination.md +719 -0
  434. package/.codex/skills/team-lifecycle/phases/05-completion-report.md +288 -0
  435. package/.codex/skills/team-lifecycle/specs/document-standards.md +192 -0
  436. package/.codex/skills/team-lifecycle/specs/quality-gates.md +207 -0
  437. package/.codex/skills/team-lifecycle/templates/architecture-doc.md +254 -0
  438. package/.codex/skills/team-lifecycle/templates/epics-template.md +196 -0
  439. package/.codex/skills/team-lifecycle/templates/product-brief.md +133 -0
  440. package/.codex/skills/team-lifecycle/templates/requirements-prd.md +224 -0
  441. package/.codex/skills/team-planex/agents/executor.md +217 -0
  442. package/.codex/skills/team-planex/agents/planner.md +183 -0
  443. package/.codex/skills/team-planex/orchestrator.md +284 -0
  444. package/.codex/skills/unified-execute-with-file/SKILL.md +786 -0
  445. package/.codex/skills/workflow-test-fix-cycle/SKILL.md +391 -0
  446. package/.codex/skills/workflow-test-fix-cycle/phases/01-test-fix-gen.md +452 -0
  447. package/.codex/skills/workflow-test-fix-cycle/phases/02-test-cycle-execute.md +476 -0
  448. package/README.md +187 -157
  449. package/ccw/README.md +46 -0
  450. package/ccw/bin/ccw-mcp.js +16 -1
  451. package/ccw/dist/cli.d.ts.map +1 -1
  452. package/ccw/dist/cli.js +58 -2
  453. package/ccw/dist/cli.js.map +1 -1
  454. package/ccw/dist/commands/cli.d.ts +3 -0
  455. package/ccw/dist/commands/cli.d.ts.map +1 -1
  456. package/ccw/dist/commands/cli.js +109 -63
  457. package/ccw/dist/commands/cli.js.map +1 -1
  458. package/ccw/dist/commands/core-memory.d.ts +5 -0
  459. package/ccw/dist/commands/core-memory.d.ts.map +1 -1
  460. package/ccw/dist/commands/core-memory.js +307 -2
  461. package/ccw/dist/commands/core-memory.js.map +1 -1
  462. package/ccw/dist/commands/hook.d.ts +3 -1
  463. package/ccw/dist/commands/hook.d.ts.map +1 -1
  464. package/ccw/dist/commands/hook.js +669 -85
  465. package/ccw/dist/commands/hook.js.map +1 -1
  466. package/ccw/dist/commands/install.d.ts +12 -0
  467. package/ccw/dist/commands/install.d.ts.map +1 -1
  468. package/ccw/dist/commands/install.js +313 -3
  469. package/ccw/dist/commands/install.js.map +1 -1
  470. package/ccw/dist/commands/issue.d.ts +18 -5
  471. package/ccw/dist/commands/issue.d.ts.map +1 -1
  472. package/ccw/dist/commands/issue.js +58 -19
  473. package/ccw/dist/commands/issue.js.map +1 -1
  474. package/ccw/dist/commands/memory.d.ts +1 -1
  475. package/ccw/dist/commands/memory.d.ts.map +1 -1
  476. package/ccw/dist/commands/memory.js +371 -1
  477. package/ccw/dist/commands/memory.js.map +1 -1
  478. package/ccw/dist/commands/serve.d.ts.map +1 -1
  479. package/ccw/dist/commands/serve.js +74 -4
  480. package/ccw/dist/commands/serve.js.map +1 -1
  481. package/ccw/dist/commands/spec.d.ts +24 -0
  482. package/ccw/dist/commands/spec.d.ts.map +1 -0
  483. package/ccw/dist/commands/spec.js +374 -0
  484. package/ccw/dist/commands/spec.js.map +1 -0
  485. package/ccw/dist/commands/stop.d.ts +0 -4
  486. package/ccw/dist/commands/stop.d.ts.map +1 -1
  487. package/ccw/dist/commands/stop.js +135 -12
  488. package/ccw/dist/commands/stop.js.map +1 -1
  489. package/ccw/dist/commands/team.d.ts +27 -0
  490. package/ccw/dist/commands/team.d.ts.map +1 -0
  491. package/ccw/dist/commands/team.js +164 -0
  492. package/ccw/dist/commands/team.js.map +1 -0
  493. package/ccw/dist/commands/upgrade.js +4 -2
  494. package/ccw/dist/commands/upgrade.js.map +1 -1
  495. package/ccw/dist/commands/view.d.ts.map +1 -1
  496. package/ccw/dist/commands/view.js +2 -3
  497. package/ccw/dist/commands/view.js.map +1 -1
  498. package/ccw/dist/commands/workflow.js +2 -2
  499. package/ccw/dist/commands/workflow.js.map +1 -1
  500. package/ccw/dist/config/cli-settings-manager.d.ts +12 -3
  501. package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -1
  502. package/ccw/dist/config/cli-settings-manager.js +146 -12
  503. package/ccw/dist/config/cli-settings-manager.js.map +1 -1
  504. package/ccw/dist/config/litellm-static-models.d.ts +30 -0
  505. package/ccw/dist/config/litellm-static-models.d.ts.map +1 -0
  506. package/ccw/dist/config/litellm-static-models.js +82 -0
  507. package/ccw/dist/config/litellm-static-models.js.map +1 -0
  508. package/ccw/dist/config/provider-models.d.ts +5 -32
  509. package/ccw/dist/config/provider-models.d.ts.map +1 -1
  510. package/ccw/dist/config/provider-models.js +5 -103
  511. package/ccw/dist/config/provider-models.js.map +1 -1
  512. package/ccw/dist/config/remote-notification-config.d.ts +32 -0
  513. package/ccw/dist/config/remote-notification-config.d.ts.map +1 -0
  514. package/ccw/dist/config/remote-notification-config.js +131 -0
  515. package/ccw/dist/config/remote-notification-config.js.map +1 -0
  516. package/ccw/dist/config/storage-paths.d.ts +22 -0
  517. package/ccw/dist/config/storage-paths.d.ts.map +1 -1
  518. package/ccw/dist/config/storage-paths.js +27 -0
  519. package/ccw/dist/config/storage-paths.js.map +1 -1
  520. package/ccw/dist/core/a2ui/A2UITypes.d.ts +143 -0
  521. package/ccw/dist/core/a2ui/A2UITypes.d.ts.map +1 -0
  522. package/ccw/dist/core/a2ui/A2UITypes.js +84 -0
  523. package/ccw/dist/core/a2ui/A2UITypes.js.map +1 -0
  524. package/ccw/dist/core/a2ui/A2UIWebSocketHandler.d.ts +170 -0
  525. package/ccw/dist/core/a2ui/A2UIWebSocketHandler.d.ts.map +1 -0
  526. package/ccw/dist/core/a2ui/A2UIWebSocketHandler.js +718 -0
  527. package/ccw/dist/core/a2ui/A2UIWebSocketHandler.js.map +1 -0
  528. package/ccw/dist/core/a2ui/index.d.ts +3 -0
  529. package/ccw/dist/core/a2ui/index.d.ts.map +1 -0
  530. package/ccw/dist/core/a2ui/index.js +6 -0
  531. package/ccw/dist/core/a2ui/index.js.map +1 -0
  532. package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -1
  533. package/ccw/dist/core/auth/csrf-middleware.js +26 -8
  534. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -1
  535. package/ccw/dist/core/auth/middleware.d.ts.map +1 -1
  536. package/ccw/dist/core/auth/middleware.js +55 -0
  537. package/ccw/dist/core/auth/middleware.js.map +1 -1
  538. package/ccw/dist/core/core-memory-store.d.ts +99 -5
  539. package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
  540. package/ccw/dist/core/core-memory-store.js +389 -56
  541. package/ccw/dist/core/core-memory-store.js.map +1 -1
  542. package/ccw/dist/core/data-aggregator.d.ts +6 -0
  543. package/ccw/dist/core/data-aggregator.d.ts.map +1 -1
  544. package/ccw/dist/core/data-aggregator.js +6 -35
  545. package/ccw/dist/core/data-aggregator.js.map +1 -1
  546. package/ccw/dist/core/hooks/context-limit-detector.d.ts +65 -0
  547. package/ccw/dist/core/hooks/context-limit-detector.d.ts.map +1 -0
  548. package/ccw/dist/core/hooks/context-limit-detector.js +91 -0
  549. package/ccw/dist/core/hooks/context-limit-detector.js.map +1 -0
  550. package/ccw/dist/core/hooks/index.d.ts +11 -0
  551. package/ccw/dist/core/hooks/index.d.ts.map +1 -0
  552. package/ccw/dist/core/hooks/index.js +16 -0
  553. package/ccw/dist/core/hooks/index.js.map +1 -0
  554. package/ccw/dist/core/hooks/keyword-detector.d.ts +106 -0
  555. package/ccw/dist/core/hooks/keyword-detector.d.ts.map +1 -0
  556. package/ccw/dist/core/hooks/keyword-detector.js +194 -0
  557. package/ccw/dist/core/hooks/keyword-detector.js.map +1 -0
  558. package/ccw/dist/core/hooks/recovery-handler.d.ts +114 -0
  559. package/ccw/dist/core/hooks/recovery-handler.d.ts.map +1 -0
  560. package/ccw/dist/core/hooks/recovery-handler.js +244 -0
  561. package/ccw/dist/core/hooks/recovery-handler.js.map +1 -0
  562. package/ccw/dist/core/hooks/stop-handler.d.ts +128 -0
  563. package/ccw/dist/core/hooks/stop-handler.d.ts.map +1 -0
  564. package/ccw/dist/core/hooks/stop-handler.js +269 -0
  565. package/ccw/dist/core/hooks/stop-handler.js.map +1 -0
  566. package/ccw/dist/core/hooks/user-abort-detector.d.ts +76 -0
  567. package/ccw/dist/core/hooks/user-abort-detector.d.ts.map +1 -0
  568. package/ccw/dist/core/hooks/user-abort-detector.js +168 -0
  569. package/ccw/dist/core/hooks/user-abort-detector.js.map +1 -0
  570. package/ccw/dist/core/lite-scanner-complete.d.ts +18 -3
  571. package/ccw/dist/core/lite-scanner-complete.d.ts.map +1 -1
  572. package/ccw/dist/core/lite-scanner-complete.js +54 -12
  573. package/ccw/dist/core/lite-scanner-complete.js.map +1 -1
  574. package/ccw/dist/core/lite-scanner.d.ts +74 -3
  575. package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
  576. package/ccw/dist/core/lite-scanner.js +57 -12
  577. package/ccw/dist/core/lite-scanner.js.map +1 -1
  578. package/ccw/dist/core/memory-consolidation-pipeline.d.ts +126 -0
  579. package/ccw/dist/core/memory-consolidation-pipeline.d.ts.map +1 -0
  580. package/ccw/dist/core/memory-consolidation-pipeline.js +364 -0
  581. package/ccw/dist/core/memory-consolidation-pipeline.js.map +1 -0
  582. package/ccw/dist/core/memory-consolidation-prompts.d.ts +27 -0
  583. package/ccw/dist/core/memory-consolidation-prompts.d.ts.map +1 -0
  584. package/ccw/dist/core/memory-consolidation-prompts.js +103 -0
  585. package/ccw/dist/core/memory-consolidation-prompts.js.map +1 -0
  586. package/ccw/dist/core/memory-embedder-bridge.d.ts +22 -0
  587. package/ccw/dist/core/memory-embedder-bridge.d.ts.map +1 -1
  588. package/ccw/dist/core/memory-embedder-bridge.js +85 -0
  589. package/ccw/dist/core/memory-embedder-bridge.js.map +1 -1
  590. package/ccw/dist/core/memory-extraction-pipeline.d.ts +244 -0
  591. package/ccw/dist/core/memory-extraction-pipeline.d.ts.map +1 -0
  592. package/ccw/dist/core/memory-extraction-pipeline.js +934 -0
  593. package/ccw/dist/core/memory-extraction-pipeline.js.map +1 -0
  594. package/ccw/dist/core/memory-extraction-prompts.d.ts +29 -0
  595. package/ccw/dist/core/memory-extraction-prompts.d.ts.map +1 -0
  596. package/ccw/dist/core/memory-extraction-prompts.js +99 -0
  597. package/ccw/dist/core/memory-extraction-prompts.js.map +1 -0
  598. package/ccw/dist/core/memory-job-scheduler.d.ts +92 -0
  599. package/ccw/dist/core/memory-job-scheduler.d.ts.map +1 -0
  600. package/ccw/dist/core/memory-job-scheduler.js +264 -0
  601. package/ccw/dist/core/memory-job-scheduler.js.map +1 -0
  602. package/ccw/dist/core/memory-v2-config.d.ts +48 -0
  603. package/ccw/dist/core/memory-v2-config.d.ts.map +1 -0
  604. package/ccw/dist/core/memory-v2-config.js +51 -0
  605. package/ccw/dist/core/memory-v2-config.js.map +1 -0
  606. package/ccw/dist/core/mode-workflow-map.d.ts +148 -0
  607. package/ccw/dist/core/mode-workflow-map.d.ts.map +1 -0
  608. package/ccw/dist/core/mode-workflow-map.js +271 -0
  609. package/ccw/dist/core/mode-workflow-map.js.map +1 -0
  610. package/ccw/dist/core/pattern-detector.d.ts +99 -0
  611. package/ccw/dist/core/pattern-detector.d.ts.map +1 -0
  612. package/ccw/dist/core/pattern-detector.js +385 -0
  613. package/ccw/dist/core/pattern-detector.js.map +1 -0
  614. package/ccw/dist/core/routes/analysis-routes.d.ts +40 -0
  615. package/ccw/dist/core/routes/analysis-routes.d.ts.map +1 -0
  616. package/ccw/dist/core/routes/analysis-routes.js +172 -0
  617. package/ccw/dist/core/routes/analysis-routes.js.map +1 -0
  618. package/ccw/dist/core/routes/audit-routes.d.ts +14 -0
  619. package/ccw/dist/core/routes/audit-routes.d.ts.map +1 -0
  620. package/ccw/dist/core/routes/audit-routes.js +150 -0
  621. package/ccw/dist/core/routes/audit-routes.js.map +1 -0
  622. package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
  623. package/ccw/dist/core/routes/ccw-routes.js +87 -0
  624. package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
  625. package/ccw/dist/core/routes/claude-routes.js +13 -13
  626. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  627. package/ccw/dist/core/routes/cli-routes.d.ts +6 -2
  628. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  629. package/ccw/dist/core/routes/cli-routes.js +308 -22
  630. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  631. package/ccw/dist/core/routes/cli-sessions-routes.d.ts +20 -0
  632. package/ccw/dist/core/routes/cli-sessions-routes.d.ts.map +1 -0
  633. package/ccw/dist/core/routes/cli-sessions-routes.js +449 -0
  634. package/ccw/dist/core/routes/cli-sessions-routes.js.map +1 -0
  635. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -1
  636. package/ccw/dist/core/routes/cli-settings-routes.js +217 -3
  637. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -1
  638. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -1
  639. package/ccw/dist/core/routes/codexlens/config-handlers.js +164 -26
  640. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -1
  641. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -1
  642. package/ccw/dist/core/routes/codexlens/index-handlers.js +98 -1
  643. package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -1
  644. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -1
  645. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +308 -0
  646. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -1
  647. package/ccw/dist/core/routes/commands-routes.d.ts.map +1 -1
  648. package/ccw/dist/core/routes/commands-routes.js +399 -1
  649. package/ccw/dist/core/routes/commands-routes.js.map +1 -1
  650. package/ccw/dist/core/routes/config-routes.d.ts +22 -0
  651. package/ccw/dist/core/routes/config-routes.d.ts.map +1 -0
  652. package/ccw/dist/core/routes/config-routes.js +291 -0
  653. package/ccw/dist/core/routes/config-routes.js.map +1 -0
  654. package/ccw/dist/core/routes/core-memory-routes.d.ts.map +1 -1
  655. package/ccw/dist/core/routes/core-memory-routes.js +461 -5
  656. package/ccw/dist/core/routes/core-memory-routes.js.map +1 -1
  657. package/ccw/dist/core/routes/dashboard-routes.d.ts +15 -0
  658. package/ccw/dist/core/routes/dashboard-routes.d.ts.map +1 -0
  659. package/ccw/dist/core/routes/dashboard-routes.js +121 -0
  660. package/ccw/dist/core/routes/dashboard-routes.js.map +1 -0
  661. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  662. package/ccw/dist/core/routes/files-routes.js +296 -8
  663. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  664. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  665. package/ccw/dist/core/routes/hooks-routes.js +274 -67
  666. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  667. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
  668. package/ccw/dist/core/routes/issue-routes.js +399 -27
  669. package/ccw/dist/core/routes/issue-routes.js.map +1 -1
  670. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
  671. package/ccw/dist/core/routes/litellm-api-routes.js +74 -135
  672. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
  673. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
  674. package/ccw/dist/core/routes/mcp-routes.js +79 -15
  675. package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
  676. package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
  677. package/ccw/dist/core/routes/mcp-templates-db.js +20 -7
  678. package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
  679. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  680. package/ccw/dist/core/routes/memory-routes.js +137 -0
  681. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  682. package/ccw/dist/core/routes/notification-routes.d.ts +10 -0
  683. package/ccw/dist/core/routes/notification-routes.d.ts.map +1 -0
  684. package/ccw/dist/core/routes/notification-routes.js +507 -0
  685. package/ccw/dist/core/routes/notification-routes.js.map +1 -0
  686. package/ccw/dist/core/routes/orchestrator-routes.d.ts +282 -0
  687. package/ccw/dist/core/routes/orchestrator-routes.d.ts.map +1 -0
  688. package/ccw/dist/core/routes/orchestrator-routes.js +1564 -0
  689. package/ccw/dist/core/routes/orchestrator-routes.js.map +1 -0
  690. package/ccw/dist/core/routes/provider-routes.d.ts +4 -0
  691. package/ccw/dist/core/routes/provider-routes.d.ts.map +1 -1
  692. package/ccw/dist/core/routes/provider-routes.js +45 -11
  693. package/ccw/dist/core/routes/provider-routes.js.map +1 -1
  694. package/ccw/dist/core/routes/queue-routes.d.ts +22 -0
  695. package/ccw/dist/core/routes/queue-routes.d.ts.map +1 -0
  696. package/ccw/dist/core/routes/queue-routes.js +164 -0
  697. package/ccw/dist/core/routes/queue-routes.js.map +1 -0
  698. package/ccw/dist/core/routes/skill-hub-routes.d.ts +77 -0
  699. package/ccw/dist/core/routes/skill-hub-routes.d.ts.map +1 -0
  700. package/ccw/dist/core/routes/skill-hub-routes.js +988 -0
  701. package/ccw/dist/core/routes/skill-hub-routes.js.map +1 -0
  702. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  703. package/ccw/dist/core/routes/skills-routes.js +105 -62
  704. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  705. package/ccw/dist/core/routes/spec-routes.d.ts +7 -0
  706. package/ccw/dist/core/routes/spec-routes.d.ts.map +1 -0
  707. package/ccw/dist/core/routes/spec-routes.js +266 -0
  708. package/ccw/dist/core/routes/spec-routes.js.map +1 -0
  709. package/ccw/dist/core/routes/status-routes.js +4 -4
  710. package/ccw/dist/core/routes/status-routes.js.map +1 -1
  711. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  712. package/ccw/dist/core/routes/system-routes.js +537 -6
  713. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  714. package/ccw/dist/core/routes/team-routes.d.ts +27 -0
  715. package/ccw/dist/core/routes/team-routes.d.ts.map +1 -0
  716. package/ccw/dist/core/routes/team-routes.js +557 -0
  717. package/ccw/dist/core/routes/team-routes.js.map +1 -0
  718. package/ccw/dist/core/routes/unified-memory-routes.d.ts +16 -0
  719. package/ccw/dist/core/routes/unified-memory-routes.d.ts.map +1 -0
  720. package/ccw/dist/core/routes/unified-memory-routes.js +135 -0
  721. package/ccw/dist/core/routes/unified-memory-routes.js.map +1 -0
  722. package/ccw/dist/core/routes/unsplash-routes.d.ts +4 -0
  723. package/ccw/dist/core/routes/unsplash-routes.d.ts.map +1 -0
  724. package/ccw/dist/core/routes/unsplash-routes.js +197 -0
  725. package/ccw/dist/core/routes/unsplash-routes.js.map +1 -0
  726. package/ccw/dist/core/schemas/issue-schema.d.ts +115 -0
  727. package/ccw/dist/core/schemas/issue-schema.d.ts.map +1 -0
  728. package/ccw/dist/core/schemas/issue-schema.js +117 -0
  729. package/ccw/dist/core/schemas/issue-schema.js.map +1 -0
  730. package/ccw/dist/core/server.d.ts +1 -0
  731. package/ccw/dist/core/server.d.ts.map +1 -1
  732. package/ccw/dist/core/server.js +223 -218
  733. package/ccw/dist/core/server.js.map +1 -1
  734. package/ccw/dist/core/services/checkpoint-service.d.ts +215 -0
  735. package/ccw/dist/core/services/checkpoint-service.d.ts.map +1 -0
  736. package/ccw/dist/core/services/checkpoint-service.js +376 -0
  737. package/ccw/dist/core/services/checkpoint-service.js.map +1 -0
  738. package/ccw/dist/core/services/cli-instruction-assembler.d.ts +10 -0
  739. package/ccw/dist/core/services/cli-instruction-assembler.d.ts.map +1 -0
  740. package/ccw/dist/core/services/cli-instruction-assembler.js +28 -0
  741. package/ccw/dist/core/services/cli-instruction-assembler.js.map +1 -0
  742. package/ccw/dist/core/services/cli-launch-registry.d.ts +9 -0
  743. package/ccw/dist/core/services/cli-launch-registry.d.ts.map +1 -0
  744. package/ccw/dist/core/services/cli-launch-registry.js +40 -0
  745. package/ccw/dist/core/services/cli-launch-registry.js.map +1 -0
  746. package/ccw/dist/core/services/cli-session-audit.d.ts +15 -0
  747. package/ccw/dist/core/services/cli-session-audit.d.ts.map +1 -0
  748. package/ccw/dist/core/services/cli-session-audit.js +18 -0
  749. package/ccw/dist/core/services/cli-session-audit.js.map +1 -0
  750. package/ccw/dist/core/services/cli-session-command-builder.d.ts +20 -0
  751. package/ccw/dist/core/services/cli-session-command-builder.d.ts.map +1 -0
  752. package/ccw/dist/core/services/cli-session-command-builder.js +66 -0
  753. package/ccw/dist/core/services/cli-session-command-builder.js.map +1 -0
  754. package/ccw/dist/core/services/cli-session-manager.d.ts +84 -0
  755. package/ccw/dist/core/services/cli-session-manager.d.ts.map +1 -0
  756. package/ccw/dist/core/services/cli-session-manager.js +538 -0
  757. package/ccw/dist/core/services/cli-session-manager.js.map +1 -0
  758. package/ccw/dist/core/services/cli-session-mux.d.ts +18 -0
  759. package/ccw/dist/core/services/cli-session-mux.d.ts.map +1 -0
  760. package/ccw/dist/core/services/cli-session-mux.js +18 -0
  761. package/ccw/dist/core/services/cli-session-mux.js.map +1 -0
  762. package/ccw/dist/core/services/cli-session-policy.d.ts +15 -0
  763. package/ccw/dist/core/services/cli-session-policy.d.ts.map +1 -0
  764. package/ccw/dist/core/services/cli-session-policy.js +40 -0
  765. package/ccw/dist/core/services/cli-session-policy.js.map +1 -0
  766. package/ccw/dist/core/services/cli-session-share.d.ts +27 -0
  767. package/ccw/dist/core/services/cli-session-share.d.ts.map +1 -0
  768. package/ccw/dist/core/services/cli-session-share.js +85 -0
  769. package/ccw/dist/core/services/cli-session-share.js.map +1 -0
  770. package/ccw/dist/core/services/config-backup.d.ts +69 -0
  771. package/ccw/dist/core/services/config-backup.d.ts.map +1 -0
  772. package/ccw/dist/core/services/config-backup.js +171 -0
  773. package/ccw/dist/core/services/config-backup.js.map +1 -0
  774. package/ccw/dist/core/services/config-sync.d.ts +73 -0
  775. package/ccw/dist/core/services/config-sync.d.ts.map +1 -0
  776. package/ccw/dist/core/services/config-sync.js +235 -0
  777. package/ccw/dist/core/services/config-sync.js.map +1 -0
  778. package/ccw/dist/core/services/flow-executor.d.ts +204 -0
  779. package/ccw/dist/core/services/flow-executor.d.ts.map +1 -0
  780. package/ccw/dist/core/services/flow-executor.js +775 -0
  781. package/ccw/dist/core/services/flow-executor.js.map +1 -0
  782. package/ccw/dist/core/services/hook-context-service.d.ts +139 -0
  783. package/ccw/dist/core/services/hook-context-service.d.ts.map +1 -0
  784. package/ccw/dist/core/services/hook-context-service.js +248 -0
  785. package/ccw/dist/core/services/hook-context-service.js.map +1 -0
  786. package/ccw/dist/core/services/index.d.ts +22 -0
  787. package/ccw/dist/core/services/index.d.ts.map +1 -0
  788. package/ccw/dist/core/services/index.js +22 -0
  789. package/ccw/dist/core/services/index.js.map +1 -0
  790. package/ccw/dist/core/services/issue-service.d.ts +54 -0
  791. package/ccw/dist/core/services/issue-service.d.ts.map +1 -0
  792. package/ccw/dist/core/services/issue-service.js +107 -0
  793. package/ccw/dist/core/services/issue-service.js.map +1 -0
  794. package/ccw/dist/core/services/mode-registry-service.d.ts +254 -0
  795. package/ccw/dist/core/services/mode-registry-service.d.ts.map +1 -0
  796. package/ccw/dist/core/services/mode-registry-service.js +587 -0
  797. package/ccw/dist/core/services/mode-registry-service.js.map +1 -0
  798. package/ccw/dist/core/services/pending-question-service.d.ts +51 -0
  799. package/ccw/dist/core/services/pending-question-service.d.ts.map +1 -0
  800. package/ccw/dist/core/services/pending-question-service.js +201 -0
  801. package/ccw/dist/core/services/pending-question-service.js.map +1 -0
  802. package/ccw/dist/core/services/queue-scheduler-service.d.ts +136 -0
  803. package/ccw/dist/core/services/queue-scheduler-service.d.ts.map +1 -0
  804. package/ccw/dist/core/services/queue-scheduler-service.js +587 -0
  805. package/ccw/dist/core/services/queue-scheduler-service.js.map +1 -0
  806. package/ccw/dist/core/services/rate-limiter.d.ts +20 -0
  807. package/ccw/dist/core/services/rate-limiter.d.ts.map +1 -0
  808. package/ccw/dist/core/services/rate-limiter.js +33 -0
  809. package/ccw/dist/core/services/rate-limiter.js.map +1 -0
  810. package/ccw/dist/core/services/remote-notification-service.d.ts +132 -0
  811. package/ccw/dist/core/services/remote-notification-service.d.ts.map +1 -0
  812. package/ccw/dist/core/services/remote-notification-service.js +953 -0
  813. package/ccw/dist/core/services/remote-notification-service.js.map +1 -0
  814. package/ccw/dist/core/services/session-end-service.d.ts +155 -0
  815. package/ccw/dist/core/services/session-end-service.d.ts.map +1 -0
  816. package/ccw/dist/core/services/session-end-service.js +302 -0
  817. package/ccw/dist/core/services/session-end-service.js.map +1 -0
  818. package/ccw/dist/core/services/session-state-service.d.ts +148 -0
  819. package/ccw/dist/core/services/session-state-service.d.ts.map +1 -0
  820. package/ccw/dist/core/services/session-state-service.js +259 -0
  821. package/ccw/dist/core/services/session-state-service.js.map +1 -0
  822. package/ccw/dist/core/services/version-checker.d.ts +50 -0
  823. package/ccw/dist/core/services/version-checker.d.ts.map +1 -0
  824. package/ccw/dist/core/services/version-checker.js +141 -0
  825. package/ccw/dist/core/services/version-checker.js.map +1 -0
  826. package/ccw/dist/core/session-clustering-service.d.ts +43 -2
  827. package/ccw/dist/core/session-clustering-service.d.ts.map +1 -1
  828. package/ccw/dist/core/session-clustering-service.js +210 -6
  829. package/ccw/dist/core/session-clustering-service.js.map +1 -1
  830. package/ccw/dist/core/types/issue.d.ts +103 -0
  831. package/ccw/dist/core/types/issue.d.ts.map +1 -0
  832. package/ccw/dist/core/types/issue.js +6 -0
  833. package/ccw/dist/core/types/issue.js.map +1 -0
  834. package/ccw/dist/core/unified-context-builder.d.ts +88 -0
  835. package/ccw/dist/core/unified-context-builder.d.ts.map +1 -0
  836. package/ccw/dist/core/unified-context-builder.js +379 -0
  837. package/ccw/dist/core/unified-context-builder.js.map +1 -0
  838. package/ccw/dist/core/unified-memory-service.d.ts +142 -0
  839. package/ccw/dist/core/unified-memory-service.d.ts.map +1 -0
  840. package/ccw/dist/core/unified-memory-service.js +348 -0
  841. package/ccw/dist/core/unified-memory-service.js.map +1 -0
  842. package/ccw/dist/core/unified-vector-index.d.ts +171 -0
  843. package/ccw/dist/core/unified-vector-index.d.ts.map +1 -0
  844. package/ccw/dist/core/unified-vector-index.js +332 -0
  845. package/ccw/dist/core/unified-vector-index.js.map +1 -0
  846. package/ccw/dist/core/websocket.d.ts +195 -0
  847. package/ccw/dist/core/websocket.d.ts.map +1 -1
  848. package/ccw/dist/core/websocket.js +156 -25
  849. package/ccw/dist/core/websocket.js.map +1 -1
  850. package/ccw/dist/index.d.ts +0 -1
  851. package/ccw/dist/index.d.ts.map +1 -1
  852. package/ccw/dist/index.js +0 -1
  853. package/ccw/dist/index.js.map +1 -1
  854. package/ccw/dist/mcp-server/index.js +16 -8
  855. package/ccw/dist/mcp-server/index.js.map +1 -1
  856. package/ccw/dist/tools/ask-question.d.ts +43 -0
  857. package/ccw/dist/tools/ask-question.d.ts.map +1 -0
  858. package/ccw/dist/tools/ask-question.js +1061 -0
  859. package/ccw/dist/tools/ask-question.js.map +1 -0
  860. package/ccw/dist/tools/claude-cli-tools.d.ts +18 -4
  861. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  862. package/ccw/dist/tools/claude-cli-tools.js +44 -37
  863. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  864. package/ccw/dist/tools/claude-session-parser.d.ts +116 -0
  865. package/ccw/dist/tools/claude-session-parser.d.ts.map +1 -0
  866. package/ccw/dist/tools/claude-session-parser.js +364 -0
  867. package/ccw/dist/tools/claude-session-parser.js.map +1 -0
  868. package/ccw/dist/tools/cli-config-manager.d.ts +3 -0
  869. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
  870. package/ccw/dist/tools/cli-config-manager.js +4 -1
  871. package/ccw/dist/tools/cli-config-manager.js.map +1 -1
  872. package/ccw/dist/tools/cli-executor-core.d.ts +24 -0
  873. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -1
  874. package/ccw/dist/tools/cli-executor-core.js +103 -8
  875. package/ccw/dist/tools/cli-executor-core.js.map +1 -1
  876. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -1
  877. package/ccw/dist/tools/cli-executor-state.js +4 -4
  878. package/ccw/dist/tools/cli-executor-state.js.map +1 -1
  879. package/ccw/dist/tools/cli-executor-utils.d.ts +2 -0
  880. package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -1
  881. package/ccw/dist/tools/cli-executor-utils.js +14 -5
  882. package/ccw/dist/tools/cli-executor-utils.js.map +1 -1
  883. package/ccw/dist/tools/cli-history-store.d.ts +11 -6
  884. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  885. package/ccw/dist/tools/cli-history-store.js +134 -17
  886. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  887. package/ccw/dist/tools/cli-output-converter.d.ts +7 -0
  888. package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -1
  889. package/ccw/dist/tools/cli-output-converter.js +166 -16
  890. package/ccw/dist/tools/cli-output-converter.js.map +1 -1
  891. package/ccw/dist/tools/codex-lens.d.ts +13 -0
  892. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  893. package/ccw/dist/tools/codex-lens.js +200 -185
  894. package/ccw/dist/tools/codex-lens.js.map +1 -1
  895. package/ccw/dist/tools/command-registry.test.js +727 -0
  896. package/ccw/dist/tools/core-memory.d.ts +35 -1
  897. package/ccw/dist/tools/core-memory.d.ts.map +1 -1
  898. package/ccw/dist/tools/core-memory.js +195 -5
  899. package/ccw/dist/tools/core-memory.js.map +1 -1
  900. package/ccw/dist/tools/edit-file.d.ts.map +1 -1
  901. package/ccw/dist/tools/edit-file.js +69 -31
  902. package/ccw/dist/tools/edit-file.js.map +1 -1
  903. package/ccw/dist/tools/generate-module-docs.d.ts.map +1 -1
  904. package/ccw/dist/tools/generate-module-docs.js +9 -14
  905. package/ccw/dist/tools/generate-module-docs.js.map +1 -1
  906. package/ccw/dist/tools/index.d.ts.map +1 -1
  907. package/ccw/dist/tools/index.js +8 -2
  908. package/ccw/dist/tools/index.js.map +1 -1
  909. package/ccw/dist/tools/native-session-discovery.d.ts +19 -2
  910. package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
  911. package/ccw/dist/tools/native-session-discovery.js +191 -20
  912. package/ccw/dist/tools/native-session-discovery.js.map +1 -1
  913. package/ccw/dist/tools/opencode-session-parser.d.ts +120 -0
  914. package/ccw/dist/tools/opencode-session-parser.d.ts.map +1 -0
  915. package/ccw/dist/tools/opencode-session-parser.js +330 -0
  916. package/ccw/dist/tools/opencode-session-parser.js.map +1 -0
  917. package/ccw/dist/tools/read-file.d.ts +5 -24
  918. package/ccw/dist/tools/read-file.d.ts.map +1 -1
  919. package/ccw/dist/tools/read-file.js +44 -282
  920. package/ccw/dist/tools/read-file.js.map +1 -1
  921. package/ccw/dist/tools/read-many-files.d.ts +15 -0
  922. package/ccw/dist/tools/read-many-files.d.ts.map +1 -0
  923. package/ccw/dist/tools/read-many-files.js +166 -0
  924. package/ccw/dist/tools/read-many-files.js.map +1 -0
  925. package/ccw/dist/tools/read-outline.d.ts +13 -0
  926. package/ccw/dist/tools/read-outline.d.ts.map +1 -0
  927. package/ccw/dist/tools/read-outline.js +86 -0
  928. package/ccw/dist/tools/read-outline.js.map +1 -0
  929. package/ccw/dist/tools/resume-strategy.d.ts.map +1 -1
  930. package/ccw/dist/tools/resume-strategy.js +16 -0
  931. package/ccw/dist/tools/resume-strategy.js.map +1 -1
  932. package/ccw/dist/tools/session-content-parser.d.ts +3 -3
  933. package/ccw/dist/tools/session-content-parser.d.ts.map +1 -1
  934. package/ccw/dist/tools/session-content-parser.js +40 -10
  935. package/ccw/dist/tools/session-content-parser.js.map +1 -1
  936. package/ccw/dist/tools/spec-index-builder.d.ts +140 -0
  937. package/ccw/dist/tools/spec-index-builder.d.ts.map +1 -0
  938. package/ccw/dist/tools/spec-index-builder.js +340 -0
  939. package/ccw/dist/tools/spec-index-builder.js.map +1 -0
  940. package/ccw/dist/tools/spec-init.d.ts +46 -0
  941. package/ccw/dist/tools/spec-init.d.ts.map +1 -0
  942. package/ccw/dist/tools/spec-init.js +226 -0
  943. package/ccw/dist/tools/spec-init.js.map +1 -0
  944. package/ccw/dist/tools/spec-keyword-extractor.d.ts +52 -0
  945. package/ccw/dist/tools/spec-keyword-extractor.d.ts.map +1 -0
  946. package/ccw/dist/tools/spec-keyword-extractor.js +183 -0
  947. package/ccw/dist/tools/spec-keyword-extractor.js.map +1 -0
  948. package/ccw/dist/tools/spec-loader.d.ts +119 -0
  949. package/ccw/dist/tools/spec-loader.d.ts.map +1 -0
  950. package/ccw/dist/tools/spec-loader.js +326 -0
  951. package/ccw/dist/tools/spec-loader.js.map +1 -0
  952. package/ccw/dist/tools/team-msg.d.ts +61 -0
  953. package/ccw/dist/tools/team-msg.d.ts.map +1 -0
  954. package/ccw/dist/tools/team-msg.js +331 -0
  955. package/ccw/dist/tools/team-msg.js.map +1 -0
  956. package/ccw/dist/tools/template-discovery.d.ts +1 -1
  957. package/ccw/dist/tools/template-discovery.js +2 -2
  958. package/ccw/dist/tools/template-discovery.js.map +1 -1
  959. package/ccw/dist/tools/ui-generate-preview.js +7 -7
  960. package/ccw/dist/tools/ui-generate-preview.js.map +1 -1
  961. package/ccw/dist/tools/update-module-claude.d.ts.map +1 -1
  962. package/ccw/dist/tools/update-module-claude.js +18 -32
  963. package/ccw/dist/tools/update-module-claude.js.map +1 -1
  964. package/ccw/dist/types/cli-settings.d.ts +139 -9
  965. package/ccw/dist/types/cli-settings.d.ts.map +1 -1
  966. package/ccw/dist/types/cli-settings.js +67 -13
  967. package/ccw/dist/types/cli-settings.js.map +1 -1
  968. package/ccw/dist/types/queue-types.d.ts +156 -0
  969. package/ccw/dist/types/queue-types.d.ts.map +1 -0
  970. package/ccw/dist/types/queue-types.js +6 -0
  971. package/ccw/dist/types/queue-types.js.map +1 -0
  972. package/ccw/dist/types/remote-notification.d.ts +209 -0
  973. package/ccw/dist/types/remote-notification.d.ts.map +1 -0
  974. package/ccw/dist/types/remote-notification.js +86 -0
  975. package/ccw/dist/types/remote-notification.js.map +1 -0
  976. package/ccw/dist/types/util.d.ts +28 -0
  977. package/ccw/dist/types/util.d.ts.map +1 -0
  978. package/ccw/dist/types/util.js +35 -0
  979. package/ccw/dist/types/util.js.map +1 -0
  980. package/ccw/dist/utils/dashboard-launcher.d.ts +36 -0
  981. package/ccw/dist/utils/dashboard-launcher.d.ts.map +1 -0
  982. package/ccw/dist/utils/dashboard-launcher.js +166 -0
  983. package/ccw/dist/utils/dashboard-launcher.js.map +1 -0
  984. package/ccw/dist/utils/db-loader.d.ts +15 -0
  985. package/ccw/dist/utils/db-loader.d.ts.map +1 -0
  986. package/ccw/dist/utils/db-loader.js +51 -0
  987. package/ccw/dist/utils/db-loader.js.map +1 -0
  988. package/ccw/dist/utils/file-reader.d.ts +73 -0
  989. package/ccw/dist/utils/file-reader.d.ts.map +1 -0
  990. package/ccw/dist/utils/file-reader.js +201 -0
  991. package/ccw/dist/utils/file-reader.js.map +1 -0
  992. package/ccw/dist/utils/outline-parser.d.ts +28 -0
  993. package/ccw/dist/utils/outline-parser.d.ts.map +1 -0
  994. package/ccw/dist/utils/outline-parser.js +273 -0
  995. package/ccw/dist/utils/outline-parser.js.map +1 -0
  996. package/ccw/dist/utils/outline-queries.d.ts +15 -0
  997. package/ccw/dist/utils/outline-queries.d.ts.map +1 -0
  998. package/ccw/dist/utils/outline-queries.js +141 -0
  999. package/ccw/dist/utils/outline-queries.js.map +1 -0
  1000. package/ccw/dist/utils/package-discovery.d.ts +69 -0
  1001. package/ccw/dist/utils/package-discovery.d.ts.map +1 -0
  1002. package/ccw/dist/utils/package-discovery.js +258 -0
  1003. package/ccw/dist/utils/package-discovery.js.map +1 -0
  1004. package/ccw/dist/utils/path-validator.d.ts +3 -3
  1005. package/ccw/dist/utils/path-validator.d.ts.map +1 -1
  1006. package/ccw/dist/utils/path-validator.js +12 -12
  1007. package/ccw/dist/utils/path-validator.js.map +1 -1
  1008. package/ccw/dist/utils/react-frontend.d.ts +19 -0
  1009. package/ccw/dist/utils/react-frontend.d.ts.map +1 -0
  1010. package/ccw/dist/utils/react-frontend.js +203 -0
  1011. package/ccw/dist/utils/react-frontend.js.map +1 -0
  1012. package/ccw/dist/utils/secret-redactor.d.ts +23 -0
  1013. package/ccw/dist/utils/secret-redactor.d.ts.map +1 -0
  1014. package/ccw/dist/utils/secret-redactor.js +48 -0
  1015. package/ccw/dist/utils/secret-redactor.js.map +1 -0
  1016. package/ccw/dist/utils/security-validation.d.ts +48 -0
  1017. package/ccw/dist/utils/security-validation.d.ts.map +1 -0
  1018. package/ccw/dist/utils/security-validation.js +117 -0
  1019. package/ccw/dist/utils/security-validation.js.map +1 -0
  1020. package/ccw/dist/utils/uv-manager.d.ts +3 -2
  1021. package/ccw/dist/utils/uv-manager.d.ts.map +1 -1
  1022. package/ccw/dist/utils/uv-manager.js +7 -4
  1023. package/ccw/dist/utils/uv-manager.js.map +1 -1
  1024. package/ccw/scripts/prepublish-clean.mjs +32 -0
  1025. package/ccw/scripts/unified_memory_embedder.py +473 -0
  1026. package/codex-lens/pyproject.toml +37 -46
  1027. package/codex-lens/src/codexlens/api/__init__.py +5 -0
  1028. package/codex-lens/src/codexlens/api/lsp_lifecycle.py +124 -0
  1029. package/codex-lens/src/codexlens/api/semantic.py +33 -22
  1030. package/codex-lens/src/codexlens/cli/commands.py +392 -552
  1031. package/codex-lens/src/codexlens/cli/embedding_manager.py +558 -367
  1032. package/codex-lens/src/codexlens/config.py +525 -129
  1033. package/codex-lens/src/codexlens/env_config.py +21 -1
  1034. package/codex-lens/src/codexlens/lsp/keepalive_bridge.py +135 -0
  1035. package/codex-lens/src/codexlens/lsp/lsp_bridge.py +33 -10
  1036. package/codex-lens/src/codexlens/lsp/lsp_graph_builder.py +12 -4
  1037. package/codex-lens/src/codexlens/lsp/standalone_manager.py +114 -21
  1038. package/codex-lens/src/codexlens/parsers/__init__.py +8 -2
  1039. package/codex-lens/src/codexlens/parsers/astgrep_binding.py +320 -0
  1040. package/codex-lens/src/codexlens/parsers/astgrep_js_ts_processor.py +306 -0
  1041. package/codex-lens/src/codexlens/parsers/astgrep_processor.py +1033 -0
  1042. package/codex-lens/src/codexlens/parsers/factory.py +10 -2
  1043. package/codex-lens/src/codexlens/parsers/patterns/__init__.py +5 -0
  1044. package/codex-lens/src/codexlens/parsers/patterns/javascript/__init__.py +92 -0
  1045. package/codex-lens/src/codexlens/parsers/patterns/python/__init__.py +204 -0
  1046. package/codex-lens/src/codexlens/parsers/patterns/python/call.yaml +87 -0
  1047. package/codex-lens/src/codexlens/parsers/patterns/python/imports.yaml +82 -0
  1048. package/codex-lens/src/codexlens/parsers/patterns/python/inherits.yaml +42 -0
  1049. package/codex-lens/src/codexlens/parsers/patterns/typescript/__init__.py +73 -0
  1050. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +135 -9
  1051. package/codex-lens/src/codexlens/search/__init__.py +2 -0
  1052. package/codex-lens/src/codexlens/search/binary_searcher.py +67 -35
  1053. package/codex-lens/src/codexlens/search/chain_search.py +825 -251
  1054. package/codex-lens/src/codexlens/search/clustering/hdbscan_strategy.py +24 -2
  1055. package/codex-lens/src/codexlens/search/global_graph_expander.py +250 -0
  1056. package/codex-lens/src/codexlens/search/hybrid_search.py +11 -203
  1057. package/codex-lens/src/codexlens/search/ranking.py +8 -35
  1058. package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +41 -2
  1059. package/codex-lens/src/codexlens/storage/global_index.py +225 -5
  1060. package/codex-lens/src/codexlens/storage/index_tree.py +46 -0
  1061. package/codex-lens/src/codexlens/storage/path_mapper.py +8 -8
  1062. package/codex-lens/src/codexlens/watcher/incremental_indexer.py +55 -1
  1063. package/package.json +102 -92
  1064. package/.claude/CLAUDE.md +0 -44
  1065. package/.claude/commands/ccw-debug.md +0 -832
  1066. package/.claude/commands/codex-coordinator.md +0 -513
  1067. package/.claude/commands/memory/compact.md +0 -383
  1068. package/.claude/commands/memory/docs-full-cli.md +0 -471
  1069. package/.claude/commands/memory/docs-related-cli.md +0 -386
  1070. package/.claude/commands/memory/load.md +0 -240
  1071. package/.claude/commands/memory/tips.md +0 -332
  1072. package/.claude/commands/memory/update-full.md +0 -332
  1073. package/.claude/commands/memory/update-related.md +0 -332
  1074. package/.claude/commands/view.md +0 -367
  1075. package/.claude/commands/workflow/brainstorm/artifacts.md +0 -457
  1076. package/.claude/commands/workflow/brainstorm/auto-parallel.md +0 -433
  1077. package/.claude/commands/workflow/brainstorm/role-analysis.md +0 -705
  1078. package/.claude/commands/workflow/brainstorm/synthesis.md +0 -402
  1079. package/.claude/commands/workflow/execute.md +0 -548
  1080. package/.claude/commands/workflow/lite-execute.md +0 -743
  1081. package/.claude/commands/workflow/lite-fix.md +0 -809
  1082. package/.claude/commands/workflow/lite-lite-lite.md +0 -465
  1083. package/.claude/commands/workflow/lite-plan.md +0 -698
  1084. package/.claude/commands/workflow/multi-cli-plan.md +0 -572
  1085. package/.claude/commands/workflow/plan-verify.md +0 -362
  1086. package/.claude/commands/workflow/plan.md +0 -691
  1087. package/.claude/commands/workflow/replan.md +0 -648
  1088. package/.claude/commands/workflow/review-cycle-fix.md +0 -608
  1089. package/.claude/commands/workflow/review-module-cycle.md +0 -771
  1090. package/.claude/commands/workflow/review-session-cycle.md +0 -782
  1091. package/.claude/commands/workflow/review.md +0 -322
  1092. package/.claude/commands/workflow/tdd-plan.md +0 -630
  1093. package/.claude/commands/workflow/tdd-verify.md +0 -585
  1094. package/.claude/commands/workflow/test-cycle-execute.md +0 -504
  1095. package/.claude/commands/workflow/test-fix-gen.md +0 -699
  1096. package/.claude/commands/workflow/test-gen.md +0 -529
  1097. package/.claude/commands/workflow/tools/conflict-resolution.md +0 -604
  1098. package/.claude/commands/workflow/tools/context-gather.md +0 -404
  1099. package/.claude/commands/workflow/tools/task-generate-agent.md +0 -667
  1100. package/.claude/commands/workflow/tools/task-generate-tdd.md +0 -749
  1101. package/.claude/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  1102. package/.claude/commands/workflow/tools/test-concept-enhanced.md +0 -164
  1103. package/.claude/commands/workflow/tools/test-context-gather.md +0 -235
  1104. package/.claude/commands/workflow/tools/test-task-generate.md +0 -255
  1105. package/.claude/skills/ccw-loop/SKILL.md +0 -259
  1106. package/.claude/skills/ccw-loop/phases/actions/action-complete.md +0 -320
  1107. package/.claude/skills/ccw-loop/phases/actions/action-debug-with-file.md +0 -485
  1108. package/.claude/skills/ccw-loop/phases/actions/action-develop-with-file.md +0 -365
  1109. package/.claude/skills/ccw-loop/phases/actions/action-init.md +0 -200
  1110. package/.claude/skills/ccw-loop/phases/actions/action-menu.md +0 -192
  1111. package/.claude/skills/ccw-loop/phases/actions/action-validate-with-file.md +0 -307
  1112. package/.claude/skills/ccw-loop/phases/orchestrator.md +0 -486
  1113. package/.claude/skills/ccw-loop/phases/state-schema.md +0 -474
  1114. package/.claude/skills/ccw-loop/specs/action-catalog.md +0 -300
  1115. package/.claude/skills/ccw-loop/specs/loop-requirements.md +0 -192
  1116. package/.claude/skills/ccw-loop/templates/progress-template.md +0 -175
  1117. package/.claude/skills/ccw-loop/templates/understanding-template.md +0 -303
  1118. package/.claude/skills/ccw-loop/templates/validation-template.md +0 -258
  1119. package/.claude/skills/copyright-docs/SKILL.md +0 -132
  1120. package/.claude/skills/copyright-docs/phases/01-metadata-collection.md +0 -78
  1121. package/.claude/skills/copyright-docs/phases/01.5-project-exploration.md +0 -150
  1122. package/.claude/skills/copyright-docs/phases/02-deep-analysis.md +0 -664
  1123. package/.claude/skills/copyright-docs/phases/02.5-consolidation.md +0 -192
  1124. package/.claude/skills/copyright-docs/phases/04-document-assembly.md +0 -261
  1125. package/.claude/skills/copyright-docs/phases/05-compliance-refinement.md +0 -192
  1126. package/.claude/skills/copyright-docs/specs/cpcc-requirements.md +0 -121
  1127. package/.claude/skills/copyright-docs/templates/agent-base.md +0 -200
  1128. package/.claude/skills/lite-skill-generator/SKILL.md +0 -650
  1129. package/.claude/skills/lite-skill-generator/templates/simple-skill.md +0 -68
  1130. package/.claude/skills/lite-skill-generator/templates/style-guide.md +0 -64
  1131. package/.claude/skills/project-analyze/SKILL.md +0 -162
  1132. package/.claude/skills/project-analyze/phases/01-requirements-discovery.md +0 -79
  1133. package/.claude/skills/project-analyze/phases/02-project-exploration.md +0 -176
  1134. package/.claude/skills/project-analyze/phases/03-deep-analysis.md +0 -854
  1135. package/.claude/skills/project-analyze/phases/03.5-consolidation.md +0 -233
  1136. package/.claude/skills/project-analyze/phases/04-report-generation.md +0 -217
  1137. package/.claude/skills/project-analyze/phases/05-iterative-refinement.md +0 -124
  1138. package/.claude/skills/project-analyze/specs/quality-standards.md +0 -115
  1139. package/.claude/skills/project-analyze/specs/writing-style.md +0 -152
  1140. package/.claude/skills/prompt-enhancer/SKILL.md +0 -124
  1141. package/.claude/skills/software-manual/SKILL.md +0 -184
  1142. package/.claude/skills/software-manual/phases/01-requirements-discovery.md +0 -162
  1143. package/.claude/skills/software-manual/phases/02-project-exploration.md +0 -101
  1144. package/.claude/skills/software-manual/phases/02.5-api-extraction.md +0 -161
  1145. package/.claude/skills/software-manual/phases/03-parallel-analysis.md +0 -183
  1146. package/.claude/skills/software-manual/phases/03.5-consolidation.md +0 -82
  1147. package/.claude/skills/software-manual/phases/04-screenshot-capture.md +0 -89
  1148. package/.claude/skills/software-manual/phases/05-html-assembly.md +0 -132
  1149. package/.claude/skills/software-manual/phases/06-iterative-refinement.md +0 -259
  1150. package/.claude/skills/software-manual/scripts/api-extractor.md +0 -245
  1151. package/.claude/skills/software-manual/scripts/assemble_docsify.py +0 -584
  1152. package/.claude/skills/software-manual/scripts/bundle-libraries.md +0 -85
  1153. package/.claude/skills/software-manual/scripts/extract_apis.py +0 -270
  1154. package/.claude/skills/software-manual/scripts/screenshot-helper.md +0 -447
  1155. package/.claude/skills/software-manual/scripts/swagger-runner.md +0 -419
  1156. package/.claude/skills/software-manual/scripts/typedoc-runner.md +0 -357
  1157. package/.claude/skills/software-manual/specs/html-template.md +0 -325
  1158. package/.claude/skills/software-manual/specs/quality-standards.md +0 -253
  1159. package/.claude/skills/software-manual/specs/writing-style.md +0 -298
  1160. package/.claude/skills/software-manual/templates/css/docsify-base.css +0 -984
  1161. package/.claude/skills/software-manual/templates/css/wiki-base.css +0 -788
  1162. package/.claude/skills/software-manual/templates/css/wiki-dark.css +0 -278
  1163. package/.claude/skills/software-manual/templates/docsify-shell.html +0 -466
  1164. package/.claude/skills/software-manual/templates/tiddlywiki-shell.html +0 -327
  1165. package/.claude/skills/text-formatter/SKILL.md +0 -196
  1166. package/.claude/skills/text-formatter/phases/01-input-collection.md +0 -111
  1167. package/.claude/skills/text-formatter/phases/02-content-analysis.md +0 -248
  1168. package/.claude/skills/text-formatter/phases/03-format-transform.md +0 -245
  1169. package/.claude/skills/text-formatter/phases/04-output-preview.md +0 -183
  1170. package/.claude/skills/text-formatter/specs/callout-types.md +0 -293
  1171. package/.claude/skills/text-formatter/specs/element-mapping.md +0 -226
  1172. package/.claude/skills/text-formatter/specs/format-rules.md +0 -273
  1173. package/.claude/skills/text-formatter/templates/bbcode-template.md +0 -350
  1174. package/.claude/workflows/_template-compare-matrix.html +0 -692
  1175. package/.claude/workflows/chinese-response.md +0 -25
  1176. package/.claude/workflows/cli-templates/fix-plan-template.json +0 -75
  1177. package/.claude/workflows/cli-templates/fix-progress-template.json +0 -48
  1178. package/.claude/workflows/cli-templates/memory/style-skill-memory/skill-md-template.md +0 -299
  1179. package/.claude/workflows/cli-templates/planning-roles/data-architect.md +0 -120
  1180. package/.claude/workflows/cli-templates/planning-roles/product-manager.md +0 -119
  1181. package/.claude/workflows/cli-templates/planning-roles/product-owner.md +0 -261
  1182. package/.claude/workflows/cli-templates/planning-roles/scrum-master.md +0 -186
  1183. package/.claude/workflows/cli-templates/planning-roles/subject-matter-expert.md +0 -281
  1184. package/.claude/workflows/cli-templates/planning-roles/synthesis-role.md +0 -414
  1185. package/.claude/workflows/cli-templates/planning-roles/system-architect.md +0 -106
  1186. package/.claude/workflows/cli-templates/planning-roles/test-strategist.md +0 -124
  1187. package/.claude/workflows/cli-templates/planning-roles/ui-designer.md +0 -379
  1188. package/.claude/workflows/cli-templates/planning-roles/ux-expert.md +0 -240
  1189. package/.claude/workflows/cli-templates/prompts/analysis-analyze-code-patterns.txt +0 -37
  1190. package/.claude/workflows/cli-templates/prompts/analysis-analyze-performance.txt +0 -29
  1191. package/.claude/workflows/cli-templates/prompts/analysis-analyze-technical-document.txt +0 -33
  1192. package/.claude/workflows/cli-templates/prompts/analysis-assess-security-risks.txt +0 -29
  1193. package/.claude/workflows/cli-templates/prompts/analysis-diagnose-bug-root-cause.txt +0 -127
  1194. package/.claude/workflows/cli-templates/prompts/analysis-review-architecture.txt +0 -29
  1195. package/.claude/workflows/cli-templates/prompts/analysis-review-code-quality.txt +0 -28
  1196. package/.claude/workflows/cli-templates/prompts/analysis-review-quality-standards.txt +0 -29
  1197. package/.claude/workflows/cli-templates/prompts/analysis-trace-code-execution.txt +0 -115
  1198. package/.claude/workflows/cli-templates/prompts/development-debug-runtime-issues.txt +0 -55
  1199. package/.claude/workflows/cli-templates/prompts/development-generate-tests.txt +0 -70
  1200. package/.claude/workflows/cli-templates/prompts/development-implement-component-ui.txt +0 -55
  1201. package/.claude/workflows/cli-templates/prompts/development-implement-feature.txt +0 -58
  1202. package/.claude/workflows/cli-templates/prompts/development-refactor-codebase.txt +0 -55
  1203. package/.claude/workflows/cli-templates/prompts/documentation-api.txt +0 -15
  1204. package/.claude/workflows/cli-templates/prompts/documentation-folder-navigation.txt +0 -27
  1205. package/.claude/workflows/cli-templates/prompts/documentation-module-readme.txt +0 -49
  1206. package/.claude/workflows/cli-templates/prompts/documentation-project-architecture.txt +0 -41
  1207. package/.claude/workflows/cli-templates/prompts/documentation-project-examples.txt +0 -35
  1208. package/.claude/workflows/cli-templates/prompts/documentation-project-readme.txt +0 -35
  1209. package/.claude/workflows/cli-templates/prompts/documentation-swagger-api.txt +0 -266
  1210. package/.claude/workflows/cli-templates/prompts/memory-document-module-structure.txt +0 -165
  1211. package/.claude/workflows/cli-templates/prompts/planning-breakdown-task-steps.txt +0 -30
  1212. package/.claude/workflows/cli-templates/prompts/planning-design-component-spec.txt +0 -28
  1213. package/.claude/workflows/cli-templates/prompts/planning-evaluate-concept-feasibility.txt +0 -127
  1214. package/.claude/workflows/cli-templates/prompts/planning-plan-architecture-design.txt +0 -109
  1215. package/.claude/workflows/cli-templates/prompts/planning-plan-migration-strategy.txt +0 -30
  1216. package/.claude/workflows/cli-templates/prompts/rules-rule-api.txt +0 -122
  1217. package/.claude/workflows/cli-templates/prompts/rules-rule-components.txt +0 -122
  1218. package/.claude/workflows/cli-templates/prompts/rules-rule-config.txt +0 -89
  1219. package/.claude/workflows/cli-templates/prompts/rules-rule-core.txt +0 -60
  1220. package/.claude/workflows/cli-templates/prompts/rules-rule-patterns.txt +0 -70
  1221. package/.claude/workflows/cli-templates/prompts/rules-rule-testing.txt +0 -81
  1222. package/.claude/workflows/cli-templates/prompts/rules-tech-rules-agent-prompt.txt +0 -89
  1223. package/.claude/workflows/cli-templates/prompts/tech-tech-module-format.txt +0 -359
  1224. package/.claude/workflows/cli-templates/prompts/tech-tech-skill-index.txt +0 -185
  1225. package/.claude/workflows/cli-templates/prompts/test-test-concept-analysis.txt +0 -179
  1226. package/.claude/workflows/cli-templates/prompts/universal-universal-creative-style.txt +0 -95
  1227. package/.claude/workflows/cli-templates/prompts/universal-universal-rigorous-style.txt +0 -92
  1228. package/.claude/workflows/cli-templates/prompts/verification-codex-technical.txt +0 -28
  1229. package/.claude/workflows/cli-templates/prompts/verification-cross-validation.txt +0 -28
  1230. package/.claude/workflows/cli-templates/prompts/verification-gemini-strategic.txt +0 -27
  1231. package/.claude/workflows/cli-templates/prompts/workflow-analysis-results-structure.txt +0 -224
  1232. package/.claude/workflows/cli-templates/prompts/workflow-codex-feasibility-validation.txt +0 -176
  1233. package/.claude/workflows/cli-templates/prompts/workflow-gemini-solution-design.txt +0 -131
  1234. package/.claude/workflows/cli-templates/prompts/workflow-impl-plan-template.txt +0 -286
  1235. package/.claude/workflows/cli-templates/prompts/workflow-skill-aggregation.txt +0 -172
  1236. package/.claude/workflows/cli-templates/prompts/workflow-skill-conflict-patterns.txt +0 -94
  1237. package/.claude/workflows/cli-templates/prompts/workflow-skill-index.txt +0 -224
  1238. package/.claude/workflows/cli-templates/prompts/workflow-skill-lessons-learned.txt +0 -94
  1239. package/.claude/workflows/cli-templates/prompts/workflow-skill-sessions-timeline.txt +0 -53
  1240. package/.claude/workflows/cli-templates/prompts/workflow-task-json-agent-mode.txt +0 -123
  1241. package/.claude/workflows/cli-templates/prompts/workflow-task-json-cli-mode.txt +0 -182
  1242. package/.claude/workflows/cli-templates/protocols/analysis-protocol.md +0 -119
  1243. package/.claude/workflows/cli-templates/protocols/write-protocol.md +0 -136
  1244. package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +0 -151
  1245. package/.claude/workflows/cli-templates/schemas/debug-log-json-schema.json +0 -127
  1246. package/.claude/workflows/cli-templates/schemas/diagnosis-json-schema.json +0 -234
  1247. package/.claude/workflows/cli-templates/schemas/discovery-finding-schema.json +0 -219
  1248. package/.claude/workflows/cli-templates/schemas/discovery-state-schema.json +0 -125
  1249. package/.claude/workflows/cli-templates/schemas/explore-json-schema.json +0 -124
  1250. package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +0 -298
  1251. package/.claude/workflows/cli-templates/schemas/issues-jsonl-schema.json +0 -170
  1252. package/.claude/workflows/cli-templates/schemas/multi-cli-discussion-schema.json +0 -421
  1253. package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +0 -444
  1254. package/.claude/workflows/cli-templates/schemas/plan-verify-agent-schema.json +0 -47
  1255. package/.claude/workflows/cli-templates/schemas/project-guidelines-schema.json +0 -141
  1256. package/.claude/workflows/cli-templates/schemas/project-tech-schema.json +0 -221
  1257. package/.claude/workflows/cli-templates/schemas/queue-schema.json +0 -248
  1258. package/.claude/workflows/cli-templates/schemas/registry-schema.json +0 -94
  1259. package/.claude/workflows/cli-templates/schemas/review-deep-dive-results-schema.json +0 -82
  1260. package/.claude/workflows/cli-templates/schemas/review-dimension-results-schema.json +0 -51
  1261. package/.claude/workflows/cli-templates/schemas/solution-schema.json +0 -166
  1262. package/.claude/workflows/cli-templates/schemas/verify-json-schema.json +0 -158
  1263. package/.claude/workflows/cli-templates/tech-stacks/go-dev.md +0 -91
  1264. package/.claude/workflows/cli-templates/tech-stacks/java-dev.md +0 -107
  1265. package/.claude/workflows/cli-templates/tech-stacks/javascript-dev.md +0 -58
  1266. package/.claude/workflows/cli-templates/tech-stacks/python-dev.md +0 -79
  1267. package/.claude/workflows/cli-templates/tech-stacks/react-dev.md +0 -103
  1268. package/.claude/workflows/cli-templates/tech-stacks/typescript-dev.md +0 -83
  1269. package/.claude/workflows/cli-templates/ui-design/systems/animation-tokens.json +0 -247
  1270. package/.claude/workflows/cli-templates/ui-design/systems/design-tokens.json +0 -342
  1271. package/.claude/workflows/cli-templates/ui-design/systems/layout-templates.json +0 -145
  1272. package/.claude/workflows/cli-tools-usage.md +0 -538
  1273. package/.claude/workflows/coding-philosophy.md +0 -70
  1274. package/.claude/workflows/context-tools.md +0 -76
  1275. package/.claude/workflows/file-modification.md +0 -64
  1276. package/.claude/workflows/review-directory-specification.md +0 -336
  1277. package/.claude/workflows/task-core.md +0 -214
  1278. package/.claude/workflows/tool-strategy.md +0 -216
  1279. package/.claude/workflows/windows-platform.md +0 -19
  1280. package/.claude/workflows/workflow-architecture.md +0 -942
  1281. package/.codex/agents/ccw-loop-b-complete.md +0 -227
  1282. package/.codex/agents/ccw-loop-b-debug.md +0 -172
  1283. package/.codex/agents/ccw-loop-b-develop.md +0 -147
  1284. package/.codex/agents/ccw-loop-b-init.md +0 -82
  1285. package/.codex/agents/ccw-loop-b-validate.md +0 -204
  1286. package/.codex/agents/ccw-loop-executor.md +0 -260
  1287. package/.codex/prompts/analyze-with-file.md +0 -610
  1288. package/.codex/prompts/brainstorm-to-cycle.md +0 -456
  1289. package/.codex/prompts/brainstorm-with-file.md +0 -1004
  1290. package/.codex/prompts/clean.md +0 -414
  1291. package/.codex/prompts/compact.md +0 -380
  1292. package/.codex/prompts/debug-with-file.md +0 -608
  1293. package/.codex/prompts/execute.md +0 -277
  1294. package/.codex/prompts/issue-discover-by-prompt.md +0 -364
  1295. package/.codex/prompts/issue-discover.md +0 -261
  1296. package/.codex/prompts/issue-execute.md +0 -768
  1297. package/.codex/prompts/issue-new.md +0 -390
  1298. package/.codex/prompts/issue-plan.md +0 -246
  1299. package/.codex/prompts/issue-queue.md +0 -298
  1300. package/.codex/prompts/lite-execute.md +0 -684
  1301. package/.codex/prompts/lite-fix.md +0 -674
  1302. package/.codex/prompts/lite-plan-a.md +0 -341
  1303. package/.codex/prompts/lite-plan-b.md +0 -489
  1304. package/.codex/prompts/lite-plan-c.md +0 -605
  1305. package/.codex/prompts/merge-plans-with-file.md +0 -530
  1306. package/.codex/prompts/unified-execute-with-file.md +0 -722
  1307. package/.codex/skills/ccw-loop/README.md +0 -171
  1308. package/.codex/skills/ccw-loop/SKILL.md +0 -350
  1309. package/.codex/skills/ccw-loop/phases/actions/action-complete.md +0 -269
  1310. package/.codex/skills/ccw-loop/phases/actions/action-debug.md +0 -286
  1311. package/.codex/skills/ccw-loop/phases/actions/action-develop.md +0 -183
  1312. package/.codex/skills/ccw-loop/phases/actions/action-init.md +0 -164
  1313. package/.codex/skills/ccw-loop/phases/actions/action-menu.md +0 -205
  1314. package/.codex/skills/ccw-loop/phases/actions/action-validate.md +0 -250
  1315. package/.codex/skills/ccw-loop/phases/orchestrator.md +0 -416
  1316. package/.codex/skills/ccw-loop/phases/state-schema.md +0 -388
  1317. package/.codex/skills/ccw-loop/specs/action-catalog.md +0 -182
  1318. package/.codex/skills/ccw-loop-b/README.md +0 -301
  1319. package/.codex/skills/ccw-loop-b/SKILL.md +0 -323
  1320. package/.codex/skills/ccw-loop-b/phases/orchestrator.md +0 -257
  1321. package/.codex/skills/ccw-loop-b/phases/state-schema.md +0 -181
  1322. package/.codex/skills/ccw-loop-b/specs/action-catalog.md +0 -383
  1323. package/.codex/skills/codex-issue-plan-execute/SKILL.md +0 -214
  1324. package/.codex/skills/codex-issue-plan-execute/phases/actions/action-complete.md +0 -173
  1325. package/.codex/skills/codex-issue-plan-execute/phases/actions/action-execute.md +0 -220
  1326. package/.codex/skills/codex-issue-plan-execute/phases/actions/action-init.md +0 -86
  1327. package/.codex/skills/codex-issue-plan-execute/phases/actions/action-list.md +0 -165
  1328. package/.codex/skills/codex-issue-plan-execute/phases/actions/action-plan.md +0 -170
  1329. package/.codex/skills/codex-issue-plan-execute/phases/orchestrator.md +0 -212
  1330. package/.codex/skills/codex-issue-plan-execute/phases/state-schema.md +0 -136
  1331. package/.codex/skills/codex-issue-plan-execute/prompts/execution-agent-system.md +0 -32
  1332. package/.codex/skills/codex-issue-plan-execute/prompts/execution-agent.md +0 -323
  1333. package/.codex/skills/codex-issue-plan-execute/prompts/planning-agent-system.md +0 -32
  1334. package/.codex/skills/codex-issue-plan-execute/prompts/planning-agent.md +0 -224
  1335. package/.codex/skills/codex-issue-plan-execute/specs/agent-roles.md +0 -468
  1336. package/.codex/skills/codex-issue-plan-execute/specs/issue-handling.md +0 -187
  1337. package/.codex/skills/codex-issue-plan-execute/specs/quality-standards.md +0 -231
  1338. package/.codex/skills/codex-issue-plan-execute/specs/solution-schema.md +0 -270
  1339. package/.codex/skills/codex-issue-plan-execute/specs/subagent-roles.md +0 -32
  1340. package/.codex/skills/parallel-dev-cycle/README.md +0 -385
  1341. package/.codex/skills/parallel-dev-cycle/phases/agents/code-developer.md +0 -327
  1342. package/.codex/skills/parallel-dev-cycle/phases/agents/exploration-planner.md +0 -285
  1343. package/.codex/skills/parallel-dev-cycle/phases/agents/requirements-analyst.md +0 -370
  1344. package/.codex/skills/parallel-dev-cycle/phases/agents/validation-archivist.md +0 -381
  1345. package/.codex/skills/parallel-dev-cycle/phases/orchestrator.md +0 -696
  1346. package/.codex/skills/parallel-dev-cycle/phases/state-schema.md +0 -436
  1347. package/.codex/skills/parallel-dev-cycle/skill.md +0 -194
  1348. package/.codex/skills/parallel-dev-cycle/specs/communication-optimization.md +0 -423
  1349. package/.codex/skills/parallel-dev-cycle/specs/coordination-protocol.md +0 -406
  1350. package/.codex/skills/parallel-dev-cycle/specs/versioning-strategy.md +0 -331
  1351. package/ccw/dist/core/dashboard-generator-patch.d.ts +0 -2
  1352. package/ccw/dist/core/dashboard-generator-patch.d.ts.map +0 -1
  1353. package/ccw/dist/core/dashboard-generator-patch.js +0 -48
  1354. package/ccw/dist/core/dashboard-generator-patch.js.map +0 -1
  1355. package/ccw/dist/core/dashboard-generator.d.ts +0 -8
  1356. package/ccw/dist/core/dashboard-generator.d.ts.map +0 -1
  1357. package/ccw/dist/core/dashboard-generator.js +0 -706
  1358. package/ccw/dist/core/dashboard-generator.js.map +0 -1
  1359. package/ccw/dist/core/routes/model-routes.d.ts +0 -11
  1360. package/ccw/dist/core/routes/model-routes.d.ts.map +0 -1
  1361. package/ccw/dist/core/routes/model-routes.js +0 -112
  1362. package/ccw/dist/core/routes/model-routes.js.map +0 -1
  1363. package/ccw/dist/tools/command-registry.test.d.ts +0 -14
  1364. package/ccw/dist/tools/command-registry.test.d.ts.map +0 -1
  1365. package/ccw/dist/tools/command-registry.test.js.map +0 -1
  1366. package/ccw/scripts/__pycache__/memory_embedder.cpython-313.pyc +0 -0
  1367. package/ccw/scripts/__pycache__/test_memory_embedder.cpython-313-pytest-8.4.2.pyc +0 -0
  1368. package/ccw/src/.workflow/.cli-history/history.db +0 -0
  1369. package/ccw/src/.workflow/.cli-history/history.db-shm +0 -0
  1370. package/ccw/src/.workflow/.cli-history/history.db-wal +0 -0
  1371. package/ccw/src/cli.ts +0 -326
  1372. package/ccw/src/commands/cli.ts +0 -1492
  1373. package/ccw/src/commands/core-memory.ts +0 -770
  1374. package/ccw/src/commands/hook.ts +0 -316
  1375. package/ccw/src/commands/install.ts +0 -799
  1376. package/ccw/src/commands/issue.ts +0 -3150
  1377. package/ccw/src/commands/list.ts +0 -37
  1378. package/ccw/src/commands/loop.ts +0 -344
  1379. package/ccw/src/commands/memory.ts +0 -1090
  1380. package/ccw/src/commands/serve.ts +0 -86
  1381. package/ccw/src/commands/session-path-resolver.ts +0 -372
  1382. package/ccw/src/commands/session.ts +0 -1141
  1383. package/ccw/src/commands/stop.ts +0 -138
  1384. package/ccw/src/commands/tool.ts +0 -216
  1385. package/ccw/src/commands/uninstall.ts +0 -309
  1386. package/ccw/src/commands/upgrade.ts +0 -352
  1387. package/ccw/src/commands/view.ts +0 -133
  1388. package/ccw/src/commands/workflow.ts +0 -348
  1389. package/ccw/src/config/.litellm-api-config-manager.ts.2025-12-23T11-57-43-727Z.bak +0 -441
  1390. package/ccw/src/config/cli-settings-manager.ts +0 -460
  1391. package/ccw/src/config/litellm-api-config-manager.ts +0 -1350
  1392. package/ccw/src/config/litellm-provider-models.ts +0 -222
  1393. package/ccw/src/config/provider-models.ts +0 -123
  1394. package/ccw/src/config/storage-paths.ts +0 -685
  1395. package/ccw/src/core/auth/csrf-manager.ts +0 -104
  1396. package/ccw/src/core/auth/csrf-middleware.ts +0 -161
  1397. package/ccw/src/core/auth/middleware.ts +0 -94
  1398. package/ccw/src/core/auth/token-manager.ts +0 -219
  1399. package/ccw/src/core/cache-manager.ts +0 -304
  1400. package/ccw/src/core/claude-freshness.ts +0 -339
  1401. package/ccw/src/core/core-memory-store.ts +0 -1529
  1402. package/ccw/src/core/cors.ts +0 -10
  1403. package/ccw/src/core/dashboard-generator-patch.ts +0 -47
  1404. package/ccw/src/core/dashboard-generator.ts +0 -802
  1405. package/ccw/src/core/data-aggregator.ts +0 -690
  1406. package/ccw/src/core/history-importer.ts +0 -625
  1407. package/ccw/src/core/lite-scanner-complete.ts +0 -473
  1408. package/ccw/src/core/lite-scanner.ts +0 -978
  1409. package/ccw/src/core/manifest.ts +0 -271
  1410. package/ccw/src/core/memory-embedder-bridge.ts +0 -258
  1411. package/ccw/src/core/memory-store.ts +0 -978
  1412. package/ccw/src/core/routes/auth-routes.ts +0 -98
  1413. package/ccw/src/core/routes/ccw-routes.ts +0 -86
  1414. package/ccw/src/core/routes/claude-routes.ts +0 -1512
  1415. package/ccw/src/core/routes/cli-routes.ts +0 -1002
  1416. package/ccw/src/core/routes/cli-settings-routes.ts +0 -279
  1417. package/ccw/src/core/routes/codexlens/README.md +0 -37
  1418. package/ccw/src/core/routes/codexlens/config-handlers.ts +0 -1273
  1419. package/ccw/src/core/routes/codexlens/index-handlers.ts +0 -354
  1420. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +0 -932
  1421. package/ccw/src/core/routes/codexlens/utils.ts +0 -96
  1422. package/ccw/src/core/routes/codexlens/watcher-handlers.ts +0 -265
  1423. package/ccw/src/core/routes/codexlens-routes.ts +0 -23
  1424. package/ccw/src/core/routes/commands-routes.ts +0 -620
  1425. package/ccw/src/core/routes/core-memory-routes.ts +0 -607
  1426. package/ccw/src/core/routes/discovery-routes.ts +0 -664
  1427. package/ccw/src/core/routes/files-routes.ts +0 -502
  1428. package/ccw/src/core/routes/graph-routes.md +0 -164
  1429. package/ccw/src/core/routes/graph-routes.ts +0 -635
  1430. package/ccw/src/core/routes/help-routes.ts +0 -508
  1431. package/ccw/src/core/routes/hooks-routes.ts +0 -473
  1432. package/ccw/src/core/routes/issue-routes.ts +0 -1547
  1433. package/ccw/src/core/routes/litellm-api-routes.ts +0 -1482
  1434. package/ccw/src/core/routes/litellm-routes.ts +0 -115
  1435. package/ccw/src/core/routes/loop-routes.ts +0 -386
  1436. package/ccw/src/core/routes/loop-v2-routes.ts +0 -1470
  1437. package/ccw/src/core/routes/mcp-routes.ts +0 -1372
  1438. package/ccw/src/core/routes/mcp-templates-db.ts +0 -267
  1439. package/ccw/src/core/routes/memory-routes.ts +0 -1345
  1440. package/ccw/src/core/routes/nav-status-routes.ts +0 -325
  1441. package/ccw/src/core/routes/provider-routes.ts +0 -78
  1442. package/ccw/src/core/routes/rules-routes.ts +0 -1064
  1443. package/ccw/src/core/routes/session-routes.ts +0 -649
  1444. package/ccw/src/core/routes/skills-routes.ts +0 -1278
  1445. package/ccw/src/core/routes/status-routes.ts +0 -132
  1446. package/ccw/src/core/routes/system-routes.ts +0 -575
  1447. package/ccw/src/core/routes/task-routes.ts +0 -361
  1448. package/ccw/src/core/routes/test-loop-routes.ts +0 -312
  1449. package/ccw/src/core/routes/types.ts +0 -25
  1450. package/ccw/src/core/server.ts +0 -776
  1451. package/ccw/src/core/services/api-key-tester.ts +0 -166
  1452. package/ccw/src/core/services/health-check-service.ts +0 -366
  1453. package/ccw/src/core/session-clustering-service.ts +0 -1258
  1454. package/ccw/src/core/session-scanner.ts +0 -283
  1455. package/ccw/src/core/websocket.ts +0 -302
  1456. package/ccw/src/index.ts +0 -10
  1457. package/ccw/src/mcp-server/index.ts +0 -191
  1458. package/ccw/src/templates/assets/css/github-dark.min.css +0 -10
  1459. package/ccw/src/templates/assets/css/github.min.css +0 -10
  1460. package/ccw/src/templates/assets/js/cytoscape.min.js +0 -32
  1461. package/ccw/src/templates/assets/js/d3.min.js +0 -2
  1462. package/ccw/src/templates/assets/js/highlight.min.js +0 -1244
  1463. package/ccw/src/templates/assets/js/lucide.min.js +0 -12
  1464. package/ccw/src/templates/assets/js/marked.min.js +0 -69
  1465. package/ccw/src/templates/assets/js/tailwind.js +0 -83
  1466. package/ccw/src/templates/dashboard-css/01-base.css +0 -419
  1467. package/ccw/src/templates/dashboard-css/02-session.css +0 -831
  1468. package/ccw/src/templates/dashboard-css/03-tasks.css +0 -517
  1469. package/ccw/src/templates/dashboard-css/04-lite-tasks.css +0 -4354
  1470. package/ccw/src/templates/dashboard-css/05-context.css +0 -2206
  1471. package/ccw/src/templates/dashboard-css/06-cards.css +0 -1576
  1472. package/ccw/src/templates/dashboard-css/07-managers.css +0 -2107
  1473. package/ccw/src/templates/dashboard-css/08-review.css +0 -1266
  1474. package/ccw/src/templates/dashboard-css/09-explorer.css +0 -1408
  1475. package/ccw/src/templates/dashboard-css/10-cli-status.css +0 -539
  1476. package/ccw/src/templates/dashboard-css/11-cli-history.css +0 -271
  1477. package/ccw/src/templates/dashboard-css/12-cli-legacy.css +0 -896
  1478. package/ccw/src/templates/dashboard-css/13-cli-ccw.css +0 -199
  1479. package/ccw/src/templates/dashboard-css/14-cli-modals.css +0 -258
  1480. package/ccw/src/templates/dashboard-css/15-cli-endpoints.css +0 -305
  1481. package/ccw/src/templates/dashboard-css/16-cli-session.css +0 -241
  1482. package/ccw/src/templates/dashboard-css/17-cli-conversation.css +0 -283
  1483. package/ccw/src/templates/dashboard-css/18-cli-settings.css +0 -229
  1484. package/ccw/src/templates/dashboard-css/19-cli-native-session.css +0 -496
  1485. package/ccw/src/templates/dashboard-css/20-cli-taskqueue.css +0 -188
  1486. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +0 -820
  1487. package/ccw/src/templates/dashboard-css/22-cli-semantic.css +0 -240
  1488. package/ccw/src/templates/dashboard-css/23-memory.css +0 -2390
  1489. package/ccw/src/templates/dashboard-css/24-prompt-history.css +0 -1089
  1490. package/ccw/src/templates/dashboard-css/25-skills-rules.css +0 -326
  1491. package/ccw/src/templates/dashboard-css/26-claude-manager.css +0 -1087
  1492. package/ccw/src/templates/dashboard-css/27-graph-explorer.css +0 -1678
  1493. package/ccw/src/templates/dashboard-css/28-mcp-manager.css +0 -748
  1494. package/ccw/src/templates/dashboard-css/29-help.css +0 -264
  1495. package/ccw/src/templates/dashboard-css/30-core-memory.css +0 -1720
  1496. package/ccw/src/templates/dashboard-css/31-api-settings.css +0 -3002
  1497. package/ccw/src/templates/dashboard-css/32-issue-manager.css +0 -3619
  1498. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +0 -860
  1499. package/ccw/src/templates/dashboard-css/34-discovery.css +0 -783
  1500. package/ccw/src/templates/dashboard-css/36-loop-monitor.css +0 -1896
  1501. package/ccw/src/templates/dashboard-css/36-loop-monitor.css.backup +0 -1877
  1502. package/ccw/src/templates/dashboard-css/37-commands.css +0 -193
  1503. package/ccw/src/templates/dashboard-js/api.js +0 -225
  1504. package/ccw/src/templates/dashboard-js/components/_conflict_tab.js +0 -112
  1505. package/ccw/src/templates/dashboard-js/components/_exp_helpers.js +0 -54
  1506. package/ccw/src/templates/dashboard-js/components/_review_tab.js +0 -640
  1507. package/ccw/src/templates/dashboard-js/components/carousel.js +0 -398
  1508. package/ccw/src/templates/dashboard-js/components/cli-history.js +0 -913
  1509. package/ccw/src/templates/dashboard-js/components/cli-status.js +0 -1617
  1510. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +0 -985
  1511. package/ccw/src/templates/dashboard-js/components/flowchart.js +0 -493
  1512. package/ccw/src/templates/dashboard-js/components/global-notifications.js +0 -508
  1513. package/ccw/src/templates/dashboard-js/components/hook-manager.js +0 -1493
  1514. package/ccw/src/templates/dashboard-js/components/index-manager.js +0 -302
  1515. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +0 -1760
  1516. package/ccw/src/templates/dashboard-js/components/modals.js +0 -326
  1517. package/ccw/src/templates/dashboard-js/components/navigation.js +0 -430
  1518. package/ccw/src/templates/dashboard-js/components/notifications.js +0 -934
  1519. package/ccw/src/templates/dashboard-js/components/sidebar.js +0 -31
  1520. package/ccw/src/templates/dashboard-js/components/storage-manager.js +0 -478
  1521. package/ccw/src/templates/dashboard-js/components/tabs-context.js +0 -1093
  1522. package/ccw/src/templates/dashboard-js/components/tabs-other.js +0 -424
  1523. package/ccw/src/templates/dashboard-js/components/task-drawer-core.js +0 -477
  1524. package/ccw/src/templates/dashboard-js/components/task-drawer-renderers.js +0 -447
  1525. package/ccw/src/templates/dashboard-js/components/task-queue-sidebar.js +0 -716
  1526. package/ccw/src/templates/dashboard-js/components/theme.js +0 -49
  1527. package/ccw/src/templates/dashboard-js/components/version-check.js +0 -339
  1528. package/ccw/src/templates/dashboard-js/help-i18n.js +0 -272
  1529. package/ccw/src/templates/dashboard-js/i18n.js +0 -5558
  1530. package/ccw/src/templates/dashboard-js/main.js +0 -158
  1531. package/ccw/src/templates/dashboard-js/services.js +0 -289
  1532. package/ccw/src/templates/dashboard-js/state.js +0 -245
  1533. package/ccw/src/templates/dashboard-js/utils.js +0 -199
  1534. package/ccw/src/templates/dashboard-js/views/api-settings.js +0 -5646
  1535. package/ccw/src/templates/dashboard-js/views/claude-manager.js +0 -1129
  1536. package/ccw/src/templates/dashboard-js/views/cli-manager.js +0 -3615
  1537. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +0 -7123
  1538. package/ccw/src/templates/dashboard-js/views/commands-manager.js +0 -503
  1539. package/ccw/src/templates/dashboard-js/views/core-memory-clusters.js +0 -503
  1540. package/ccw/src/templates/dashboard-js/views/core-memory.js +0 -891
  1541. package/ccw/src/templates/dashboard-js/views/explorer.js +0 -888
  1542. package/ccw/src/templates/dashboard-js/views/fix-session.js +0 -180
  1543. package/ccw/src/templates/dashboard-js/views/graph-explorer.js +0 -1157
  1544. package/ccw/src/templates/dashboard-js/views/help.js +0 -1278
  1545. package/ccw/src/templates/dashboard-js/views/history.js +0 -390
  1546. package/ccw/src/templates/dashboard-js/views/home.js +0 -244
  1547. package/ccw/src/templates/dashboard-js/views/hook-manager.js +0 -696
  1548. package/ccw/src/templates/dashboard-js/views/issue-discovery.js +0 -730
  1549. package/ccw/src/templates/dashboard-js/views/issue-manager.js +0 -3248
  1550. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +0 -3546
  1551. package/ccw/src/templates/dashboard-js/views/loop-monitor.js +0 -3345
  1552. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +0 -2261
  1553. package/ccw/src/templates/dashboard-js/views/mcp-manager.js.backup +0 -1729
  1554. package/ccw/src/templates/dashboard-js/views/mcp-manager.js.new +0 -928
  1555. package/ccw/src/templates/dashboard-js/views/memory.js +0 -1221
  1556. package/ccw/src/templates/dashboard-js/views/project-overview.js +0 -548
  1557. package/ccw/src/templates/dashboard-js/views/prompt-history.js +0 -713
  1558. package/ccw/src/templates/dashboard-js/views/review-session.js +0 -1030
  1559. package/ccw/src/templates/dashboard-js/views/rules-manager.js +0 -880
  1560. package/ccw/src/templates/dashboard-js/views/session-detail.js +0 -781
  1561. package/ccw/src/templates/dashboard-js/views/skills-manager.js +0 -1282
  1562. package/ccw/src/templates/dashboard.html +0 -1104
  1563. package/ccw/src/templates/hooks-config-example.json +0 -60
  1564. package/ccw/src/templates/review-cycle-dashboard.html +0 -1930
  1565. package/ccw/src/templates/workflow-dashboard.html +0 -401
  1566. package/ccw/src/tools/README.md +0 -29
  1567. package/ccw/src/tools/classify-folders.ts +0 -245
  1568. package/ccw/src/tools/claude-cli-tools.ts +0 -1271
  1569. package/ccw/src/tools/cli-config-manager.ts +0 -169
  1570. package/ccw/src/tools/cli-executor-core.ts +0 -1665
  1571. package/ccw/src/tools/cli-executor-state.ts +0 -562
  1572. package/ccw/src/tools/cli-executor-utils.ts +0 -394
  1573. package/ccw/src/tools/cli-executor.ts +0 -7
  1574. package/ccw/src/tools/cli-history-store.ts +0 -1498
  1575. package/ccw/src/tools/cli-output-converter.ts +0 -1301
  1576. package/ccw/src/tools/cli-prompt-builder.ts +0 -487
  1577. package/ccw/src/tools/codex-lens-lsp.ts +0 -402
  1578. package/ccw/src/tools/codex-lens.ts +0 -1863
  1579. package/ccw/src/tools/command-registry.test.ts +0 -669
  1580. package/ccw/src/tools/command-registry.ts +0 -323
  1581. package/ccw/src/tools/context-cache-store.ts +0 -368
  1582. package/ccw/src/tools/context-cache.ts +0 -393
  1583. package/ccw/src/tools/convert-tokens-to-css.ts +0 -300
  1584. package/ccw/src/tools/core-memory.ts +0 -458
  1585. package/ccw/src/tools/detect-changed-modules.ts +0 -343
  1586. package/ccw/src/tools/discover-design-files.ts +0 -184
  1587. package/ccw/src/tools/edit-file.ts +0 -568
  1588. package/ccw/src/tools/generate-module-docs.ts +0 -442
  1589. package/ccw/src/tools/get-modules-by-depth.ts +0 -349
  1590. package/ccw/src/tools/index.ts +0 -384
  1591. package/ccw/src/tools/litellm-client.ts +0 -288
  1592. package/ccw/src/tools/litellm-executor.ts +0 -360
  1593. package/ccw/src/tools/loop-manager.ts +0 -519
  1594. package/ccw/src/tools/loop-state-manager.ts +0 -173
  1595. package/ccw/src/tools/loop-task-manager.ts +0 -391
  1596. package/ccw/src/tools/memory-update-queue.js +0 -493
  1597. package/ccw/src/tools/native-session-discovery.ts +0 -1034
  1598. package/ccw/src/tools/notifier.ts +0 -129
  1599. package/ccw/src/tools/pattern-parser.ts +0 -329
  1600. package/ccw/src/tools/read-file.ts +0 -410
  1601. package/ccw/src/tools/resume-strategy.ts +0 -345
  1602. package/ccw/src/tools/session-content-parser.ts +0 -619
  1603. package/ccw/src/tools/session-manager.ts +0 -1114
  1604. package/ccw/src/tools/skill-context-loader.ts +0 -213
  1605. package/ccw/src/tools/smart-context.ts +0 -228
  1606. package/ccw/src/tools/smart-search.ts +0 -2658
  1607. package/ccw/src/tools/smart-search.ts.backup +0 -1233
  1608. package/ccw/src/tools/storage-manager.ts +0 -455
  1609. package/ccw/src/tools/template-discovery.ts +0 -303
  1610. package/ccw/src/tools/ui-generate-preview.js +0 -350
  1611. package/ccw/src/tools/ui-instantiate-prototypes.js +0 -301
  1612. package/ccw/src/tools/update-module-claude.js +0 -380
  1613. package/ccw/src/tools/vscode-lsp.ts +0 -317
  1614. package/ccw/src/tools/write-file.ts +0 -222
  1615. package/ccw/src/types/cli-settings.ts +0 -137
  1616. package/ccw/src/types/config.ts +0 -11
  1617. package/ccw/src/types/index.ts +0 -4
  1618. package/ccw/src/types/litellm-api-config.ts +0 -456
  1619. package/ccw/src/types/loop.ts +0 -316
  1620. package/ccw/src/types/session.ts +0 -25
  1621. package/ccw/src/types/skill-types.ts +0 -99
  1622. package/ccw/src/types/tool.ts +0 -41
  1623. package/ccw/src/utils/browser-launcher.ts +0 -62
  1624. package/ccw/src/utils/codexlens-path.ts +0 -60
  1625. package/ccw/src/utils/exec-constants.ts +0 -24
  1626. package/ccw/src/utils/file-utils.ts +0 -48
  1627. package/ccw/src/utils/path-resolver.ts +0 -392
  1628. package/ccw/src/utils/path-validator.ts +0 -187
  1629. package/ccw/src/utils/project-root.ts +0 -73
  1630. package/ccw/src/utils/python-utils.ts +0 -140
  1631. package/ccw/src/utils/shell-escape.ts +0 -117
  1632. package/ccw/src/utils/ui.ts +0 -155
  1633. package/ccw/src/utils/update-checker.ts +0 -178
  1634. package/ccw/src/utils/uv-manager.ts +0 -797
  1635. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
  1636. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
  1637. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-313.pyc +0 -0
  1638. package/ccw-litellm/src/ccw_litellm/__pycache__/cli.cpython-313.pyc +0 -0
  1639. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
  1640. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
  1641. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-313.pyc +0 -0
  1642. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  1643. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  1644. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  1645. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
  1646. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
  1647. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
  1648. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
  1649. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
  1650. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-313.pyc +0 -0
  1651. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
  1652. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
  1653. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
  1654. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
  1655. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
  1656. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
  1657. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
  1658. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
  1659. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-313.pyc +0 -0
  1660. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
  1661. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
  1662. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-313.pyc +0 -0
  1663. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
  1664. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
  1665. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-313.pyc +0 -0
  1666. package/codex-lens/src/codexlens/.workflow/.cli-history/history.db +0 -0
  1667. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
  1668. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
  1669. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-313.pyc +0 -0
  1670. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
  1671. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
  1672. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-313.pyc +0 -0
  1673. package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
  1674. package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
  1675. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  1676. package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
  1677. package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
  1678. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  1679. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
  1680. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
  1681. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
  1682. package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
  1683. package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
  1684. package/codex-lens/src/codexlens/__pycache__/errors.cpython-313.pyc +0 -0
  1685. package/codex-lens/src/codexlens/api/__pycache__/__init__.cpython-312.pyc +0 -0
  1686. package/codex-lens/src/codexlens/api/__pycache__/__init__.cpython-313.pyc +0 -0
  1687. package/codex-lens/src/codexlens/api/__pycache__/definition.cpython-312.pyc +0 -0
  1688. package/codex-lens/src/codexlens/api/__pycache__/definition.cpython-313.pyc +0 -0
  1689. package/codex-lens/src/codexlens/api/__pycache__/file_context.cpython-312.pyc +0 -0
  1690. package/codex-lens/src/codexlens/api/__pycache__/file_context.cpython-313.pyc +0 -0
  1691. package/codex-lens/src/codexlens/api/__pycache__/hover.cpython-312.pyc +0 -0
  1692. package/codex-lens/src/codexlens/api/__pycache__/hover.cpython-313.pyc +0 -0
  1693. package/codex-lens/src/codexlens/api/__pycache__/models.cpython-312.pyc +0 -0
  1694. package/codex-lens/src/codexlens/api/__pycache__/models.cpython-313.pyc +0 -0
  1695. package/codex-lens/src/codexlens/api/__pycache__/references.cpython-312.pyc +0 -0
  1696. package/codex-lens/src/codexlens/api/__pycache__/references.cpython-313.pyc +0 -0
  1697. package/codex-lens/src/codexlens/api/__pycache__/semantic.cpython-312.pyc +0 -0
  1698. package/codex-lens/src/codexlens/api/__pycache__/semantic.cpython-313.pyc +0 -0
  1699. package/codex-lens/src/codexlens/api/__pycache__/symbols.cpython-312.pyc +0 -0
  1700. package/codex-lens/src/codexlens/api/__pycache__/symbols.cpython-313.pyc +0 -0
  1701. package/codex-lens/src/codexlens/api/__pycache__/utils.cpython-312.pyc +0 -0
  1702. package/codex-lens/src/codexlens/api/__pycache__/utils.cpython-313.pyc +0 -0
  1703. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
  1704. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  1705. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-313.pyc +0 -0
  1706. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
  1707. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.pyc +0 -0
  1708. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  1709. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-310.pyc +0 -0
  1710. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.pyc +0 -0
  1711. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  1712. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-310.pyc +0 -0
  1713. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.pyc +0 -0
  1714. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  1715. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-310.pyc +0 -0
  1716. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
  1717. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-313.pyc +0 -0
  1718. package/codex-lens/src/codexlens/hybrid_search/__pycache__/__init__.cpython-312.pyc +0 -0
  1719. package/codex-lens/src/codexlens/hybrid_search/__pycache__/__init__.cpython-313.pyc +0 -0
  1720. package/codex-lens/src/codexlens/hybrid_search/__pycache__/data_structures.cpython-312.pyc +0 -0
  1721. package/codex-lens/src/codexlens/hybrid_search/__pycache__/data_structures.cpython-313.pyc +0 -0
  1722. package/codex-lens/src/codexlens/hybrid_search/__pycache__/engine.cpython-313.pyc +0 -0
  1723. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  1724. package/codex-lens/src/codexlens/indexing/__pycache__/embedding.cpython-313.pyc +0 -0
  1725. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  1726. package/codex-lens/src/codexlens/lsp/__pycache__/__init__.cpython-312.pyc +0 -0
  1727. package/codex-lens/src/codexlens/lsp/__pycache__/__init__.cpython-313.pyc +0 -0
  1728. package/codex-lens/src/codexlens/lsp/__pycache__/handlers.cpython-313.pyc +0 -0
  1729. package/codex-lens/src/codexlens/lsp/__pycache__/lsp_bridge.cpython-312.pyc +0 -0
  1730. package/codex-lens/src/codexlens/lsp/__pycache__/lsp_bridge.cpython-313.pyc +0 -0
  1731. package/codex-lens/src/codexlens/lsp/__pycache__/lsp_graph_builder.cpython-312.pyc +0 -0
  1732. package/codex-lens/src/codexlens/lsp/__pycache__/lsp_graph_builder.cpython-313.pyc +0 -0
  1733. package/codex-lens/src/codexlens/lsp/__pycache__/providers.cpython-313.pyc +0 -0
  1734. package/codex-lens/src/codexlens/lsp/__pycache__/server.cpython-313.pyc +0 -0
  1735. package/codex-lens/src/codexlens/lsp/__pycache__/standalone_manager.cpython-313.pyc +0 -0
  1736. package/codex-lens/src/codexlens/mcp/__pycache__/__init__.cpython-313.pyc +0 -0
  1737. package/codex-lens/src/codexlens/mcp/__pycache__/hooks.cpython-313.pyc +0 -0
  1738. package/codex-lens/src/codexlens/mcp/__pycache__/provider.cpython-313.pyc +0 -0
  1739. package/codex-lens/src/codexlens/mcp/__pycache__/schema.cpython-313.pyc +0 -0
  1740. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
  1741. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
  1742. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
  1743. package/codex-lens/src/codexlens/parsers/__pycache__/encoding.cpython-313.pyc +0 -0
  1744. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
  1745. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.pyc +0 -0
  1746. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  1747. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-310.pyc +0 -0
  1748. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
  1749. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-313.pyc +0 -0
  1750. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
  1751. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
  1752. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  1753. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
  1754. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
  1755. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-313.pyc +0 -0
  1756. package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
  1757. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
  1758. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.pyc +0 -0
  1759. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  1760. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  1761. package/codex-lens/src/codexlens/search/__pycache__/graph_expander.cpython-313.pyc +0 -0
  1762. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
  1763. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
  1764. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  1765. package/codex-lens/src/codexlens/search/__pycache__/query_parser.cpython-313.pyc +0 -0
  1766. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
  1767. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
  1768. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  1769. package/codex-lens/src/codexlens/search/association_tree/__pycache__/__init__.cpython-313.pyc +0 -0
  1770. package/codex-lens/src/codexlens/search/association_tree/__pycache__/builder.cpython-313.pyc +0 -0
  1771. package/codex-lens/src/codexlens/search/association_tree/__pycache__/data_structures.cpython-313.pyc +0 -0
  1772. package/codex-lens/src/codexlens/search/association_tree/__pycache__/deduplicator.cpython-313.pyc +0 -0
  1773. package/codex-lens/src/codexlens/search/clustering/__pycache__/__init__.cpython-312.pyc +0 -0
  1774. package/codex-lens/src/codexlens/search/clustering/__pycache__/__init__.cpython-313.pyc +0 -0
  1775. package/codex-lens/src/codexlens/search/clustering/__pycache__/base.cpython-312.pyc +0 -0
  1776. package/codex-lens/src/codexlens/search/clustering/__pycache__/base.cpython-313.pyc +0 -0
  1777. package/codex-lens/src/codexlens/search/clustering/__pycache__/dbscan_strategy.cpython-313.pyc +0 -0
  1778. package/codex-lens/src/codexlens/search/clustering/__pycache__/factory.cpython-312.pyc +0 -0
  1779. package/codex-lens/src/codexlens/search/clustering/__pycache__/factory.cpython-313.pyc +0 -0
  1780. package/codex-lens/src/codexlens/search/clustering/__pycache__/frequency_strategy.cpython-312.pyc +0 -0
  1781. package/codex-lens/src/codexlens/search/clustering/__pycache__/frequency_strategy.cpython-313.pyc +0 -0
  1782. package/codex-lens/src/codexlens/search/clustering/__pycache__/hdbscan_strategy.cpython-313.pyc +0 -0
  1783. package/codex-lens/src/codexlens/search/clustering/__pycache__/noop_strategy.cpython-312.pyc +0 -0
  1784. package/codex-lens/src/codexlens/search/clustering/__pycache__/noop_strategy.cpython-313.pyc +0 -0
  1785. package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +0 -225
  1786. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
  1787. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
  1788. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-313.pyc +0 -0
  1789. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
  1790. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
  1791. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  1792. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
  1793. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
  1794. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-313.pyc +0 -0
  1795. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
  1796. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
  1797. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
  1798. package/codex-lens/src/codexlens/semantic/__pycache__/code_extractor.cpython-313.pyc +0 -0
  1799. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
  1800. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
  1801. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-313.pyc +0 -0
  1802. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
  1803. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
  1804. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
  1805. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
  1806. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
  1807. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  1808. package/codex-lens/src/codexlens/semantic/__pycache__/graph_analyzer.cpython-313.pyc +0 -0
  1809. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  1810. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  1811. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  1812. package/codex-lens/src/codexlens/semantic/__pycache__/llm_enhancer.cpython-313.pyc +0 -0
  1813. package/codex-lens/src/codexlens/semantic/__pycache__/ollama_backend.cpython-313.pyc +0 -0
  1814. package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
  1815. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
  1816. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
  1817. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
  1818. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
  1819. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.pyc +0 -0
  1820. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  1821. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
  1822. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-312.pyc +0 -0
  1823. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
  1824. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
  1825. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-312.pyc +0 -0
  1826. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
  1827. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
  1828. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-312.pyc +0 -0
  1829. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
  1830. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
  1831. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-312.pyc +0 -0
  1832. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
  1833. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
  1834. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-312.pyc +0 -0
  1835. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
  1836. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
  1837. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-312.pyc +0 -0
  1838. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
  1839. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
  1840. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
  1841. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-312.pyc +0 -0
  1842. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
  1843. package/codex-lens/src/codexlens/semantic/splade_encoder.py +0 -567
  1844. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
  1845. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
  1846. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  1847. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
  1848. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
  1849. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  1850. package/codex-lens/src/codexlens/storage/__pycache__/file_cache.cpython-313.pyc +0 -0
  1851. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
  1852. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
  1853. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-313.pyc +0 -0
  1854. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
  1855. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
  1856. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  1857. package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
  1858. package/codex-lens/src/codexlens/storage/__pycache__/migration_manager.cpython-313.pyc +0 -0
  1859. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
  1860. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
  1861. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-313.pyc +0 -0
  1862. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
  1863. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
  1864. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-313.pyc +0 -0
  1865. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
  1866. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
  1867. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
  1868. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
  1869. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.pyc +0 -0
  1870. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  1871. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-310.pyc +0 -0
  1872. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
  1873. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-313.pyc +0 -0
  1874. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
  1875. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
  1876. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
  1877. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
  1878. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
  1879. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  1880. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_001_normalize_keywords.cpython-313.pyc +0 -0
  1881. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_002_add_token_metadata.cpython-313.pyc +0 -0
  1882. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_003_code_relationships.cpython-313.pyc +0 -0
  1883. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_004_dual_fts.cpython-313.pyc +0 -0
  1884. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_005_cleanup_unused_fields.cpython-313.pyc +0 -0
  1885. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
  1886. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
  1887. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
  1888. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
  1889. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
  1890. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
  1891. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
  1892. package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +0 -103
  1893. package/codex-lens/src/codexlens/storage/splade_index.py +0 -578
  1894. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
  1895. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
  1896. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
  1897. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
  1898. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
  1899. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
  1900. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
  1901. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
  1902. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
  1903. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
  1904. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
  1905. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
  1906. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
  1907. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
  1908. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
@@ -1,2261 +0,0 @@
1
- // MCP Manager View
2
- // Renders the MCP server management interface
3
-
4
- // CCW Tools available for MCP (file operations + core memory only)
5
- const CCW_MCP_TOOLS = [
6
- // Core tools (always recommended)
7
- { name: 'write_file', desc: 'Write/create files', core: true },
8
- { name: 'edit_file', desc: 'Edit/replace content', core: true },
9
- { name: 'read_file', desc: 'Read file contents', core: true },
10
- { name: 'core_memory', desc: 'Core memory management', core: true },
11
- ];
12
-
13
- // Get currently enabled tools from installed config (Claude)
14
- function getCcwEnabledTools() {
15
- const currentPath = projectPath; // Keep original format (forward slash)
16
- const projectData = mcpAllProjects[currentPath] || {};
17
- const ccwConfig = projectData.mcpServers?.['ccw-tools'];
18
- if (ccwConfig?.env?.CCW_ENABLED_TOOLS) {
19
- const val = ccwConfig.env.CCW_ENABLED_TOOLS;
20
- if (val.toLowerCase() === 'all') return CCW_MCP_TOOLS.map(t => t.name);
21
- return val.split(',').map(t => t.trim());
22
- }
23
- return CCW_MCP_TOOLS.filter(t => t.core).map(t => t.name);
24
- }
25
-
26
- // Get currently enabled tools from Codex config
27
- function getCcwEnabledToolsCodex() {
28
- const ccwConfig = codexMcpServers?.['ccw-tools'];
29
- if (ccwConfig?.env?.CCW_ENABLED_TOOLS) {
30
- const val = ccwConfig.env.CCW_ENABLED_TOOLS;
31
- if (val.toLowerCase() === 'all') return CCW_MCP_TOOLS.map(t => t.name);
32
- return val.split(',').map(t => t.trim());
33
- }
34
- // Default to core tools if not installed
35
- return CCW_MCP_TOOLS.filter(t => t.core).map(t => t.name);
36
- }
37
-
38
- // Get current CCW_PROJECT_ROOT from config
39
- function getCcwProjectRoot() {
40
- // Try project config first, then global config
41
- const currentPath = projectPath;
42
- const projectData = mcpAllProjects[currentPath] || {};
43
- const projectCcwConfig = projectData.mcpServers?.['ccw-tools'];
44
- if (projectCcwConfig?.env?.CCW_PROJECT_ROOT) {
45
- return projectCcwConfig.env.CCW_PROJECT_ROOT;
46
- }
47
- // Fallback to global config
48
- const globalCcwConfig = mcpUserServers?.['ccw-tools'];
49
- return globalCcwConfig?.env?.CCW_PROJECT_ROOT || '';
50
- }
51
-
52
- // Get current CCW_ALLOWED_DIRS from config
53
- function getCcwAllowedDirs() {
54
- // Try project config first, then global config
55
- const currentPath = projectPath;
56
- const projectData = mcpAllProjects[currentPath] || {};
57
- const projectCcwConfig = projectData.mcpServers?.['ccw-tools'];
58
- if (projectCcwConfig?.env?.CCW_ALLOWED_DIRS) {
59
- return projectCcwConfig.env.CCW_ALLOWED_DIRS;
60
- }
61
- // Fallback to global config
62
- const globalCcwConfig = mcpUserServers?.['ccw-tools'];
63
- return globalCcwConfig?.env?.CCW_ALLOWED_DIRS || '';
64
- }
65
-
66
- // Get current CCW_PROJECT_ROOT from Codex config
67
- function getCcwProjectRootCodex() {
68
- const ccwConfig = codexMcpServers?.['ccw-tools'];
69
- return ccwConfig?.env?.CCW_PROJECT_ROOT || '';
70
- }
71
-
72
- // Get current CCW_ALLOWED_DIRS from Codex config
73
- function getCcwAllowedDirsCodex() {
74
- const ccwConfig = codexMcpServers?.['ccw-tools'];
75
- return ccwConfig?.env?.CCW_ALLOWED_DIRS || '';
76
- }
77
-
78
- async function renderMcpManager() {
79
- const container = document.getElementById('mainContent');
80
- if (!container) return;
81
-
82
- // Hide stats grid and search for MCP view
83
- const statsGrid = document.getElementById('statsGrid');
84
- const searchInput = document.getElementById('searchInput');
85
- if (statsGrid) statsGrid.style.display = 'none';
86
- if (searchInput) searchInput.parentElement.style.display = 'none';
87
-
88
- // Load MCP config if not already loaded
89
- if (!mcpConfig) {
90
- await loadMcpConfig();
91
- }
92
-
93
- // Load MCP templates
94
- await loadMcpTemplates();
95
-
96
- const currentPath = projectPath; // Keep original format (forward slash)
97
- const projectData = mcpAllProjects[currentPath] || {};
98
- const projectServers = projectData.mcpServers || {};
99
- const disabledServers = projectData.disabledMcpServers || [];
100
- const hasMcpJson = projectData.hasMcpJson || false;
101
- const mcpJsonPath = projectData.mcpJsonPath || null;
102
-
103
- // Get all available servers from all projects
104
- const allAvailableServers = getAllAvailableMcpServers();
105
-
106
- // Separate servers by category:
107
- // 1. Project Available = Global + Project-specific (servers available to current project)
108
- // 2. Global Management = Global servers that can be managed
109
- // 3. Other Projects = Servers from other projects (can install to project or global)
110
-
111
- const currentProjectServerNames = Object.keys(projectServers);
112
- const globalServerNames = Object.keys(mcpUserServers || {});
113
- const enterpriseServerNames = Object.keys(mcpEnterpriseServers || {});
114
-
115
- // Project Available MCP: servers available to current project
116
- // This includes: Enterprise (highest priority) + Global + Project-specific
117
- const projectAvailableEntries = [];
118
-
119
- // Add enterprise servers first (highest priority)
120
- for (const [name, config] of Object.entries(mcpEnterpriseServers || {})) {
121
- projectAvailableEntries.push({
122
- name,
123
- config,
124
- source: 'enterprise',
125
- canRemove: false,
126
- canToggle: false
127
- });
128
- }
129
-
130
- // Add global servers
131
- for (const [name, config] of Object.entries(mcpUserServers || {})) {
132
- if (!enterpriseServerNames.includes(name)) {
133
- projectAvailableEntries.push({
134
- name,
135
- config,
136
- source: 'global',
137
- canRemove: false, // Can't remove from project view, must go to global management
138
- canToggle: true,
139
- isEnabled: !disabledServers.includes(name)
140
- });
141
- }
142
- }
143
-
144
- // Add project-specific servers
145
- for (const [name, config] of Object.entries(projectServers)) {
146
- if (!enterpriseServerNames.includes(name) && !globalServerNames.includes(name)) {
147
- projectAvailableEntries.push({
148
- name,
149
- config,
150
- source: 'project',
151
- canRemove: true,
152
- canToggle: true,
153
- isEnabled: !disabledServers.includes(name)
154
- });
155
- }
156
- }
157
-
158
- // Global Management: user global servers (for management)
159
- const globalManagementEntries = Object.entries(mcpUserServers || {});
160
-
161
- // Enterprise servers (for display only, read-only)
162
- const enterpriseServerEntries = Object.entries(mcpEnterpriseServers || {});
163
-
164
- // Other Projects: servers from other projects (not in current project, not global)
165
- const otherProjectServers = Object.entries(allAvailableServers)
166
- .filter(([name, info]) => !currentProjectServerNames.includes(name) && !info.isGlobal);
167
- // Check if CCW Tools is already installed
168
- const isCcwToolsInstalled = currentProjectServerNames.includes("ccw-tools");
169
- const enabledTools = getCcwEnabledTools();
170
- const enabledToolsCodex = getCcwEnabledToolsCodex();
171
-
172
- // Prepare Codex servers data
173
- const codexServerEntries = Object.entries(codexMcpServers || {});
174
- const codexConfigExists = codexMcpConfig?.exists || false;
175
- const codexConfigPath = codexMcpConfig?.configPath || '~/.codex/config.toml';
176
-
177
- // Collect cross-CLI servers (servers from other CLI not yet in current CLI)
178
- const crossCliServers = [];
179
- if (currentCliMode === 'claude') {
180
- // In Claude mode, show Codex servers that aren't in Claude
181
- for (const [name, config] of Object.entries(codexMcpServers || {})) {
182
- const existsInClaude = currentProjectServerNames.includes(name) || globalServerNames.includes(name);
183
- if (!existsInClaude) {
184
- crossCliServers.push({ name, config, fromCli: 'codex' });
185
- }
186
- }
187
- } else {
188
- // In Codex mode, show Claude servers that aren't in Codex
189
- const allClaudeServers = { ...mcpUserServers, ...projectServers };
190
- for (const [name, config] of Object.entries(allClaudeServers)) {
191
- const existsInCodex = codexMcpServers && codexMcpServers[name];
192
- if (!existsInCodex) {
193
- crossCliServers.push({ name, config, fromCli: 'claude' });
194
- }
195
- }
196
- }
197
-
198
- container.innerHTML = `
199
- <div class="mcp-manager">
200
- <!-- CLI Mode Toggle -->
201
- <div class="mcp-cli-toggle mb-6">
202
- <div class="flex items-center justify-between bg-card border border-border rounded-lg p-4">
203
- <div class="flex items-center gap-3">
204
- <span class="text-sm font-medium text-foreground">${t('mcp.cliMode')}</span>
205
- <div class="flex items-center bg-muted rounded-lg p-1">
206
- <button class="cli-mode-btn px-4 py-2 text-sm font-medium rounded-md transition-all ${currentCliMode === 'claude' ? 'bg-primary text-primary-foreground shadow-sm' : 'text-muted-foreground hover:text-foreground'}"
207
- onclick="setCliMode('claude')">
208
- <i data-lucide="bot" class="w-4 h-4 inline mr-1.5"></i>
209
- Claude
210
- </button>
211
- <button class="cli-mode-btn px-4 py-2 text-sm font-medium rounded-md transition-all ${currentCliMode === 'codex' ? 'shadow-sm' : 'text-muted-foreground hover:text-foreground'}"
212
- onclick="setCliMode('codex')"
213
- style="${currentCliMode === 'codex' ? 'background-color: #f97316; color: white;' : ''}">
214
- <i data-lucide="code-2" class="w-4 h-4 inline mr-1.5"></i>
215
- Codex
216
- </button>
217
- </div>
218
- </div>
219
- <div class="text-xs text-muted-foreground">
220
- ${currentCliMode === 'claude'
221
- ? `<span class="flex items-center gap-1"><i data-lucide="file-json" class="w-3 h-3"></i> ~/.claude.json</span>`
222
- : `<span class="flex items-center gap-1"><i data-lucide="file-code" class="w-3 h-3"></i> ${codexConfigPath}</span>`
223
- }
224
- </div>
225
- </div>
226
- </div>
227
-
228
- ${currentCliMode === 'codex' ? `
229
- <!-- CCW Tools MCP Server Card (Codex mode) -->
230
- <div class="mcp-section mb-6">
231
- <div class="ccw-tools-card bg-gradient-to-br from-primary/10 to-primary/5 border-2 ${codexMcpServers && codexMcpServers['ccw-tools'] ? 'border-success' : 'border-primary/30'} rounded-lg p-6 hover:shadow-lg transition-all">
232
- <div class="flex items-start justify-between gap-4">
233
- <div class="flex items-start gap-4 flex-1">
234
- <div class="shrink-0 w-12 h-12 bg-primary rounded-lg flex items-center justify-center">
235
- <i data-lucide="wrench" class="w-6 h-6 text-white"></i>
236
- </div>
237
- <div class="flex-1 min-w-0">
238
- <div class="flex items-center gap-2 mb-2">
239
- <h3 class="text-lg font-bold text-foreground">CCW Tools MCP</h3>
240
- <span class="text-xs px-2 py-0.5 bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300 rounded-full">Codex</span>
241
- ${codexMcpServers && codexMcpServers['ccw-tools'] ? `
242
- <span class="inline-flex items-center gap-1 px-2 py-0.5 text-xs font-semibold rounded-full bg-success-light text-success">
243
- <i data-lucide="check" class="w-3 h-3"></i>
244
- ${enabledToolsCodex.length} tools
245
- </span>
246
- ` : `
247
- <span class="inline-flex items-center gap-1 px-2 py-0.5 text-xs font-semibold rounded-full bg-primary/20 text-primary">
248
- <i data-lucide="package" class="w-3 h-3"></i>
249
- ${t('mcp.available')}
250
- </span>
251
- `}
252
- </div>
253
- <p class="text-sm text-muted-foreground mb-3">${t('mcp.ccwToolsDesc')}</p>
254
- <!-- Tool Selection Grid for Codex -->
255
- <div class="grid grid-cols-3 sm:grid-cols-5 gap-2 mb-3">
256
- ${CCW_MCP_TOOLS.map(tool => `
257
- <label class="flex items-center gap-1.5 text-xs cursor-pointer hover:bg-muted/50 rounded px-1.5 py-1 transition-colors">
258
- <input type="checkbox" class="ccw-tool-checkbox-codex w-3 h-3"
259
- data-tool="${tool.name}"
260
- ${enabledToolsCodex.includes(tool.name) ? 'checked' : ''}>
261
- <span class="${tool.core ? 'font-medium' : 'text-muted-foreground'}">${tool.desc}</span>
262
- </label>
263
- `).join('')}
264
- </div>
265
- <div class="flex items-center gap-3 text-xs">
266
- <button class="text-primary hover:underline" onclick="selectCcwToolsCodex('core')">Core only</button>
267
- <button class="text-primary hover:underline" onclick="selectCcwToolsCodex('all')">All</button>
268
- <button class="text-muted-foreground hover:underline" onclick="selectCcwToolsCodex('none')">None</button>
269
- </div>
270
- <!-- Path Settings -->
271
- <div class="ccw-path-settings mt-3 pt-3 border-t border-border/50">
272
- <div class="flex items-center gap-2 mb-2">
273
- <i data-lucide="folder-root" class="w-4 h-4 text-muted-foreground"></i>
274
- <span class="text-xs font-medium text-muted-foreground">${t('mcp.pathSettings')}</span>
275
- </div>
276
- <div class="grid grid-cols-1 gap-2">
277
- <div class="flex items-center gap-2">
278
- <label class="text-xs text-muted-foreground w-36 shrink-0">CCW_PROJECT_ROOT</label>
279
- <input type="text"
280
- class="ccw-project-root-input flex-1 px-2 py-1 text-xs bg-background border border-border rounded focus:outline-none focus:ring-1 focus:ring-primary"
281
- placeholder="${projectPath || t('mcp.useCurrentDir')}"
282
- value="${getCcwProjectRootCodex()}">
283
- <button class="p-1 text-muted-foreground hover:text-foreground"
284
- onclick="setCcwProjectRootToCurrent()"
285
- title="${t('mcp.useCurrentProject')}">
286
- <i data-lucide="locate-fixed" class="w-4 h-4"></i>
287
- </button>
288
- </div>
289
- <div class="flex items-center gap-2">
290
- <label class="text-xs text-muted-foreground w-36 shrink-0">CCW_ALLOWED_DIRS</label>
291
- <input type="text"
292
- class="ccw-allowed-dirs-input flex-1 px-2 py-1 text-xs bg-background border border-border rounded focus:outline-none focus:ring-1 focus:ring-primary"
293
- placeholder="${t('mcp.allowedDirsPlaceholder')}"
294
- value="${getCcwAllowedDirsCodex()}">
295
- </div>
296
- <div class="flex items-center gap-2">
297
- <label class="text-xs text-muted-foreground w-36 shrink-0">CCW_DISABLE_SANDBOX</label>
298
- <label class="flex items-center gap-2 cursor-pointer">
299
- <input type="checkbox" class="ccw-disable-sandbox-checkbox-codex w-3 h-3"
300
- ${getCcwDisableSandboxCodex() ? 'checked' : ''}>
301
- <span class="text-xs text-muted-foreground">${t('mcp.disableSandboxDesc')}</span>
302
- </label>
303
- </div>
304
- </div>
305
- </div>
306
- </div>
307
- </div>
308
- <div class="shrink-0">
309
- <button class="px-4 py-2 text-sm bg-primary text-primary-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1"
310
- data-action="install-ccw-codex">
311
- <i data-lucide="download" class="w-4 h-4"></i>
312
- ${codexMcpServers && codexMcpServers['ccw-tools'] ? t('mcp.update') : t('mcp.install')}
313
- </button>
314
- </div>
315
- </div>
316
- </div>
317
- </div>
318
-
319
- <!-- Codex MCP Servers Section -->
320
- <div class="mcp-section mb-6">
321
- <div class="flex items-center justify-between mb-4">
322
- <div class="flex items-center gap-3">
323
- <div class="flex items-center gap-2">
324
- <i data-lucide="code-2" class="w-5 h-5 text-primary"></i>
325
- <h3 class="text-lg font-semibold text-foreground">${t('mcp.codex.globalServers')}</h3>
326
- </div>
327
- <button class="px-3 py-1.5 text-sm bg-primary text-primary-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1"
328
- onclick="openCodexMcpCreateModal()">
329
- <span>+</span> ${t('mcp.codex.newServer')}
330
- </button>
331
- ${codexConfigExists ? `
332
- <span class="inline-flex items-center gap-1.5 px-2 py-1 text-xs bg-success/10 text-success rounded-md border border-success/20">
333
- <i data-lucide="file-check" class="w-3.5 h-3.5"></i>
334
- config.toml
335
- </span>
336
- ` : `
337
- <span class="inline-flex items-center gap-1.5 px-2 py-1 text-xs bg-muted text-muted-foreground rounded-md border border-border" title="Will create ~/.codex/config.toml">
338
- <i data-lucide="file-plus" class="w-3.5 h-3.5"></i>
339
- Will create config.toml
340
- </span>
341
- `}
342
- </div>
343
- <span class="text-sm text-muted-foreground">${codexServerEntries.length} ${t('mcp.serversAvailable')}</span>
344
- </div>
345
-
346
- <!-- Info about Codex MCP -->
347
- <div class="bg-green-50 dark:bg-green-950/30 border border-primary/20 rounded-lg p-4 mb-4">
348
- <div class="flex items-start gap-3">
349
- <i data-lucide="info" class="w-5 h-5 text-green-500 shrink-0 mt-0.5"></i>
350
- <div class="text-sm">
351
- <p class="text-primary font-medium mb-1">${t('mcp.codex.infoTitle')}</p>
352
- <p class="text-primary/80 text-xs">${t('mcp.codex.infoDesc')}</p>
353
- </div>
354
- </div>
355
- </div>
356
-
357
- ${codexServerEntries.length === 0 ? `
358
- <div class="mcp-empty-state bg-card border border-border rounded-lg p-6 text-center">
359
- <div class="text-muted-foreground mb-3"><i data-lucide="plug" class="w-10 h-10 mx-auto"></i></div>
360
- <p class="text-muted-foreground">${t('mcp.codex.noServers')}</p>
361
- <p class="text-sm text-muted-foreground mt-1">${t('mcp.codex.noServersHint')}</p>
362
- </div>
363
- ` : `
364
- <div class="mcp-server-grid grid gap-3">
365
- ${codexServerEntries.map(([serverName, serverConfig]) => {
366
- return renderCodexServerCard(serverName, serverConfig);
367
- }).join('')}
368
- </div>
369
- `}
370
- </div>
371
-
372
- <!-- Copy Claude Servers to Codex -->
373
- ${Object.keys(mcpUserServers || {}).length > 0 ? `
374
- <div class="mcp-section mb-6">
375
- <div class="flex items-center justify-between mb-4">
376
- <h3 class="text-lg font-semibold text-foreground flex items-center gap-2">
377
- <i data-lucide="copy" class="w-5 h-5"></i>
378
- ${t('mcp.codex.copyFromClaude')}
379
- </h3>
380
- <span class="text-sm text-muted-foreground">${Object.keys(mcpUserServers || {}).length} ${t('mcp.serversAvailable')}</span>
381
- </div>
382
- <div class="mcp-server-grid grid gap-3">
383
- ${Object.entries(mcpUserServers || {}).map(([serverName, serverConfig]) => {
384
- const alreadyInCodex = codexMcpServers && codexMcpServers[serverName];
385
- return `
386
- <div class="mcp-server-card bg-card border ${alreadyInCodex ? 'border-success/50' : 'border-border'} border-dashed rounded-lg p-4 hover:shadow-md transition-all">
387
- <div class="flex items-start justify-between mb-3">
388
- <div class="flex items-center gap-2">
389
- <i data-lucide="bot" class="w-5 h-5 text-primary"></i>
390
- <h4 class="font-semibold text-foreground">${escapeHtml(serverName)}</h4>
391
- <span class="text-xs px-2 py-0.5 bg-primary/10 text-primary rounded-full">Claude</span>
392
- ${alreadyInCodex ? `<span class="text-xs px-2 py-0.5 bg-success/10 text-success rounded-full">${t('mcp.codex.alreadyAdded')}</span>` : ''}
393
- </div>
394
- ${!alreadyInCodex ? `
395
- <button class="px-3 py-1 text-xs bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity"
396
- data-action="copy-to-codex"
397
- data-server-name="${escapeHtml(serverName)}"
398
- data-server-config="${encodeConfigData(serverConfig)}"
399
- title="${t('mcp.codex.copyToCodex')}">
400
- <i data-lucide="arrow-right" class="w-3.5 h-3.5 inline"></i> Codex
401
- </button>
402
- ` : ''}
403
- </div>
404
- <div class="mcp-server-details text-sm space-y-1">
405
- <div class="flex items-center gap-2 text-muted-foreground">
406
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${t('mcp.cmd')}</span>
407
- <span class="truncate" title="${escapeHtml(serverConfig.command || 'N/A')}">${escapeHtml(serverConfig.command || 'N/A')}</span>
408
- </div>
409
- </div>
410
- </div>
411
- `;
412
- }).join('')}
413
- </div>
414
- </div>
415
- ` : ''}
416
-
417
- <!-- Available MCP Servers from Other Projects (Codex mode) -->
418
- <div class="mcp-section mb-6">
419
- <div class="flex items-center justify-between mb-4">
420
- <h3 class="text-lg font-semibold text-foreground">${t('mcp.availableOther')}</h3>
421
- <span class="text-sm text-muted-foreground">${otherProjectServers.length} ${t('mcp.serversAvailable')}</span>
422
- </div>
423
-
424
- ${otherProjectServers.length === 0 ? `
425
- <div class="mcp-empty-state bg-card border border-border rounded-lg p-6 text-center">
426
- <p class="text-muted-foreground">${t('empty.noAdditionalMcp')}</p>
427
- </div>
428
- ` : `
429
- <div class="mcp-server-grid grid gap-3">
430
- ${otherProjectServers.map(([serverName, serverInfo]) => {
431
- return renderAvailableServerCardForCodex(serverName, serverInfo);
432
- }).join('')}
433
- </div>
434
- `}
435
- </div>
436
-
437
- <!-- Cross-CLI Servers: Available from Claude (Codex mode) -->
438
- ${crossCliServers.length > 0 ? `
439
- <div class="mcp-section">
440
- <div class="flex items-center justify-between mb-4">
441
- <h3 class="text-lg font-semibold text-foreground flex items-center gap-2">
442
- <i data-lucide="circle" class="w-5 h-5 text-primary"></i>
443
- ${t('mcp.codex.copyFromClaude')}
444
- </h3>
445
- <span class="text-sm text-muted-foreground">${crossCliServers.length} ${t('mcp.serversAvailable')}</span>
446
- </div>
447
- <div class="mcp-server-grid grid gap-3">
448
- ${crossCliServers.map(server => renderCrossCliServerCard(server, false)).join('')}
449
- </div>
450
- </div>
451
- ` : ''}
452
- ` : `
453
- <!-- CCW Tools MCP Server Card -->
454
- <div class="mcp-section mb-6">
455
- <div class="ccw-tools-card bg-gradient-to-br from-primary/10 to-primary/5 border-2 ${isCcwToolsInstalled ? 'border-success' : 'border-primary/30'} rounded-lg p-6 hover:shadow-lg transition-all">
456
- <div class="flex items-start justify-between gap-4">
457
- <div class="flex items-start gap-4 flex-1">
458
- <div class="shrink-0 w-12 h-12 bg-primary rounded-lg flex items-center justify-center">
459
- <i data-lucide="wrench" class="w-6 h-6 text-white"></i>
460
- </div>
461
- <div class="flex-1 min-w-0">
462
- <div class="flex items-center gap-2 mb-2">
463
- <h3 class="text-lg font-bold text-foreground">CCW Tools MCP</h3>
464
- ${isCcwToolsInstalled ? `
465
- <span class="inline-flex items-center gap-1 px-2 py-0.5 text-xs font-semibold rounded-full bg-success-light text-success">
466
- <i data-lucide="check" class="w-3 h-3"></i>
467
- ${enabledTools.length} tools
468
- </span>
469
- ` : `
470
- <span class="inline-flex items-center gap-1 px-2 py-0.5 text-xs font-semibold rounded-full bg-primary/20 text-primary">
471
- <i data-lucide="package" class="w-3 h-3"></i>
472
- Available
473
- </span>
474
- `}
475
- </div>
476
- <!-- Tool Selection Grid -->
477
- <div class="grid grid-cols-3 sm:grid-cols-5 gap-2 mb-3">
478
- ${CCW_MCP_TOOLS.map(tool => `
479
- <label class="flex items-center gap-1.5 text-xs cursor-pointer hover:bg-muted/50 rounded px-1.5 py-1 transition-colors">
480
- <input type="checkbox" class="ccw-tool-checkbox w-3 h-3"
481
- data-tool="${tool.name}"
482
- ${enabledTools.includes(tool.name) ? 'checked' : ''}>
483
- <span class="${tool.core ? 'font-medium' : 'text-muted-foreground'}">${tool.desc}</span>
484
- </label>
485
- `).join('')}
486
- </div>
487
- <div class="flex items-center gap-3 text-xs">
488
- <button class="text-primary hover:underline" onclick="selectCcwTools('core')">Core only</button>
489
- <button class="text-primary hover:underline" onclick="selectCcwTools('all')">All</button>
490
- <button class="text-muted-foreground hover:underline" onclick="selectCcwTools('none')">None</button>
491
- </div>
492
- <!-- Path Settings -->
493
- <div class="ccw-path-settings mt-3 pt-3 border-t border-border/50">
494
- <div class="flex items-center gap-2 mb-2">
495
- <i data-lucide="folder-root" class="w-4 h-4 text-muted-foreground"></i>
496
- <span class="text-xs font-medium text-muted-foreground">${t('mcp.pathSettings')}</span>
497
- </div>
498
- <div class="grid grid-cols-1 gap-2">
499
- <div class="flex items-center gap-2">
500
- <label class="text-xs text-muted-foreground w-36 shrink-0">CCW_PROJECT_ROOT</label>
501
- <input type="text"
502
- class="ccw-project-root-input flex-1 px-2 py-1 text-xs bg-background border border-border rounded focus:outline-none focus:ring-1 focus:ring-primary"
503
- placeholder="${projectPath || t('mcp.useCurrentDir')}"
504
- value="${getCcwProjectRoot()}">
505
- <button class="p-1 text-muted-foreground hover:text-foreground"
506
- onclick="setCcwProjectRootToCurrent()"
507
- title="${t('mcp.useCurrentProject')}">
508
- <i data-lucide="locate-fixed" class="w-4 h-4"></i>
509
- </button>
510
- </div>
511
- <div class="flex items-center gap-2">
512
- <label class="text-xs text-muted-foreground w-36 shrink-0">CCW_ALLOWED_DIRS</label>
513
- <input type="text"
514
- class="ccw-allowed-dirs-input flex-1 px-2 py-1 text-xs bg-background border border-border rounded focus:outline-none focus:ring-1 focus:ring-primary"
515
- placeholder="${t('mcp.allowedDirsPlaceholder')}"
516
- value="${getCcwAllowedDirs()}">
517
- </div>
518
- <div class="flex items-center gap-2">
519
- <label class="text-xs text-muted-foreground w-36 shrink-0">CCW_DISABLE_SANDBOX</label>
520
- <label class="flex items-center gap-2 cursor-pointer">
521
- <input type="checkbox" class="ccw-disable-sandbox-checkbox w-3 h-3"
522
- ${getCcwDisableSandbox() ? 'checked' : ''}>
523
- <span class="text-xs text-muted-foreground">${t('mcp.disableSandboxDesc')}</span>
524
- </label>
525
- </div>
526
- </div>
527
- </div>
528
- </div>
529
- </div>
530
- <div class="shrink-0 flex gap-2">
531
- ${isCcwToolsInstalled ? `
532
- <button class="px-4 py-2 text-sm bg-primary text-primary-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1"
533
- data-action="update-ccw-workspace"
534
- title="${t('mcp.updateInWorkspace')}">
535
- <i data-lucide="folder" class="w-4 h-4"></i>
536
- ${t('mcp.updateInWorkspace')}
537
- </button>
538
- <button class="px-4 py-2 text-sm bg-success text-success-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1"
539
- data-action="update-ccw-global"
540
- title="${t('mcp.updateInGlobal')}">
541
- <i data-lucide="globe" class="w-4 h-4"></i>
542
- ${t('mcp.updateInGlobal')}
543
- </button>
544
- ` : `
545
- <button class="px-4 py-2 text-sm bg-primary text-primary-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1"
546
- data-action="install-ccw-workspace"
547
- title="${t('mcp.installToWorkspace')}">
548
- <i data-lucide="folder" class="w-4 h-4"></i>
549
- ${t('mcp.installToWorkspace')}
550
- </button>
551
- <button class="px-4 py-2 text-sm bg-success text-success-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1"
552
- data-action="install-ccw-global"
553
- title="${t('mcp.installToGlobal')}">
554
- <i data-lucide="globe" class="w-4 h-4"></i>
555
- ${t('mcp.installToGlobal')}
556
- </button>
557
- `}
558
- </div>
559
- </div>
560
- </div>
561
- </div>
562
-
563
- <!-- Recommended MCP Servers -->
564
- <div class="mcp-section mb-6">
565
- <div class="flex items-center justify-between mb-4">
566
- <div class="flex items-center gap-3">
567
- <div class="flex items-center gap-2">
568
- <i data-lucide="sparkles" class="w-5 h-5 text-amber-500"></i>
569
- <h3 class="text-lg font-semibold text-foreground">${t('mcp.recommended')}</h3>
570
- </div>
571
- <span class="text-xs px-2 py-0.5 bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-300 rounded-full">
572
- ${t('mcp.quickSetup')}
573
- </span>
574
- </div>
575
- </div>
576
-
577
- <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
578
- ${getRecommendedMcpServers().map(mcp => {
579
- const installStatus = isRecommendedMcpInstalled(mcp.id);
580
- const mcpName = t(mcp.nameKey);
581
- const mcpDesc = t(mcp.descKey);
582
- return `
583
- <div class="recommended-mcp-card bg-card border ${installStatus.installed ? 'border-success/50' : 'border-border'} rounded-lg p-4 hover:shadow-md transition-all">
584
- <div class="flex items-start justify-between mb-3">
585
- <div class="flex items-center gap-3">
586
- <div class="w-10 h-10 ${installStatus.installed ? 'bg-success/10' : 'bg-primary/10'} rounded-lg flex items-center justify-center">
587
- <i data-lucide="${mcp.icon}" class="w-5 h-5 ${installStatus.installed ? 'text-success' : 'text-primary'}"></i>
588
- </div>
589
- <div>
590
- <h4 class="font-semibold text-foreground">${escapeHtml(mcpName)}</h4>
591
- <span class="text-xs px-1.5 py-0.5 bg-muted text-muted-foreground rounded">${mcp.category}</span>
592
- </div>
593
- </div>
594
- ${installStatus.installed ? `
595
- <span class="inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full bg-success/10 text-success">
596
- <i data-lucide="check" class="w-3 h-3"></i>
597
- ${installStatus.scope}
598
- </span>
599
- ` : ''}
600
- </div>
601
- <p class="text-sm text-muted-foreground mb-4 line-clamp-2">${escapeHtml(mcpDesc)}</p>
602
- <div class="flex items-center justify-between">
603
- ${mcp.fields.length > 0 ? `
604
- <span class="text-xs text-muted-foreground flex items-center gap-1">
605
- <i data-lucide="key" class="w-3 h-3"></i>
606
- ${mcp.fields.length} ${t('mcp.configRequired')}
607
- </span>
608
- ` : `
609
- <span class="text-xs text-success flex items-center gap-1">
610
- <i data-lucide="zap" class="w-3 h-3"></i>
611
- ${t('mcp.noConfigNeeded')}
612
- </span>
613
- `}
614
- <button class="px-3 py-1.5 text-sm ${installStatus.installed ? 'bg-muted text-muted-foreground' : 'bg-primary text-primary-foreground'} rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1"
615
- onclick="openRecommendedMcpWizard('${mcp.id}')">
616
- <i data-lucide="${installStatus.installed ? 'settings' : 'download'}" class="w-3.5 h-3.5"></i>
617
- ${installStatus.installed ? t('mcp.reconfigure') : t('mcp.install')}
618
- </button>
619
- </div>
620
- </div>
621
- `;
622
- }).join('')}
623
- </div>
624
- </div>
625
-
626
- <!-- Project Available MCP Servers -->
627
- <div class="mcp-section mb-6">
628
- <div class="flex items-center justify-between mb-4">
629
- <div class="flex items-center gap-3">
630
- <h3 class="text-lg font-semibold text-foreground">${t('mcp.projectAvailable')}</h3>
631
- <button class="px-3 py-1.5 text-sm bg-primary text-primary-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1"
632
- onclick="openMcpCreateModal('project')">
633
- <span>+</span> ${t('mcp.newProjectServer')}
634
- </button>
635
- <!-- Project Config Type Toggle -->
636
- <button class="project-config-toggle inline-flex items-center gap-1.5 px-3 py-1.5 text-xs rounded-lg border cursor-pointer transition-all hover:shadow-md"
637
- onclick="toggleProjectConfigType()"
638
- title="${t('mcp.clickToSwitch')}"
639
- style="${getPreferredProjectConfigType() === 'mcp'
640
- ? 'background: rgba(34, 197, 94, 0.1); border-color: rgba(34, 197, 94, 0.3); color: rgb(34, 197, 94);'
641
- : 'background: rgba(59, 130, 246, 0.1); border-color: rgba(59, 130, 246, 0.3); color: rgb(59, 130, 246);'}">
642
- <i data-lucide="${getPreferredProjectConfigType() === 'mcp' ? 'file-json' : 'settings'}" class="w-3.5 h-3.5"></i>
643
- <span>${getPreferredProjectConfigType() === 'mcp' ? '.mcp.json' : 'claude.json'}</span>
644
- <i data-lucide="chevrons-up-down" class="w-3 h-3 opacity-50"></i>
645
- </button>
646
- ${hasMcpJson ? `
647
- <span class="inline-flex items-center gap-1 px-1.5 py-0.5 text-[10px] bg-success/10 text-success rounded border border-success/20">
648
- <i data-lucide="check" class="w-2.5 h-2.5"></i>
649
- exists
650
- </span>
651
- ` : ''}
652
- </div>
653
- <span class="text-sm text-muted-foreground">${projectAvailableEntries.length} ${t('mcp.serversAvailable')}</span>
654
- </div>
655
-
656
- ${projectAvailableEntries.length === 0 ? `
657
- <div class="mcp-empty-state bg-card border border-border rounded-lg p-6 text-center">
658
- <div class="text-muted-foreground mb-3"><i data-lucide="plug" class="w-10 h-10 mx-auto"></i></div>
659
- <p class="text-muted-foreground">${t('empty.noMcpServers')}</p>
660
- <p class="text-sm text-muted-foreground mt-1">${t('empty.addMcpServersHint')}</p>
661
- </div>
662
- ` : `
663
- <div class="mcp-server-grid grid gap-3">
664
- ${projectAvailableEntries.map(entry => {
665
- return renderProjectAvailableServerCard(entry);
666
- }).join('')}
667
- </div>
668
- `}
669
- </div>
670
-
671
- <!-- Global Available MCP Servers -->
672
- <div class="mcp-section mb-6">
673
- <div class="flex items-center justify-between mb-4">
674
- <div class="flex items-center gap-3">
675
- <div class="flex items-center gap-2">
676
- <i data-lucide="globe" class="w-5 h-5 text-success"></i>
677
- <h3 class="text-lg font-semibold text-foreground">${t('mcp.globalAvailable')}</h3>
678
- </div>
679
- <button class="px-3 py-1.5 text-sm bg-success text-success-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1"
680
- onclick="openMcpCreateModal('global')">
681
- <span>+</span> ${t('mcp.newGlobalServer')}
682
- </button>
683
- </div>
684
- <span class="text-sm text-muted-foreground">${globalManagementEntries.length} ${t('mcp.globalServersFrom')}</span>
685
- </div>
686
-
687
- ${globalManagementEntries.length === 0 ? `
688
- <div class="mcp-empty-state bg-card border border-border rounded-lg p-6 text-center">
689
- <div class="text-muted-foreground mb-3"><i data-lucide="globe" class="w-10 h-10 mx-auto"></i></div>
690
- <p class="text-muted-foreground">${t('empty.noGlobalMcpServers')}</p>
691
- <p class="text-sm text-muted-foreground mt-1">${t('empty.globalServersHint')}</p>
692
- </div>
693
- ` : `
694
- <div class="mcp-server-grid grid gap-3">
695
- ${globalManagementEntries.map(([serverName, serverConfig]) => {
696
- return renderGlobalManagementCard(serverName, serverConfig);
697
- }).join('')}
698
- </div>
699
- `}
700
- </div>
701
-
702
- <!-- Available MCP Servers from Other Projects -->
703
- <div class="mcp-section mb-6">
704
- <div class="flex items-center justify-between mb-4">
705
- <h3 class="text-lg font-semibold text-foreground">${t('mcp.availableOther')}</h3>
706
- <span class="text-sm text-muted-foreground">${otherProjectServers.length} ${t('mcp.serversAvailable')}</span>
707
- </div>
708
-
709
- ${otherProjectServers.length === 0 ? `
710
- <div class="mcp-empty-state bg-card border border-border rounded-lg p-6 text-center">
711
- <p class="text-muted-foreground">${t('empty.noAdditionalMcp')}</p>
712
- </div>
713
- ` : `
714
- <div class="mcp-server-grid grid gap-3">
715
- ${otherProjectServers.map(([serverName, serverInfo]) => {
716
- return renderAvailableServerCard(serverName, serverInfo);
717
- }).join('')}
718
- </div>
719
- `}
720
- </div>
721
-
722
- <!-- Cross-CLI Servers: Available from Codex (Claude mode) -->
723
- ${crossCliServers.length > 0 ? `
724
- <div class="mcp-section mb-6">
725
- <div class="flex items-center justify-between mb-4">
726
- <h3 class="text-lg font-semibold text-foreground flex items-center gap-2">
727
- <i data-lucide="circle-dashed" class="w-5 h-5 text-primary"></i>
728
- ${t('mcp.claude.copyFromCodex')}
729
- </h3>
730
- <span class="text-sm text-muted-foreground">${crossCliServers.length} ${t('mcp.serversAvailable')}</span>
731
- </div>
732
- <div class="mcp-server-grid grid gap-3">
733
- ${crossCliServers.map(server => renderCrossCliServerCard(server, true)).join('')}
734
- </div>
735
- </div>
736
- ` : ''}
737
-
738
- <!-- MCP Templates Section -->
739
- ${mcpTemplates.length > 0 ? `
740
- <div class="mcp-section mt-6">
741
- <div class="flex items-center justify-between mb-4">
742
- <h3 class="text-lg font-semibold text-foreground flex items-center gap-2">
743
- <i data-lucide="layout-template" class="w-5 h-5"></i>
744
- ${t('mcp.templates')}
745
- </h3>
746
- <span class="text-sm text-muted-foreground">${mcpTemplates.length} ${t('mcp.savedTemplates')}</span>
747
- </div>
748
-
749
- <div class="mcp-server-grid grid gap-3">
750
- ${mcpTemplates.map(template => `
751
- <div class="mcp-template-card mcp-server-card bg-card border border-border border-dashed rounded-lg p-4 hover:shadow-md hover:border-solid transition-all">
752
- <div class="flex items-start justify-between mb-3">
753
- <div class="flex items-center gap-2 flex-wrap">
754
- <span><i data-lucide="layout-template" class="w-5 h-5 text-muted-foreground"></i></span>
755
- <h4 class="font-semibold text-foreground">${escapeHtml(template.name)}</h4>
756
- ${template.description ? `
757
- <span class="text-xs px-2 py-0.5 bg-muted text-muted-foreground rounded-full truncate max-w-32" title="${escapeHtml(template.description)}">
758
- ${escapeHtml(template.description)}
759
- </span>
760
- ` : ''}
761
- </div>
762
- <div class="flex gap-2">
763
- <button class="px-3 py-1 text-xs bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity"
764
- data-template-name="${escapeHtml(template.name)}"
765
- data-scope="project"
766
- data-action="install-template"
767
- title="${t('mcp.installToProject')}">
768
- <i data-lucide="folder-plus" class="w-3.5 h-3.5 inline"></i>
769
- </button>
770
- <button class="px-3 py-1 text-xs bg-success text-success-foreground rounded hover:opacity-90 transition-opacity"
771
- data-template-name="${escapeHtml(template.name)}"
772
- data-scope="global"
773
- data-action="install-template"
774
- title="${t('mcp.installToGlobal')}">
775
- <i data-lucide="globe" class="w-3.5 h-3.5 inline"></i>
776
- </button>
777
- </div>
778
- </div>
779
-
780
- <div class="mcp-server-details text-sm space-y-1">
781
- <div class="flex items-center gap-2 text-muted-foreground">
782
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${t('mcp.cmd')}</span>
783
- <span class="truncate" title="${escapeHtml(template.serverConfig.command)}">${escapeHtml(template.serverConfig.command)}</span>
784
- </div>
785
- ${template.serverConfig.args && template.serverConfig.args.length > 0 ? `
786
- <div class="flex items-start gap-2 text-muted-foreground">
787
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">${t('mcp.args')}</span>
788
- <span class="text-xs font-mono truncate" title="${escapeHtml(template.serverConfig.args.join(' '))}">${escapeHtml(template.serverConfig.args.slice(0, 3).join(' '))}${template.serverConfig.args.length > 3 ? '...' : ''}</span>
789
- </div>
790
- ` : ''}
791
- </div>
792
-
793
- <div class="mt-3 pt-3 border-t border-border flex items-center justify-between gap-2">
794
- <div class="flex items-center gap-2">
795
- <button class="text-xs text-primary hover:text-primary/80 transition-colors flex items-center gap-1"
796
- data-template-name="${escapeHtml(template.name)}"
797
- data-scope="project"
798
- data-action="install-template"
799
- title="${t('mcp.installToProject')}">
800
- <i data-lucide="download" class="w-3 h-3"></i>
801
- ${t('mcp.toProject')}
802
- </button>
803
- <button class="text-xs text-success hover:text-success/80 transition-colors flex items-center gap-1"
804
- data-template-name="${escapeHtml(template.name)}"
805
- data-scope="global"
806
- data-action="install-template"
807
- title="${t('mcp.installToGlobal')}">
808
- <i data-lucide="globe" class="w-3 h-3"></i>
809
- ${t('mcp.toGlobal')}
810
- </button>
811
- </div>
812
- <button class="text-xs text-destructive hover:text-destructive/80 transition-colors"
813
- data-template-name="${escapeHtml(template.name)}"
814
- data-action="delete-template"
815
- title="${t('mcp.deleteTemplate')}">
816
- <i data-lucide="trash-2" class="w-3 h-3"></i>
817
- </button>
818
- </div>
819
- </div>
820
- `).join('')}
821
- </div>
822
- </div>
823
- ` : ''}
824
-
825
- <!-- Copy Codex Servers to Claude (Claude mode only) -->
826
- ${currentCliMode === 'claude' && Object.keys(codexMcpServers || {}).length > 0 ? `
827
- <div class="mcp-section mb-6">
828
- <div class="flex items-center justify-between mb-4">
829
- <h3 class="text-lg font-semibold text-foreground flex items-center gap-2">
830
- <i data-lucide="copy" class="w-5 h-5"></i>
831
- ${t('mcp.claude.copyFromCodex')}
832
- </h3>
833
- <span class="text-sm text-muted-foreground">${Object.keys(codexMcpServers || {}).length} ${t('mcp.serversAvailable')}</span>
834
- </div>
835
- <div class="mcp-server-grid grid gap-3">
836
- ${Object.entries(codexMcpServers || {}).map(([serverName, serverConfig]) => {
837
- const alreadyInClaude = mcpUserServers && mcpUserServers[serverName];
838
- const isStdio = !!serverConfig.command;
839
- const isHttp = !!serverConfig.url;
840
- return `
841
- <div class="mcp-server-card bg-card border ${alreadyInClaude ? 'border-success/50' : 'border-primary/20'} border-dashed rounded-lg p-4 hover:shadow-md transition-all">
842
- <div class="flex items-start justify-between mb-3">
843
- <div class="flex items-center gap-2 flex-wrap">
844
- <i data-lucide="code-2" class="w-5 h-5 text-primary"></i>
845
- <h4 class="font-semibold text-foreground">${escapeHtml(serverName)}</h4>
846
- <span class="text-xs px-2 py-0.5 bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300 rounded-full">Codex</span>
847
- ${isHttp
848
- ? '<span class="text-xs px-2 py-0.5 bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300 rounded-full">HTTP</span>'
849
- : '<span class="text-xs px-2 py-0.5 bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300 rounded-full">STDIO</span>'
850
- }
851
- ${alreadyInClaude ? '<span class="text-xs px-2 py-0.5 bg-success/10 text-success rounded-full">' + t('mcp.claude.alreadyAdded') + '</span>' : ''}
852
- </div>
853
- ${!alreadyInClaude ? `
854
- <button class="px-3 py-1 text-xs bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity"
855
- data-action="copy-codex-to-claude"
856
- data-server-name="${escapeHtml(serverName)}"
857
- data-server-config="${encodeConfigData(serverConfig)}"
858
- title="${t('mcp.claude.copyToClaude')}">
859
- <i data-lucide="arrow-right" class="w-3.5 h-3.5 inline"></i> Claude
860
- </button>
861
- ` : ''}
862
- </div>
863
- <div class="mcp-server-details text-sm space-y-1">
864
- <div class="flex items-center gap-2 text-muted-foreground">
865
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${isHttp ? t('mcp.url') : t('mcp.cmd')}</span>
866
- <span class="truncate" title="${escapeHtml(serverConfig.command || serverConfig.url || 'N/A')}">${escapeHtml(serverConfig.command || serverConfig.url || 'N/A')}</span>
867
- </div>
868
- </div>
869
- </div>
870
- `;
871
- }).join('')}
872
- </div>
873
- </div>
874
- ` : ''}
875
-
876
- <!-- All Projects MCP Overview Table (Claude mode only) -->
877
- ${currentCliMode === 'claude' ? `
878
- <div class="mcp-section mt-6">
879
- <div class="flex items-center justify-between mb-4">
880
- <h3 class="text-lg font-semibold text-foreground">${t('mcp.allProjects')}</h3>
881
- <span class="text-sm text-muted-foreground">${Object.keys(mcpAllProjects).length} ${t('mcp.projects')}</span>
882
- </div>
883
-
884
- <div class="mcp-projects-table bg-card border border-border rounded-lg overflow-hidden">
885
- <table class="w-full">
886
- <thead class="bg-muted/50">
887
- <tr>
888
- <th class="text-left px-4 py-3 text-sm font-semibold text-foreground border-b border-border">${t('mcp.project')}</th>
889
- <th class="text-left px-4 py-3 text-sm font-semibold text-foreground border-b border-border">${t('mcp.servers')}</th>
890
- <th class="text-center px-4 py-3 text-sm font-semibold text-foreground border-b border-border w-24">${t('mcp.status')}</th>
891
- </tr>
892
- </thead>
893
- <tbody>
894
- ${Object.entries(mcpAllProjects).map(([path, config]) => {
895
- const servers = config.mcpServers || {};
896
- const projectDisabled = config.disabledMcpServers || [];
897
- const serverNames = Object.keys(servers);
898
- const isCurrentProject = path === currentPath;
899
- const enabledCount = serverNames.filter(s => !projectDisabled.includes(s)).length;
900
- const projectHasMcpJson = config.hasMcpJson || false;
901
-
902
- return `
903
- <tr class="border-b border-border last:border-b-0 ${isCurrentProject ? 'bg-primary/5' : 'hover:bg-hover/50'}">
904
- <td class="px-4 py-3">
905
- <div class="flex items-center gap-2 min-w-0">
906
- <span class="shrink-0">${isCurrentProject ? '<i data-lucide="map-pin" class="w-4 h-4 text-primary"></i>' : '<i data-lucide="folder" class="w-4 h-4"></i>'}</span>
907
- <div class="min-w-0">
908
- <div class="font-medium text-foreground truncate text-sm flex items-center gap-2" title="${escapeHtml(path)}">
909
- <span class="truncate">${escapeHtml(path.split('\\').pop() || path)}</span>
910
- ${isCurrentProject ? `<span class="text-xs text-primary font-medium shrink-0">${t('mcp.current')}</span>` : ''}
911
- ${projectHasMcpJson ? `<span class="shrink-0 inline-flex items-center gap-1 px-1.5 py-0.5 text-xs bg-success/10 text-success rounded" title=".mcp.json detected"><i data-lucide="file-check" class="w-3 h-3"></i></span>` : ''}
912
- </div>
913
- <div class="text-xs text-muted-foreground truncate">${escapeHtml(path)}</div>
914
- </div>
915
- </div>
916
- </td>
917
- <td class="px-4 py-3">
918
- <div class="flex flex-wrap gap-1.5">
919
- ${serverNames.length === 0
920
- ? `<span class="text-xs text-muted-foreground italic">${t('mcp.noMcpServers')}</span>`
921
- : serverNames.map(serverName => {
922
- const isEnabled = !projectDisabled.includes(serverName);
923
- return `
924
- <span class="inline-flex items-center gap-1 px-2 py-0.5 text-xs font-medium rounded-full ${isEnabled ? 'bg-success-light text-success' : 'bg-hover text-muted-foreground'}">
925
- <span class="w-1.5 h-1.5 rounded-full ${isEnabled ? 'bg-success' : 'bg-muted-foreground'}"></span>
926
- ${escapeHtml(serverName)}
927
- </span>
928
- `;
929
- }).join('')
930
- }
931
- </div>
932
- </td>
933
- <td class="px-4 py-3 text-center">
934
- <span class="inline-flex items-center px-2 py-1 text-xs font-semibold rounded-full ${serverNames.length > 0 ? 'bg-success-light text-success' : 'bg-hover text-muted-foreground'}">
935
- ${enabledCount}/${serverNames.length}
936
- </span>
937
- </td>
938
- </tr>
939
- `;
940
- }).join('')}
941
- </tbody>
942
- </table>
943
- </div>
944
- </div>
945
- ` : ''}
946
- `}
947
-
948
- <!-- MCP Server Details Modal -->
949
- <div id="mcpDetailsModal" class="fixed inset-0 bg-black/50 flex items-center justify-center z-50 hidden">
950
- <div class="bg-card border border-border rounded-lg shadow-xl max-w-2xl w-full mx-4 max-h-[80vh] overflow-hidden flex flex-col">
951
- <!-- Modal Header -->
952
- <div class="flex items-center justify-between px-6 py-4 border-b border-border">
953
- <h2 class="text-lg font-semibold text-foreground">${t('mcp.detailsModal.title')}</h2>
954
- <button id="mcpDetailsModalClose" class="text-muted-foreground hover:text-foreground transition-colors">
955
- <i data-lucide="x" class="w-5 h-5"></i>
956
- </button>
957
- </div>
958
-
959
- <!-- Modal Body -->
960
- <div id="mcpDetailsModalBody" class="px-6 py-4 overflow-y-auto flex-1">
961
- <!-- Content will be dynamically filled -->
962
- </div>
963
- </div>
964
- </div>
965
- </div>
966
- `;
967
-
968
- // Initialize Lucide icons FIRST (before attaching event listeners)
969
- // lucide.createIcons() may replace DOM elements, which would remove event listeners
970
- if (typeof lucide !== 'undefined') lucide.createIcons();
971
-
972
- // Attach event listeners AFTER icon initialization
973
- attachMcpEventListeners();
974
- }
975
-
976
- // Render card for Project Available MCP (current project can use)
977
- function renderProjectAvailableServerCard(entry) {
978
- const { name, config, source, canRemove, canToggle, isEnabled } = entry;
979
- const command = config.command || 'N/A';
980
- const args = config.args || [];
981
- const hasEnv = config.env && Object.keys(config.env).length > 0;
982
-
983
- // Source badge
984
- let sourceBadge = '';
985
- if (source === 'enterprise') {
986
- sourceBadge = `<span class="text-xs px-2 py-0.5 bg-warning/20 text-warning rounded-full">${t('mcp.sourceEnterprise')}</span>`;
987
- } else if (source === 'global') {
988
- sourceBadge = `<span class="text-xs px-2 py-0.5 bg-success/10 text-success rounded-full">${t('mcp.sourceGlobal')}</span>`;
989
- } else if (source === 'project') {
990
- sourceBadge = `<span class="text-xs px-2 py-0.5 bg-primary/10 text-primary rounded-full">${t('mcp.sourceProject')}</span>`;
991
- }
992
-
993
- return `
994
- <div class="mcp-server-card bg-card border border-border rounded-lg p-4 hover:shadow-md transition-all cursor-pointer ${canToggle && !isEnabled ? 'opacity-60' : ''}"
995
- data-server-name="${escapeHtml(name)}"
996
- data-server-config="${encodeConfigData(config)}"
997
- data-server-source="${source}"
998
- data-action="view-details"
999
- title="${t('mcp.clickToViewDetails')}">
1000
- <div class="flex items-start justify-between mb-3">
1001
- <div class="flex items-center gap-2">
1002
- <span>${canToggle && isEnabled ? '<i data-lucide="check-circle" class="w-5 h-5 text-success"></i>' : '<i data-lucide="circle" class="w-5 h-5 text-muted-foreground"></i>'}</span>
1003
- <h4 class="font-semibold text-foreground">${escapeHtml(name)}</h4>
1004
- ${sourceBadge}
1005
- </div>
1006
- ${canToggle ? `
1007
- <label class="mcp-toggle relative inline-flex items-center cursor-pointer" onclick="event.stopPropagation()">
1008
- <input type="checkbox" class="sr-only peer"
1009
- ${isEnabled ? 'checked' : ''}
1010
- data-server-name="${escapeHtml(name)}"
1011
- data-action="toggle">
1012
- <div class="w-9 h-5 bg-hover peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-success"></div>
1013
- </label>
1014
- ` : ''}
1015
- </div>
1016
-
1017
- <div class="mcp-server-details text-sm space-y-1">
1018
- <div class="flex items-center gap-2 text-muted-foreground">
1019
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${t('mcp.cmd')}</span>
1020
- <span class="truncate" title="${escapeHtml(command)}">${escapeHtml(command)}</span>
1021
- </div>
1022
- ${args.length > 0 ? `
1023
- <div class="flex items-start gap-2 text-muted-foreground">
1024
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">${t('mcp.args')}</span>
1025
- <span class="text-xs font-mono truncate" title="${escapeHtml(args.join(' '))}">${escapeHtml(args.slice(0, 3).join(' '))}${args.length > 3 ? '...' : ''}</span>
1026
- </div>
1027
- ` : ''}
1028
- ${hasEnv ? `
1029
- <div class="flex items-center gap-2 text-muted-foreground">
1030
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${t('mcp.env')}</span>
1031
- <span class="text-xs">${Object.keys(config.env).length} ${t('mcp.variables')}</span>
1032
- </div>
1033
- ` : ''}
1034
- </div>
1035
-
1036
- <div class="mt-3 pt-3 border-t border-border flex items-center justify-between gap-2">
1037
- <div class="flex items-center gap-2">
1038
- <button class="text-xs text-success hover:text-success/80 transition-colors flex items-center gap-1"
1039
- data-server-name="${escapeHtml(name)}"
1040
- data-server-config="${encodeConfigData(config)}"
1041
- data-action="save-as-template"
1042
- onclick="event.stopPropagation()"
1043
- title="${t('mcp.saveAsTemplate')}">
1044
- <i data-lucide="save" class="w-3 h-3"></i>
1045
- ${t('mcp.saveAsTemplate')}
1046
- </button>
1047
- </div>
1048
- ${canRemove ? `
1049
- <button class="text-xs text-destructive hover:text-destructive/80 transition-colors"
1050
- data-server-name="${escapeHtml(name)}"
1051
- data-action="remove"
1052
- onclick="event.stopPropagation()">
1053
- ${t('mcp.removeFromProject')}
1054
- </button>
1055
- ` : ''}
1056
- </div>
1057
- </div>
1058
- `;
1059
- }
1060
-
1061
- // Render card for Global Management (manage global servers)
1062
- function renderGlobalManagementCard(serverName, serverConfig) {
1063
- const command = serverConfig.command || serverConfig.url || 'N/A';
1064
- const args = serverConfig.args || [];
1065
- const hasEnv = serverConfig.env && Object.keys(serverConfig.env).length > 0;
1066
- const serverType = serverConfig.type || 'stdio';
1067
-
1068
- return `
1069
- <div class="mcp-server-card mcp-server-global bg-card border border-success/30 rounded-lg p-4 hover:shadow-md transition-all cursor-pointer"
1070
- data-server-name="${escapeHtml(serverName)}"
1071
- data-server-config="${encodeConfigData(serverConfig)}"
1072
- data-server-source="global"
1073
- data-action="view-details"
1074
- title="${t('mcp.clickToEdit')}">
1075
- <div class="flex items-start justify-between mb-3">
1076
- <div class="flex items-center gap-2">
1077
- <i data-lucide="globe" class="w-5 h-5 text-success"></i>
1078
- <h4 class="font-semibold text-foreground">${escapeHtml(serverName)}</h4>
1079
- </div>
1080
- </div>
1081
-
1082
- <div class="mcp-server-details text-sm space-y-1">
1083
- <div class="flex items-center gap-2 text-muted-foreground">
1084
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${serverType === 'stdio' ? t('mcp.cmd') : t('mcp.url')}</span>
1085
- <span class="truncate" title="${escapeHtml(command)}">${escapeHtml(command)}</span>
1086
- </div>
1087
- ${args.length > 0 ? `
1088
- <div class="flex items-start gap-2 text-muted-foreground">
1089
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">${t('mcp.args')}</span>
1090
- <span class="text-xs font-mono truncate" title="${escapeHtml(args.join(' '))}">${escapeHtml(args.slice(0, 3).join(' '))}${args.length > 3 ? '...' : ''}</span>
1091
- </div>
1092
- ` : ''}
1093
- ${hasEnv ? `
1094
- <div class="flex items-center gap-2 text-muted-foreground">
1095
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${t('mcp.env')}</span>
1096
- <span class="text-xs">${Object.keys(serverConfig.env).length} ${t('mcp.variables')}</span>
1097
- </div>
1098
- ` : ''}
1099
- <div class="flex items-center gap-2 text-muted-foreground mt-1">
1100
- <span class="text-xs italic">${t('mcp.availableToAll')}</span>
1101
- </div>
1102
- </div>
1103
-
1104
- <div class="mt-3 pt-3 border-t border-border flex items-center justify-end">
1105
- <button class="text-xs text-destructive hover:text-destructive/80 transition-colors"
1106
- data-server-name="${escapeHtml(serverName)}"
1107
- data-action="remove-global"
1108
- onclick="event.stopPropagation()">
1109
- ${t('mcp.removeGlobal')}
1110
- </button>
1111
- </div>
1112
- </div>
1113
- `;
1114
- }
1115
-
1116
- function renderAvailableServerCard(serverName, serverInfo) {
1117
- const serverConfig = serverInfo.config;
1118
- const usedIn = serverInfo.usedIn || [];
1119
- const command = serverConfig.command || 'N/A';
1120
- const args = serverConfig.args || [];
1121
-
1122
- // Get the actual name to use when adding (original name if different from display key)
1123
- const originalName = serverInfo.originalName || serverName;
1124
- const hasVariant = serverInfo.originalName && serverInfo.originalName !== serverName;
1125
-
1126
- // Get source project info
1127
- const sourceProject = serverInfo.sourceProject;
1128
- const sourceProjectName = sourceProject ? (sourceProject.split('\\').pop() || sourceProject.split('/').pop()) : null;
1129
-
1130
- // Generate args preview
1131
- const argsPreview = args.length > 0 ? args.slice(0, 3).join(' ') + (args.length > 3 ? '...' : '') : '';
1132
-
1133
- return `
1134
- <div class="mcp-server-card mcp-server-available bg-card border border-border border-dashed rounded-lg p-4 hover:shadow-md hover:border-solid transition-all">
1135
- <div class="flex items-start justify-between mb-3">
1136
- <div class="flex items-center gap-2 flex-wrap">
1137
- <span><i data-lucide="circle-dashed" class="w-5 h-5 text-muted-foreground"></i></span>
1138
- <h4 class="font-semibold text-foreground">${escapeHtml(originalName)}</h4>
1139
- ${hasVariant ? `
1140
- <span class="text-xs px-2 py-0.5 bg-warning/20 text-warning rounded-full" title="Different config from: ${escapeHtml(sourceProject || '')}">
1141
- ${escapeHtml(sourceProjectName || 'variant')}
1142
- </span>
1143
- ` : ''}
1144
- </div>
1145
- <div class="flex gap-2">
1146
- <button class="px-3 py-1 text-xs bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity"
1147
- data-server-name="${escapeHtml(originalName)}"
1148
- data-server-key="${escapeHtml(serverName)}"
1149
- data-server-config="${encodeConfigData(serverConfig)}"
1150
- data-scope="project"
1151
- data-action="add-from-other"
1152
- title="${t('mcp.installToProject')}">
1153
- <i data-lucide="folder-plus" class="w-3.5 h-3.5 inline"></i>
1154
- </button>
1155
- <button class="px-3 py-1 text-xs bg-success text-success-foreground rounded hover:opacity-90 transition-opacity"
1156
- data-server-name="${escapeHtml(originalName)}"
1157
- data-server-key="${escapeHtml(serverName)}"
1158
- data-server-config="${encodeConfigData(serverConfig)}"
1159
- data-scope="global"
1160
- data-action="add-from-other"
1161
- title="${t('mcp.installToGlobal')}">
1162
- <i data-lucide="globe" class="w-3.5 h-3.5 inline"></i>
1163
- </button>
1164
- </div>
1165
- </div>
1166
-
1167
- <div class="mcp-server-details text-sm space-y-1">
1168
- <div class="flex items-center gap-2 text-muted-foreground">
1169
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${t('mcp.cmd')}</span>
1170
- <span class="truncate" title="${escapeHtml(command)}">${escapeHtml(command)}</span>
1171
- </div>
1172
- ${argsPreview ? `
1173
- <div class="flex items-start gap-2 text-muted-foreground">
1174
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">${t('mcp.args')}</span>
1175
- <span class="text-xs font-mono truncate" title="${escapeHtml(args.join(' '))}">${escapeHtml(argsPreview)}</span>
1176
- </div>
1177
- ` : ''}
1178
- <div class="flex items-center gap-2 text-muted-foreground">
1179
- <span class="text-xs">${t('mcp.usedInCount').replace('{count}', usedIn.length).replace('{s}', usedIn.length !== 1 ? 's' : '')}</span>
1180
- ${sourceProjectName ? `<span class="text-xs text-muted-foreground/70">• ${t('mcp.from')} ${escapeHtml(sourceProjectName)}</span>` : ''}
1181
- </div>
1182
- </div>
1183
-
1184
- <div class="mt-3 pt-3 border-t border-border flex items-center gap-2">
1185
- <button class="text-xs text-primary hover:text-primary/80 transition-colors flex items-center gap-1"
1186
- data-server-name="${escapeHtml(originalName)}"
1187
- data-server-config="${encodeConfigData(serverConfig)}"
1188
- data-action="install-to-project"
1189
- title="${t('mcp.installToProject')}">
1190
- <i data-lucide="download" class="w-3 h-3"></i>
1191
- ${t('mcp.installToProject')}
1192
- </button>
1193
- <button class="text-xs text-success hover:text-success/80 transition-colors flex items-center gap-1"
1194
- data-server-name="${escapeHtml(originalName)}"
1195
- data-server-config="${encodeConfigData(serverConfig)}"
1196
- data-action="install-to-global"
1197
- title="${t('mcp.installToGlobal')}">
1198
- <i data-lucide="globe" class="w-3 h-3"></i>
1199
- ${t('mcp.installToGlobal')}
1200
- </button>
1201
- </div>
1202
- </div>
1203
- `;
1204
- }
1205
-
1206
- // Render available server card for Codex mode (with Claude badge and copy to Codex button)
1207
- function renderAvailableServerCardForCodex(serverName, serverInfo) {
1208
- const serverConfig = serverInfo.config;
1209
- const usedIn = serverInfo.usedIn || [];
1210
- const command = serverConfig.command || serverConfig.url || 'N/A';
1211
- const args = serverConfig.args || [];
1212
-
1213
- // Get the actual name to use when adding
1214
- const originalName = serverInfo.originalName || serverName;
1215
- const hasVariant = serverInfo.originalName && serverInfo.originalName !== serverName;
1216
-
1217
- // Get source project info
1218
- const sourceProject = serverInfo.sourceProject;
1219
- const sourceProjectName = sourceProject ? (sourceProject.split('\\').pop() || sourceProject.split('/').pop()) : null;
1220
-
1221
- // Generate args preview
1222
- const argsPreview = args.length > 0 ? args.slice(0, 3).join(' ') + (args.length > 3 ? '...' : '') : '';
1223
-
1224
- // Check if already in Codex
1225
- const alreadyInCodex = codexMcpServers && codexMcpServers[originalName];
1226
-
1227
- return `
1228
- <div class="mcp-server-card mcp-server-available bg-card border ${alreadyInCodex ? 'border-success/50' : 'border-border'} border-dashed rounded-lg p-4 hover:shadow-md hover:border-solid transition-all">
1229
- <div class="flex items-start justify-between mb-3">
1230
- <div class="flex items-center gap-2 flex-wrap">
1231
- <span><i data-lucide="circle-dashed" class="w-5 h-5 text-muted-foreground"></i></span>
1232
- <h4 class="font-semibold text-foreground">${escapeHtml(originalName)}</h4>
1233
- <span class="text-xs px-2 py-0.5 bg-primary/10 text-primary rounded-full">Claude</span>
1234
- ${hasVariant ? `
1235
- <span class="text-xs px-2 py-0.5 bg-warning/20 text-warning rounded-full" title="Different config from: ${escapeHtml(sourceProject || '')}">
1236
- ${escapeHtml(sourceProjectName || 'variant')}
1237
- </span>
1238
- ` : ''}
1239
- ${alreadyInCodex ? `<span class="text-xs px-2 py-0.5 bg-success/10 text-success rounded-full">${t('mcp.codex.alreadyAdded')}</span>` : ''}
1240
- </div>
1241
- ${!alreadyInCodex ? `
1242
- <button class="px-3 py-1 text-xs bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity"
1243
- data-action="copy-to-codex"
1244
- data-server-name="${escapeHtml(originalName)}"
1245
- data-server-config="${encodeConfigData(serverConfig)}"
1246
- title="${t('mcp.codex.copyToCodex')}">
1247
- <i data-lucide="arrow-right" class="w-3.5 h-3.5 inline"></i> Codex
1248
- </button>
1249
- ` : ''}
1250
- </div>
1251
-
1252
- <div class="mcp-server-details text-sm space-y-1">
1253
- <div class="flex items-center gap-2 text-muted-foreground">
1254
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${t('mcp.cmd')}</span>
1255
- <span class="truncate" title="${escapeHtml(command)}">${escapeHtml(command)}</span>
1256
- </div>
1257
- ${argsPreview ? `
1258
- <div class="flex items-start gap-2 text-muted-foreground">
1259
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">${t('mcp.args')}</span>
1260
- <span class="text-xs font-mono truncate" title="${escapeHtml(args.join(' '))}">${escapeHtml(argsPreview)}</span>
1261
- </div>
1262
- ` : ''}
1263
- <div class="flex items-center gap-2 text-muted-foreground">
1264
- <span class="text-xs">${t('mcp.usedInCount').replace('{count}', usedIn.length).replace('{s}', usedIn.length !== 1 ? 's' : '')}</span>
1265
- ${sourceProjectName ? `<span class="text-xs text-muted-foreground/70">• ${t('mcp.from')} ${escapeHtml(sourceProjectName)}</span>` : ''}
1266
- </div>
1267
- </div>
1268
-
1269
- <div class="mt-3 pt-3 border-t border-border flex items-center gap-2">
1270
- <button class="text-xs text-primary hover:text-primary/80 transition-colors flex items-center gap-1"
1271
- data-action="copy-to-codex"
1272
- data-server-name="${escapeHtml(originalName)}"
1273
- data-server-config="${encodeConfigData(serverConfig)}"
1274
- title="${t('mcp.codex.copyToCodex')}">
1275
- <i data-lucide="download" class="w-3 h-3"></i>
1276
- ${t('mcp.codex.install')}
1277
- </button>
1278
- </div>
1279
- </div>
1280
- `;
1281
- }
1282
-
1283
- // ========================================
1284
- // Codex MCP Server Card Renderer
1285
- // ========================================
1286
-
1287
- function renderCodexServerCard(serverName, serverConfig) {
1288
- const isStdio = !!serverConfig.command;
1289
- const isHttp = !!serverConfig.url;
1290
- const isEnabled = serverConfig.enabled !== false; // Default to enabled
1291
- const command = serverConfig.command || serverConfig.url || 'N/A';
1292
- const args = serverConfig.args || [];
1293
- const hasEnv = serverConfig.env && Object.keys(serverConfig.env).length > 0;
1294
-
1295
- // Server type badge
1296
- const typeBadge = isHttp
1297
- ? `<span class="text-xs px-2 py-0.5 bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300 rounded-full">HTTP</span>`
1298
- : `<span class="text-xs px-2 py-0.5 bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300 rounded-full">STDIO</span>`;
1299
-
1300
- return `
1301
- <div class="mcp-server-card bg-card border border-primary/20 rounded-lg p-4 hover:shadow-md transition-all cursor-pointer ${!isEnabled ? 'opacity-60' : ''}"
1302
- data-server-name="${escapeHtml(serverName)}"
1303
- data-server-config="${encodeConfigData(serverConfig)}"
1304
- data-cli-type="codex"
1305
- data-action="view-details-codex"
1306
- title="${t('mcp.clickToEdit')}">
1307
- <div class="flex items-start justify-between mb-3">
1308
- <div class="flex items-center gap-2 flex-wrap">
1309
- <span>${isEnabled ? '<i data-lucide="check-circle" class="w-5 h-5 text-primary"></i>' : '<i data-lucide="circle" class="w-5 h-5 text-muted-foreground"></i>'}</span>
1310
- <h4 class="font-semibold text-foreground">${escapeHtml(serverName)}</h4>
1311
- <span class="text-xs px-2 py-0.5 bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300 rounded-full">Codex</span>
1312
- ${typeBadge}
1313
- </div>
1314
- <label class="mcp-toggle relative inline-flex items-center cursor-pointer" onclick="event.stopPropagation()">
1315
- <input type="checkbox" class="sr-only peer"
1316
- ${isEnabled ? 'checked' : ''}
1317
- data-server-name="${escapeHtml(serverName)}"
1318
- data-action="toggle-codex">
1319
- <div class="w-9 h-5 bg-hover peer-focus:outline-none rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-primary"></div>
1320
- </label>
1321
- </div>
1322
-
1323
- <div class="mcp-server-details text-sm space-y-1">
1324
- <div class="flex items-center gap-2 text-muted-foreground">
1325
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${isHttp ? t('mcp.url') : t('mcp.cmd')}</span>
1326
- <span class="truncate" title="${escapeHtml(command)}">${escapeHtml(command)}</span>
1327
- </div>
1328
- ${args.length > 0 ? `
1329
- <div class="flex items-start gap-2 text-muted-foreground">
1330
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">${t('mcp.args')}</span>
1331
- <span class="text-xs font-mono truncate" title="${escapeHtml(args.join(' '))}">${escapeHtml(args.slice(0, 3).join(' '))}${args.length > 3 ? '...' : ''}</span>
1332
- </div>
1333
- ` : ''}
1334
- ${hasEnv ? `
1335
- <div class="flex items-center gap-2 text-muted-foreground">
1336
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${t('mcp.env')}</span>
1337
- <span class="text-xs">${Object.keys(serverConfig.env).length} ${t('mcp.variables')}</span>
1338
- </div>
1339
- ` : ''}
1340
- ${serverConfig.enabled_tools ? `
1341
- <div class="flex items-center gap-2 text-muted-foreground">
1342
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${t('mcp.codex.enabledTools')}</span>
1343
- <span class="text-xs">${serverConfig.enabled_tools.length} ${t('mcp.codex.tools')}</span>
1344
- </div>
1345
- ` : ''}
1346
- </div>
1347
-
1348
- <div class="mt-3 pt-3 border-t border-border flex items-center justify-between gap-2" onclick="event.stopPropagation()">
1349
- <div class="flex items-center gap-2">
1350
- <button class="text-xs text-primary hover:text-primary/80 transition-colors flex items-center gap-1"
1351
- data-action="copy-codex-to-claude"
1352
- data-server-name="${escapeHtml(serverName)}"
1353
- data-server-config="${encodeConfigData(serverConfig)}"
1354
- title="${t('mcp.codex.copyToClaude')}">
1355
- <i data-lucide="copy" class="w-3 h-3"></i>
1356
- ${t('mcp.codex.copyToClaude')}
1357
- </button>
1358
- </div>
1359
- <button class="text-xs text-destructive hover:text-destructive/80 transition-colors"
1360
- data-server-name="${escapeHtml(serverName)}"
1361
- data-action="remove-codex">
1362
- ${t('mcp.codex.remove')}
1363
- </button>
1364
- </div>
1365
- </div>
1366
- `;
1367
- }
1368
-
1369
- // Render card for cross-CLI servers (servers from other CLI not in current CLI)
1370
- function renderCrossCliServerCard(server, isClaude) {
1371
- const { name, config, fromCli } = server;
1372
- const isStdio = !!config.command;
1373
- const isHttp = !!config.url;
1374
- const command = config.command || config.url || 'N/A';
1375
- const args = config.args || [];
1376
-
1377
- // Icon and color based on source CLI
1378
- const icon = fromCli === 'codex' ? 'circle-dashed' : 'circle';
1379
- const sourceBadgeColor = fromCli === 'codex' ? 'green' : 'orange';
1380
- const targetCli = isClaude ? 'project' : 'codex';
1381
- const buttonText = isClaude ? t('mcp.codex.copyToClaude') : t('mcp.claude.copyToCodex');
1382
- const typeBadge = isHttp
1383
- ? `<span class="text-xs px-2 py-0.5 bg-blue-100 text-blue-700 dark:bg-blue-900/30 dark:text-blue-300 rounded-full">HTTP</span>`
1384
- : `<span class="text-xs px-2 py-0.5 bg-muted text-muted-foreground rounded-full">STDIO</span>`;
1385
-
1386
- // CLI badge with color
1387
- const cliBadge = fromCli === 'codex'
1388
- ? `<span class="text-xs px-2 py-0.5 bg-green-100 text-green-700 dark:bg-green-900/30 dark:text-green-300 rounded-full">Codex</span>`
1389
- : `<span class="text-xs px-2 py-0.5 bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300 rounded-full">Claude</span>`;
1390
-
1391
- return `
1392
- <div class="mcp-server-card bg-card border border-dashed border-primary/20 rounded-lg p-4 hover:shadow-md hover:border-solid transition-all">
1393
- <div class="flex items-start justify-between mb-3">
1394
- <div class="flex items-start gap-3">
1395
- <div class="shrink-0">
1396
- <i data-lucide="${icon}" class="w-5 h-5 text-primary"></i>
1397
- </div>
1398
- <div>
1399
- <div class="flex items-center gap-2 flex-wrap mb-1">
1400
- <h4 class="font-semibold text-foreground">${escapeHtml(name)}</h4>
1401
- ${cliBadge}
1402
- ${typeBadge}
1403
- </div>
1404
- <div class="text-sm space-y-1 text-muted-foreground">
1405
- <div class="flex items-center gap-2">
1406
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded">${isHttp ? t('mcp.url') : t('mcp.cmd')}</span>
1407
- <span class="truncate text-xs" title="${escapeHtml(command)}">${escapeHtml(command)}</span>
1408
- </div>
1409
- ${args.length > 0 ? `
1410
- <div class="flex items-start gap-2">
1411
- <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">${t('mcp.args')}</span>
1412
- <span class="text-xs font-mono truncate" title="${escapeHtml(args.join(' '))}">${escapeHtml(args.slice(0, 3).join(' '))}${args.length > 3 ? '...' : ''}</span>
1413
- </div>
1414
- ` : ''}
1415
- </div>
1416
- </div>
1417
- </div>
1418
- </div>
1419
- <div class="mt-3 pt-3 border-t border-border">
1420
- <button class="w-full px-3 py-2 text-sm font-medium bg-primary hover:bg-primary/90 text-primary-foreground rounded-lg transition-colors flex items-center justify-center gap-1.5"
1421
- data-action="copy-cross-cli"
1422
- data-server-name="${escapeHtml(name)}"
1423
- data-server-config="${encodeConfigData(config)}"
1424
- data-from-cli="${fromCli}"
1425
- data-target-cli="${targetCli}">
1426
- <i data-lucide="copy" class="w-4 h-4"></i>
1427
- ${buttonText}
1428
- </button>
1429
- </div>
1430
- </div>
1431
- `;
1432
- }
1433
-
1434
- // Copy server from one CLI to another
1435
- async function copyCrossCliServer(name, config, fromCli, targetCli) {
1436
- try {
1437
- let endpoint, body;
1438
-
1439
- if (targetCli === 'codex') {
1440
- // Copy from Claude to Codex
1441
- endpoint = '/api/codex-mcp-add';
1442
- body = { serverName: name, serverConfig: config };
1443
- } else if (targetCli === 'project') {
1444
- // Copy from Codex to Claude project
1445
- endpoint = '/api/mcp-copy-server';
1446
- body = { projectPath, serverName: name, serverConfig: config, configType: 'mcp' };
1447
- } else if (targetCli === 'global') {
1448
- // Copy to Claude global
1449
- endpoint = '/api/mcp-add-global-server';
1450
- body = { serverName: name, serverConfig: config };
1451
- }
1452
-
1453
- const res = await fetch(endpoint, {
1454
- method: 'POST',
1455
- headers: { 'Content-Type': 'application/json' },
1456
- body: JSON.stringify(body)
1457
- });
1458
-
1459
- const data = await res.json();
1460
- if (data.success) {
1461
- const targetName = targetCli === 'codex' ? 'Codex' : 'Claude';
1462
- showToast(t('mcp.success'), `${t('mcp.serverInstalled')} (${targetName})`, 'success');
1463
- await loadMcpConfig();
1464
- renderMcpManager();
1465
- } else {
1466
- showToast(t('mcp.error'), data.error, 'error');
1467
- }
1468
- } catch (error) {
1469
- showToast(t('mcp.error'), error.message, 'error');
1470
- }
1471
- }
1472
-
1473
- // ========================================
1474
- // Codex MCP Create Modal
1475
- // ========================================
1476
-
1477
- function openCodexMcpCreateModal() {
1478
- // Reuse the existing modal with different settings
1479
- const modal = document.getElementById('mcpCreateModal');
1480
- if (modal) {
1481
- modal.classList.remove('hidden');
1482
- // Reset to form mode
1483
- mcpCreateMode = 'form';
1484
- switchMcpCreateTab('form');
1485
- // Clear form
1486
- document.getElementById('mcpServerName').value = '';
1487
- document.getElementById('mcpServerCommand').value = '';
1488
- document.getElementById('mcpServerArgs').value = '';
1489
- document.getElementById('mcpServerEnv').value = '';
1490
- // Clear JSON input
1491
- document.getElementById('mcpServerJson').value = '';
1492
- document.getElementById('mcpJsonPreview').classList.add('hidden');
1493
- // Set scope to codex
1494
- const scopeSelect = document.getElementById('mcpServerScope');
1495
- if (scopeSelect) {
1496
- // Add codex option if not exists
1497
- if (!scopeSelect.querySelector('option[value="codex"]')) {
1498
- const codexOption = document.createElement('option');
1499
- codexOption.value = 'codex';
1500
- codexOption.textContent = t('mcp.codex.scopeCodex');
1501
- scopeSelect.appendChild(codexOption);
1502
- }
1503
- scopeSelect.value = 'codex';
1504
- }
1505
- // Focus on name input
1506
- document.getElementById('mcpServerName').focus();
1507
- // Setup JSON input listener
1508
- setupMcpJsonListener();
1509
- }
1510
- }
1511
-
1512
- function attachMcpEventListeners() {
1513
- // Debug: Log event listener attachment
1514
- const viewDetailsCards = document.querySelectorAll('.mcp-server-card[data-action="view-details"]');
1515
- const codexCards = document.querySelectorAll('.mcp-server-card[data-action="view-details-codex"]');
1516
- console.log('[MCP] Attaching event listeners - Claude cards:', viewDetailsCards.length, 'Codex cards:', codexCards.length);
1517
-
1518
- // Toggle switches
1519
- document.querySelectorAll('.mcp-server-card input[data-action="toggle"]').forEach(input => {
1520
- input.addEventListener('change', async (e) => {
1521
- const serverName = e.target.dataset.serverName;
1522
- const enable = e.target.checked;
1523
- await toggleMcpServer(serverName, enable);
1524
- });
1525
- });
1526
-
1527
- // Add from other projects (with scope selection)
1528
- document.querySelectorAll('.mcp-server-card button[data-action="add-from-other"]').forEach(btn => {
1529
- btn.addEventListener('click', async (e) => {
1530
- try {
1531
- const serverName = btn.dataset.serverName;
1532
- const serverConfig = decodeConfigData(btn.dataset.serverConfig);
1533
- const scope = btn.dataset.scope; // 'project' or 'global'
1534
-
1535
- if (scope === 'global') {
1536
- await addGlobalMcpServer(serverName, serverConfig);
1537
- } else {
1538
- await copyMcpServerToProject(serverName, serverConfig);
1539
- }
1540
- } catch (err) {
1541
- console.error('[MCP] Error adding server from other project:', err);
1542
- }
1543
- });
1544
- });
1545
-
1546
- // Remove buttons (project-level)
1547
- document.querySelectorAll('.mcp-server-card button[data-action="remove"]').forEach(btn => {
1548
- btn.addEventListener('click', async (e) => {
1549
- const serverName = btn.dataset.serverName;
1550
- if (confirm(t('mcp.removeConfirm', { name: serverName }))) {
1551
- await removeMcpServerFromProject(serverName);
1552
- }
1553
- });
1554
- });
1555
-
1556
- // Remove buttons (global-level)
1557
- document.querySelectorAll('.mcp-server-card button[data-action="remove-global"]').forEach(btn => {
1558
- btn.addEventListener('click', async (e) => {
1559
- const serverName = btn.dataset.serverName;
1560
- if (confirm(t('mcp.removeGlobalConfirm', { name: serverName }))) {
1561
- await removeGlobalMcpServer(serverName);
1562
- }
1563
- });
1564
- });
1565
-
1566
- // Install to project buttons
1567
- document.querySelectorAll('.mcp-server-card button[data-action="install-to-project"]').forEach(btn => {
1568
- btn.addEventListener('click', async (e) => {
1569
- try {
1570
- const serverName = btn.dataset.serverName;
1571
- const serverConfig = decodeConfigData(btn.dataset.serverConfig);
1572
- await copyMcpServerToProject(serverName, serverConfig);
1573
- } catch (err) {
1574
- console.error('[MCP] Error installing to project:', err);
1575
- }
1576
- });
1577
- });
1578
-
1579
- // Install to global buttons
1580
- document.querySelectorAll('.mcp-server-card button[data-action="install-to-global"]').forEach(btn => {
1581
- btn.addEventListener('click', async (e) => {
1582
- try {
1583
- const serverName = btn.dataset.serverName;
1584
- const serverConfig = decodeConfigData(btn.dataset.serverConfig);
1585
- await addGlobalMcpServer(serverName, serverConfig);
1586
- } catch (err) {
1587
- console.error('[MCP] Error installing to global:', err);
1588
- }
1589
- });
1590
- });
1591
-
1592
- // Save as template buttons
1593
- document.querySelectorAll('.mcp-server-card button[data-action="save-as-template"]').forEach(btn => {
1594
- btn.addEventListener('click', async (e) => {
1595
- try {
1596
- const serverName = btn.dataset.serverName;
1597
- const serverConfig = decodeConfigData(btn.dataset.serverConfig);
1598
- await saveMcpAsTemplate(serverName, serverConfig);
1599
- } catch (err) {
1600
- console.error('[MCP] Error saving as template:', err);
1601
- }
1602
- });
1603
- });
1604
-
1605
- // Install from template buttons
1606
- document.querySelectorAll('.mcp-template-card button[data-action="install-template"]').forEach(btn => {
1607
- btn.addEventListener('click', async (e) => {
1608
- const templateName = btn.dataset.templateName;
1609
- const scope = btn.dataset.scope || 'project';
1610
- await installFromTemplate(templateName, scope);
1611
- });
1612
- });
1613
-
1614
- // Delete template buttons
1615
- document.querySelectorAll('.mcp-template-card button[data-action="delete-template"]').forEach(btn => {
1616
- btn.addEventListener('click', async (e) => {
1617
- const templateName = btn.dataset.templateName;
1618
- if (confirm(t('mcp.deleteTemplateConfirm', { name: templateName }))) {
1619
- await deleteMcpTemplate(templateName);
1620
- }
1621
- });
1622
- });
1623
-
1624
- // ========================================
1625
- // CCW Tools MCP Event Listeners
1626
- // ========================================
1627
-
1628
- // CCW Tools action buttons (workspace/global install/update)
1629
- const ccwActions = {
1630
- 'update-ccw-workspace': () => updateCcwToolsMcp('workspace'),
1631
- 'update-ccw-global': () => updateCcwToolsMcp('global'),
1632
- 'install-ccw-workspace': () => installCcwToolsMcp('workspace'),
1633
- 'install-ccw-global': () => installCcwToolsMcp('global'),
1634
- 'install-ccw-codex': () => installCcwToolsMcpToCodex()
1635
- };
1636
-
1637
- // Mode-specific and conditionally rendered actions (don't warn if not found)
1638
- const conditionalActions = new Set([
1639
- 'install-ccw-codex', // Only in Codex mode
1640
- 'update-ccw-workspace', // Only if ccw-tools installed
1641
- 'update-ccw-global' // Only if ccw-tools installed
1642
- ]);
1643
-
1644
- Object.entries(ccwActions).forEach(([action, handler]) => {
1645
- const btns = document.querySelectorAll(`button[data-action="${action}"]`);
1646
-
1647
- if (btns.length > 0) {
1648
- console.log(`[MCP] Attaching listener to ${action} (${btns.length} button(s) found)`);
1649
- btns.forEach(btn => {
1650
- btn.addEventListener('click', async (e) => {
1651
- e.preventDefault();
1652
- console.log(`[MCP] Button clicked: ${action}`);
1653
- try {
1654
- await handler();
1655
- } catch (err) {
1656
- console.error(`[MCP] Error executing handler for ${action}:`, err);
1657
- if (typeof showRefreshToast === 'function') {
1658
- showRefreshToast(`Action failed: ${err.message}`, 'error');
1659
- }
1660
- }
1661
- });
1662
- });
1663
- } else if (!conditionalActions.has(action)) {
1664
- // Only warn if button is not conditionally rendered
1665
- console.warn(`[MCP] No buttons found for action: ${action}`);
1666
- }
1667
- });
1668
-
1669
- // ========================================
1670
- // Codex MCP Event Listeners
1671
- // ========================================
1672
-
1673
- // Toggle Codex MCP servers
1674
- document.querySelectorAll('.mcp-server-card input[data-action="toggle-codex"]').forEach(input => {
1675
- input.addEventListener('change', async (e) => {
1676
- const serverName = e.target.dataset.serverName;
1677
- const enable = e.target.checked;
1678
- await toggleCodexMcpServer(serverName, enable);
1679
- });
1680
- });
1681
-
1682
- // Remove Codex MCP servers
1683
- document.querySelectorAll('.mcp-server-card button[data-action="remove-codex"]').forEach(btn => {
1684
- btn.addEventListener('click', async (e) => {
1685
- const serverName = btn.dataset.serverName;
1686
- if (confirm(t('mcp.codex.removeConfirm', { name: serverName }))) {
1687
- await removeCodexMcpServer(serverName);
1688
- }
1689
- });
1690
- });
1691
-
1692
- // Copy Claude servers to Codex
1693
- document.querySelectorAll('button[data-action="copy-to-codex"]').forEach(btn => {
1694
- btn.addEventListener('click', async (e) => {
1695
- e.preventDefault();
1696
- try {
1697
- const serverName = btn.dataset.serverName;
1698
- const serverConfig = decodeConfigData(btn.dataset.serverConfig);
1699
- console.log('[MCP] Copying to Codex:', serverName);
1700
- await copyClaudeServerToCodex(serverName, serverConfig);
1701
- } catch (err) {
1702
- console.error('[MCP] Error copying to Codex:', err);
1703
- }
1704
- });
1705
- });
1706
-
1707
- // Copy Codex servers to Claude
1708
- document.querySelectorAll('button[data-action="copy-codex-to-claude"]').forEach(btn => {
1709
- btn.addEventListener('click', async (e) => {
1710
- e.preventDefault();
1711
- e.stopPropagation();
1712
- const serverName = btn.dataset.serverName;
1713
- let serverConfig;
1714
- try {
1715
- serverConfig = decodeConfigData(btn.dataset.serverConfig);
1716
- } catch (err) {
1717
- console.error('[MCP] JSON Parse Error:', err);
1718
- if (typeof showRefreshToast === 'function') {
1719
- showRefreshToast('Failed to parse server configuration', 'error');
1720
- }
1721
- return;
1722
- }
1723
- console.log('[MCP] Copying Codex to Claude:', serverName);
1724
- await copyCodexServerToClaude(serverName, serverConfig);
1725
- });
1726
- });
1727
-
1728
- // Copy servers across CLI tools
1729
- document.querySelectorAll('button[data-action="copy-cross-cli"]').forEach(btn => {
1730
- btn.addEventListener('click', async (e) => {
1731
- e.preventDefault();
1732
- e.stopPropagation();
1733
- const serverName = btn.dataset.serverName;
1734
- let serverConfig;
1735
- try {
1736
- serverConfig = decodeConfigData(btn.dataset.serverConfig);
1737
- } catch (err) {
1738
- console.error('[MCP] JSON Parse Error:', err);
1739
- if (typeof showRefreshToast === 'function') {
1740
- showRefreshToast('Failed to parse server configuration', 'error');
1741
- }
1742
- return;
1743
- }
1744
- const fromCli = btn.dataset.fromCli;
1745
- const targetCli = btn.dataset.targetCli;
1746
- console.log('[MCP] Copying cross-CLI:', serverName, 'from', fromCli, 'to', targetCli);
1747
- await copyCrossCliServer(serverName, serverConfig, fromCli, targetCli);
1748
- });
1749
- });
1750
-
1751
- // View details / Edit - click on Claude server card
1752
- document.querySelectorAll('.mcp-server-card[data-action="view-details"]').forEach(card => {
1753
- card.addEventListener('click', (e) => {
1754
- // Don't trigger if clicking on buttons or toggle
1755
- if (e.target.closest('button') || e.target.closest('label') || e.target.closest('input')) {
1756
- return;
1757
- }
1758
- try {
1759
- const serverName = card.dataset.serverName;
1760
- const configData = card.dataset.serverConfig;
1761
- if (!configData) {
1762
- console.error('[MCP] Missing server config for:', serverName);
1763
- return;
1764
- }
1765
- const serverConfig = decodeConfigData(configData);
1766
- if (!serverConfig) {
1767
- console.error('[MCP] Failed to decode server config for:', serverName);
1768
- return;
1769
- }
1770
- const serverSource = card.dataset.serverSource;
1771
- console.log('[MCP] Card clicked:', serverName, serverSource);
1772
- showMcpEditModal(serverName, serverConfig, serverSource, 'claude');
1773
- } catch (err) {
1774
- console.error('[MCP] Error handling card click:', err);
1775
- }
1776
- });
1777
- });
1778
-
1779
- // View details / Edit - click on Codex server card
1780
- document.querySelectorAll('.mcp-server-card[data-action="view-details-codex"]').forEach(card => {
1781
- card.addEventListener('click', (e) => {
1782
- // Don't trigger if clicking on buttons or toggle
1783
- if (e.target.closest('button') || e.target.closest('label') || e.target.closest('input')) {
1784
- return;
1785
- }
1786
- try {
1787
- const serverName = card.dataset.serverName;
1788
- const configData = card.dataset.serverConfig;
1789
- if (!configData) {
1790
- console.error('[MCP] Missing server config for:', serverName);
1791
- return;
1792
- }
1793
- const serverConfig = decodeConfigData(configData);
1794
- if (!serverConfig) {
1795
- console.error('[MCP] Failed to decode server config for:', serverName);
1796
- return;
1797
- }
1798
- console.log('[MCP] Codex card clicked:', serverName);
1799
- showMcpEditModal(serverName, serverConfig, 'codex', 'codex');
1800
- } catch (err) {
1801
- console.error('[MCP] Error handling Codex card click:', err);
1802
- }
1803
- });
1804
- });
1805
-
1806
- // Modal close button
1807
- const closeBtn = document.getElementById('mcpDetailsModalClose');
1808
- const modal = document.getElementById('mcpDetailsModal');
1809
- if (closeBtn && modal) {
1810
- closeBtn.addEventListener('click', () => {
1811
- modal.classList.add('hidden');
1812
- });
1813
- // Close on background click
1814
- modal.addEventListener('click', (e) => {
1815
- if (e.target === modal) {
1816
- modal.classList.add('hidden');
1817
- }
1818
- });
1819
- }
1820
- }
1821
-
1822
- // ========================================
1823
- // MCP Edit Modal (replaces Details Modal)
1824
- // ========================================
1825
-
1826
- // Store current editing context
1827
- let mcpEditContext = {
1828
- serverName: null,
1829
- serverConfig: null,
1830
- serverSource: null,
1831
- cliType: 'claude'
1832
- };
1833
-
1834
- function showMcpDetails(serverName, serverConfig, serverSource, cliType = 'claude') {
1835
- showMcpEditModal(serverName, serverConfig, serverSource, cliType);
1836
- }
1837
-
1838
- function showMcpEditModal(serverName, serverConfig, serverSource, cliType = 'claude') {
1839
- const modal = document.getElementById('mcpDetailsModal');
1840
- const modalBody = document.getElementById('mcpDetailsModalBody');
1841
-
1842
- if (!modal || !modalBody) return;
1843
-
1844
- // Store editing context
1845
- mcpEditContext = {
1846
- serverName,
1847
- serverConfig: JSON.parse(JSON.stringify(serverConfig)), // Deep clone
1848
- serverSource,
1849
- cliType
1850
- };
1851
-
1852
- // Check if editable (enterprise is read-only)
1853
- const isReadOnly = serverSource === 'enterprise';
1854
- const isCodex = cliType === 'codex';
1855
-
1856
- // Build source badge
1857
- let sourceBadge = '';
1858
- if (serverSource === 'enterprise') {
1859
- sourceBadge = `<span class="inline-flex items-center px-2 py-1 text-xs font-semibold rounded-full bg-warning/20 text-warning">${t('mcp.sourceEnterprise')}</span>`;
1860
- } else if (serverSource === 'global') {
1861
- sourceBadge = `<span class="inline-flex items-center px-2 py-1 text-xs font-semibold rounded-full bg-success/10 text-success">${t('mcp.sourceGlobal')}</span>`;
1862
- } else if (serverSource === 'project') {
1863
- sourceBadge = `<span class="inline-flex items-center px-2 py-1 text-xs font-semibold rounded-full bg-primary/10 text-primary">${t('mcp.sourceProject')}</span>`;
1864
- } else if (isCodex) {
1865
- sourceBadge = `<span class="inline-flex items-center px-2 py-1 text-xs font-semibold rounded-full bg-orange-100 text-orange-700 dark:bg-orange-900/30 dark:text-orange-300">Codex</span>`;
1866
- }
1867
-
1868
- // Format args and env for textarea
1869
- const argsText = (serverConfig.args || []).join('\n');
1870
- const envText = Object.entries(serverConfig.env || {}).map(([k, v]) => `${k}=${v}`).join('\n');
1871
-
1872
- // Build edit form HTML
1873
- modalBody.innerHTML = `
1874
- <div class="space-y-4">
1875
- <!-- Server Name and Source -->
1876
- <div>
1877
- <label class="text-xs font-semibold text-muted-foreground uppercase tracking-wide">${t('mcp.detailsModal.serverName')}</label>
1878
- <div class="mt-1 flex items-center gap-2">
1879
- <input type="text" id="mcpEditName" value="${escapeHtml(serverName)}"
1880
- class="text-lg font-bold text-foreground bg-transparent border-b border-border focus:border-primary outline-none px-1 py-0.5 flex-1"
1881
- ${isReadOnly ? 'disabled' : ''}
1882
- placeholder="${t('mcp.editModal.serverNamePlaceholder')}">
1883
- ${sourceBadge}
1884
- </div>
1885
- </div>
1886
-
1887
- <!-- Command/URL -->
1888
- <div>
1889
- <label class="text-xs font-semibold text-muted-foreground uppercase tracking-wide mb-1 block">
1890
- ${serverConfig.url ? t('mcp.url') : t('mcp.cmd')}
1891
- </label>
1892
- <input type="text" id="mcpEditCommand" value="${escapeHtml(serverConfig.command || serverConfig.url || '')}"
1893
- class="w-full px-3 py-2 text-sm font-mono bg-muted border border-border rounded-lg focus:border-primary outline-none"
1894
- ${isReadOnly ? 'disabled' : ''}
1895
- placeholder="${serverConfig.url ? 'https://...' : 'npx, node, python...'}">
1896
- </div>
1897
-
1898
- <!-- Arguments -->
1899
- <div>
1900
- <label class="text-xs font-semibold text-muted-foreground uppercase tracking-wide mb-1 block">
1901
- ${t('mcp.args')} <span class="font-normal">(${t('mcp.editModal.onePerLine')})</span>
1902
- </label>
1903
- <textarea id="mcpEditArgs" rows="3"
1904
- class="w-full px-3 py-2 text-sm font-mono bg-muted border border-border rounded-lg focus:border-primary outline-none resize-none"
1905
- ${isReadOnly ? 'disabled' : ''}
1906
- placeholder="-y&#10;package-name">${escapeHtml(argsText)}</textarea>
1907
- </div>
1908
-
1909
- <!-- Environment Variables -->
1910
- <div>
1911
- <label class="text-xs font-semibold text-muted-foreground uppercase tracking-wide mb-1 block">
1912
- ${t('mcp.env')} <span class="font-normal">(KEY=VALUE ${t('mcp.editModal.onePerLine')})</span>
1913
- </label>
1914
- <textarea id="mcpEditEnv" rows="3"
1915
- class="w-full px-3 py-2 text-sm font-mono bg-muted border border-border rounded-lg focus:border-primary outline-none resize-none"
1916
- ${isReadOnly ? 'disabled' : ''}
1917
- placeholder="API_KEY=your-key&#10;DEBUG=true">${escapeHtml(envText)}</textarea>
1918
- </div>
1919
-
1920
- ${isCodex ? `
1921
- <!-- Codex-specific: enabled_tools -->
1922
- <div>
1923
- <label class="text-xs font-semibold text-muted-foreground uppercase tracking-wide mb-1 block">
1924
- ${t('mcp.codex.enabledTools')} <span class="font-normal">(${t('mcp.editModal.onePerLine')})</span>
1925
- </label>
1926
- <textarea id="mcpEditEnabledTools" rows="2"
1927
- class="w-full px-3 py-2 text-sm font-mono bg-muted border border-border rounded-lg focus:border-primary outline-none resize-none"
1928
- ${isReadOnly ? 'disabled' : ''}
1929
- placeholder="tool1&#10;tool2">${escapeHtml((serverConfig.enabled_tools || []).join('\n'))}</textarea>
1930
- </div>
1931
- ` : ''}
1932
-
1933
- <!-- Raw JSON Preview (collapsible) -->
1934
- <details class="group">
1935
- <summary class="text-xs font-semibold text-muted-foreground uppercase tracking-wide cursor-pointer flex items-center gap-1">
1936
- <i data-lucide="chevron-right" class="w-3 h-3 transition-transform group-open:rotate-90"></i>
1937
- Raw JSON
1938
- </summary>
1939
- <pre id="mcpEditJsonPreview" class="mt-2 bg-muted rounded-lg p-3 text-xs font-mono overflow-x-auto">${escapeHtml(JSON.stringify(serverConfig, null, 2))}</pre>
1940
- </details>
1941
-
1942
- <!-- Action Buttons -->
1943
- ${!isReadOnly ? `
1944
- <div class="flex items-center justify-between pt-4 border-t border-border">
1945
- <div class="flex items-center gap-2">
1946
- ${serverSource === 'project' || isCodex ? `
1947
- <button onclick="deleteMcpFromEdit()" class="px-4 py-2 text-sm text-destructive hover:bg-destructive/10 rounded-lg transition-colors flex items-center gap-1.5">
1948
- <i data-lucide="trash-2" class="w-4 h-4"></i>
1949
- ${t('mcp.editModal.delete')}
1950
- </button>
1951
- ` : ''}
1952
- </div>
1953
- <div class="flex items-center gap-2">
1954
- <button onclick="closeMcpEditModal()" class="px-4 py-2 text-sm text-muted-foreground hover:bg-muted rounded-lg transition-colors">
1955
- ${t('common.cancel')}
1956
- </button>
1957
- <button onclick="saveMcpEdit()" class="px-4 py-2 text-sm bg-primary text-primary-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1.5">
1958
- <i data-lucide="check" class="w-4 h-4"></i>
1959
- ${t('mcp.editModal.save')}
1960
- </button>
1961
- </div>
1962
- </div>
1963
- ` : `
1964
- <div class="flex items-center justify-end pt-4 border-t border-border">
1965
- <button onclick="closeMcpEditModal()" class="px-4 py-2 text-sm bg-muted text-foreground rounded-lg hover:bg-muted/80 transition-colors">
1966
- ${t('common.close')}
1967
- </button>
1968
- </div>
1969
- `}
1970
- </div>
1971
- `;
1972
-
1973
- // Update modal title
1974
- const modalTitle = modal.querySelector('h2');
1975
- if (modalTitle) {
1976
- modalTitle.textContent = isReadOnly ? t('mcp.detailsModal.title') : t('mcp.editModal.title');
1977
- }
1978
-
1979
- // Show modal
1980
- modal.classList.remove('hidden');
1981
-
1982
- // Re-initialize Lucide icons in modal
1983
- if (typeof lucide !== 'undefined') lucide.createIcons();
1984
-
1985
- // Add input listeners to update JSON preview
1986
- if (!isReadOnly) {
1987
- ['mcpEditCommand', 'mcpEditArgs', 'mcpEditEnv', 'mcpEditEnabledTools'].forEach(id => {
1988
- const el = document.getElementById(id);
1989
- if (el) {
1990
- el.addEventListener('input', updateMcpEditJsonPreview);
1991
- }
1992
- });
1993
- }
1994
- }
1995
-
1996
- function closeMcpEditModal() {
1997
- const modal = document.getElementById('mcpDetailsModal');
1998
- if (modal) {
1999
- modal.classList.add('hidden');
2000
- }
2001
- mcpEditContext = { serverName: null, serverConfig: null, serverSource: null, cliType: 'claude' };
2002
- }
2003
-
2004
- function updateMcpEditJsonPreview() {
2005
- const preview = document.getElementById('mcpEditJsonPreview');
2006
- if (!preview) return;
2007
-
2008
- const config = buildConfigFromEditForm();
2009
- preview.textContent = JSON.stringify(config, null, 2);
2010
- }
2011
-
2012
- function buildConfigFromEditForm() {
2013
- const command = document.getElementById('mcpEditCommand')?.value.trim() || '';
2014
- const argsText = document.getElementById('mcpEditArgs')?.value.trim() || '';
2015
- const envText = document.getElementById('mcpEditEnv')?.value.trim() || '';
2016
- const enabledToolsEl = document.getElementById('mcpEditEnabledTools');
2017
-
2018
- // Build config
2019
- const config = {};
2020
-
2021
- // Command or URL
2022
- if (mcpEditContext.serverConfig?.url) {
2023
- config.url = command;
2024
- } else {
2025
- config.command = command;
2026
- }
2027
-
2028
- // Args
2029
- if (argsText) {
2030
- config.args = argsText.split('\n').map(a => a.trim()).filter(a => a);
2031
- }
2032
-
2033
- // Env
2034
- if (envText) {
2035
- config.env = {};
2036
- envText.split('\n').forEach(line => {
2037
- const trimmed = line.trim();
2038
- if (trimmed && trimmed.includes('=')) {
2039
- const eqIndex = trimmed.indexOf('=');
2040
- const key = trimmed.substring(0, eqIndex).trim();
2041
- const value = trimmed.substring(eqIndex + 1).trim();
2042
- if (key) {
2043
- config.env[key] = value;
2044
- }
2045
- }
2046
- });
2047
- }
2048
-
2049
- // Codex-specific: enabled_tools
2050
- if (enabledToolsEl) {
2051
- const toolsText = enabledToolsEl.value.trim();
2052
- if (toolsText) {
2053
- config.enabled_tools = toolsText.split('\n').map(t => t.trim()).filter(t => t);
2054
- }
2055
- }
2056
-
2057
- return config;
2058
- }
2059
-
2060
- async function saveMcpEdit() {
2061
- const newName = document.getElementById('mcpEditName')?.value.trim();
2062
- if (!newName) {
2063
- showRefreshToast(t('mcp.editModal.nameRequired'), 'error');
2064
- return;
2065
- }
2066
-
2067
- const newConfig = buildConfigFromEditForm();
2068
-
2069
- if (!newConfig.command && !newConfig.url) {
2070
- showRefreshToast(t('mcp.editModal.commandRequired'), 'error');
2071
- return;
2072
- }
2073
-
2074
- const { serverName, serverSource, cliType } = mcpEditContext;
2075
- const nameChanged = newName !== serverName;
2076
-
2077
- try {
2078
- if (cliType === 'codex') {
2079
- // Codex MCP update
2080
- // If name changed, remove old and add new
2081
- if (nameChanged) {
2082
- await removeCodexMcpServer(serverName);
2083
- }
2084
- await addCodexMcpServer(newName, newConfig);
2085
- } else if (serverSource === 'global') {
2086
- // Global MCP update
2087
- if (nameChanged) {
2088
- await removeGlobalMcpServer(serverName);
2089
- }
2090
- await addGlobalMcpServer(newName, newConfig);
2091
- } else if (serverSource === 'project') {
2092
- // Project MCP update
2093
- if (nameChanged) {
2094
- await removeMcpServerFromProject(serverName);
2095
- }
2096
- await copyMcpServerToProject(newName, newConfig, 'mcp');
2097
- }
2098
-
2099
- closeMcpEditModal();
2100
- showRefreshToast(t('mcp.editModal.saved', { name: newName }), 'success');
2101
- } catch (err) {
2102
- console.error('Failed to save MCP edit:', err);
2103
- showRefreshToast(t('mcp.editModal.saveFailed') + ': ' + err.message, 'error');
2104
- }
2105
- }
2106
-
2107
- async function deleteMcpFromEdit() {
2108
- const { serverName, serverSource, cliType } = mcpEditContext;
2109
-
2110
- if (!confirm(t('mcp.editModal.deleteConfirm', { name: serverName }))) {
2111
- return;
2112
- }
2113
-
2114
- try {
2115
- if (cliType === 'codex') {
2116
- await removeCodexMcpServer(serverName);
2117
- } else if (serverSource === 'global') {
2118
- await removeGlobalMcpServer(serverName);
2119
- } else if (serverSource === 'project') {
2120
- await removeMcpServerFromProject(serverName);
2121
- }
2122
-
2123
- closeMcpEditModal();
2124
- showRefreshToast(t('mcp.editModal.deleted', { name: serverName }), 'success');
2125
- } catch (err) {
2126
- console.error('Failed to delete MCP:', err);
2127
- showRefreshToast(t('mcp.editModal.deleteFailed') + ': ' + err.message, 'error');
2128
- }
2129
- }
2130
-
2131
- // ========================================
2132
- // MCP Template Management Functions
2133
- // ========================================
2134
-
2135
- let mcpTemplates = [];
2136
-
2137
- /**
2138
- * Load all MCP templates from API
2139
- */
2140
- async function loadMcpTemplates() {
2141
- try {
2142
- const response = await fetch('/api/mcp-templates');
2143
- const data = await response.json();
2144
-
2145
- if (data.success) {
2146
- mcpTemplates = data.templates || [];
2147
- console.log('[MCP Templates] Loaded', mcpTemplates.length, 'templates');
2148
- } else {
2149
- console.error('[MCP Templates] Failed to load:', data.error);
2150
- mcpTemplates = [];
2151
- }
2152
-
2153
- return mcpTemplates;
2154
- } catch (error) {
2155
- console.error('[MCP Templates] Error loading templates:', error);
2156
- mcpTemplates = [];
2157
- return [];
2158
- }
2159
- }
2160
-
2161
- /**
2162
- * Save MCP server configuration as a template
2163
- */
2164
- async function saveMcpAsTemplate(serverName, serverConfig) {
2165
- try {
2166
- // Prompt for template name and description
2167
- const templateName = prompt(t('mcp.enterTemplateName'), serverName);
2168
- if (!templateName) return;
2169
-
2170
- const description = prompt(t('mcp.enterTemplateDesc'), `Template for ${serverName}`);
2171
-
2172
- const payload = {
2173
- name: templateName,
2174
- description: description || '',
2175
- serverConfig: serverConfig,
2176
- category: 'user'
2177
- };
2178
-
2179
- const response = await fetch('/api/mcp-templates', {
2180
- method: 'POST',
2181
- headers: { 'Content-Type': 'application/json' },
2182
- body: JSON.stringify(payload)
2183
- });
2184
-
2185
- const data = await response.json();
2186
-
2187
- if (data.success) {
2188
- showRefreshToast(t('mcp.templateSaved', { name: templateName }), 'success');
2189
- await loadMcpTemplates();
2190
- await renderMcpManager(); // Refresh view
2191
- } else {
2192
- showRefreshToast(t('mcp.templateSaveFailed', { error: data.error }), 'error');
2193
- }
2194
- } catch (error) {
2195
- console.error('[MCP] Save template error:', error);
2196
- showRefreshToast(t('mcp.templateSaveFailed', { error: error.message }), 'error');
2197
- }
2198
- }
2199
-
2200
- /**
2201
- * Install MCP server from template
2202
- */
2203
- async function installFromTemplate(templateName, scope = 'project') {
2204
- try {
2205
- // Find template
2206
- const template = mcpTemplates.find(t => t.name === templateName);
2207
- if (!template) {
2208
- showRefreshToast(t('mcp.templateNotFound', { name: templateName }), 'error');
2209
- return;
2210
- }
2211
-
2212
- // Prompt for server name (default to template name)
2213
- const serverName = prompt(t('mcp.enterServerName'), templateName);
2214
- if (!serverName) return;
2215
-
2216
- // Install based on scope
2217
- if (scope === 'project') {
2218
- await copyMcpServerToProject(serverName, template.serverConfig);
2219
- } else if (scope === 'global') {
2220
- await addGlobalMcpServer(serverName, template.serverConfig);
2221
- }
2222
-
2223
- showRefreshToast(t('mcp.templateInstalled', { name: serverName }), 'success');
2224
- await renderMcpManager();
2225
- } catch (error) {
2226
- console.error('[MCP] Install from template error:', error);
2227
- showRefreshToast(t('mcp.templateInstallFailed', { error: error.message }), 'error');
2228
- }
2229
- }
2230
-
2231
- /**
2232
- * Delete MCP template
2233
- */
2234
- async function deleteMcpTemplate(templateName) {
2235
- try {
2236
- const response = await fetch(`/api/mcp-templates/${encodeURIComponent(templateName)}`, {
2237
- method: 'DELETE'
2238
- });
2239
-
2240
- const data = await response.json();
2241
-
2242
- if (data.success) {
2243
- showRefreshToast(t('mcp.templateDeleted', { name: templateName }), 'success');
2244
- await loadMcpTemplates();
2245
- await renderMcpManager();
2246
- } else {
2247
- showRefreshToast(t('mcp.templateDeleteFailed', { error: data.error }), 'error');
2248
- }
2249
- } catch (error) {
2250
- console.error('[MCP] Delete template error:', error);
2251
- showRefreshToast(t('mcp.templateDeleteFailed', { error: error.message }), 'error');
2252
- }
2253
- }
2254
-
2255
- // ========== Global Exports for onclick handlers ==========
2256
- // Expose functions to global scope to support inline onclick handlers
2257
- window.openCodexMcpCreateModal = openCodexMcpCreateModal;
2258
- window.closeMcpEditModal = closeMcpEditModal;
2259
- window.saveMcpEdit = saveMcpEdit;
2260
- window.deleteMcpFromEdit = deleteMcpFromEdit;
2261
- window.saveMcpAsTemplate = saveMcpAsTemplate;