claude-code-workflow 6.3.18 → 6.3.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (822) hide show
  1. package/.claude/CLAUDE.md +8 -5
  2. package/.claude/agents/action-planning-agent.md +26 -2
  3. package/.claude/agents/code-developer.md +132 -43
  4. package/.claude/agents/debug-explore-agent.md +434 -0
  5. package/.claude/agents/test-fix-agent.md +14 -0
  6. package/.claude/commands/issue/discover.md +41 -0
  7. package/.claude/commands/issue/execute.md +200 -19
  8. package/.claude/commands/issue/new.md +1 -1
  9. package/.claude/commands/issue/plan.md +6 -1
  10. package/.claude/commands/issue/queue.md +94 -39
  11. package/.claude/commands/memory/swagger-docs.md +773 -0
  12. package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
  13. package/.claude/commands/workflow/execute.md +54 -34
  14. package/.claude/commands/workflow/lite-execute.md +48 -164
  15. package/.claude/commands/workflow/lite-fix.md +4 -4
  16. package/.claude/commands/workflow/lite-plan.md +5 -5
  17. package/.claude/commands/workflow/plan.md +27 -27
  18. package/.claude/commands/workflow/review.md +42 -17
  19. package/.claude/commands/workflow/tdd-plan.md +25 -25
  20. package/.claude/commands/workflow/test-fix-gen.md +10 -10
  21. package/.claude/commands/workflow/test-gen.md +14 -14
  22. package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
  23. package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
  24. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
  25. package/.claude/skills/ccw/SKILL.md +462 -0
  26. package/.claude/skills/ccw/index/command-capabilities.json +127 -0
  27. package/.claude/skills/ccw/index/intent-rules.json +136 -0
  28. package/.claude/skills/ccw/index/workflow-chains.json +451 -0
  29. package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
  30. package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
  31. package/.claude/skills/ccw/phases/actions/docs.md +93 -0
  32. package/.claude/skills/ccw/phases/actions/full.md +154 -0
  33. package/.claude/skills/ccw/phases/actions/issue.md +201 -0
  34. package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
  35. package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
  36. package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
  37. package/.claude/skills/ccw/phases/actions/ui.md +79 -0
  38. package/.claude/skills/ccw/phases/orchestrator.md +435 -0
  39. package/.claude/skills/ccw/specs/intent-classification.md +336 -0
  40. package/.claude/skills/ccw-help/SKILL.md +177 -0
  41. package/.claude/skills/ccw-help/index/all-agents.json +82 -0
  42. package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
  43. package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
  44. package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
  45. package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
  46. package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
  47. package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
  48. package/.claude/skills/code-reviewer/README.md +340 -0
  49. package/.claude/skills/code-reviewer/SKILL.md +308 -0
  50. package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
  51. package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
  52. package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
  53. package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
  54. package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
  55. package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
  56. package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
  57. package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
  58. package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
  59. package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
  60. package/.claude/skills/skill-generator/SKILL.md +187 -0
  61. package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
  62. package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
  63. package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
  64. package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
  65. package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
  66. package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
  67. package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
  68. package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
  69. package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
  70. package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
  71. package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
  72. package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
  73. package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
  74. package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
  75. package/.claude/skills/skill-generator/templates/script-python.md +198 -0
  76. package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
  77. package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
  78. package/.claude/workflows/chinese-response.md +15 -28
  79. package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
  80. package/.claude/workflows/cli-tools-usage.md +221 -177
  81. package/.claude/workflows/windows-platform.md +13 -10
  82. package/.codex/prompts/issue-execute.md +305 -82
  83. package/.codex/prompts/issue-queue.md +22 -0
  84. package/.codex/prompts/lite-execute.md +36 -11
  85. package/README.md +309 -305
  86. package/ccw/README.md +10 -4
  87. package/ccw/dist/cli.d.ts.map +1 -1
  88. package/ccw/dist/cli.js +4 -1
  89. package/ccw/dist/cli.js.map +1 -1
  90. package/ccw/dist/commands/cli.d.ts.map +1 -1
  91. package/ccw/dist/commands/cli.js +131 -34
  92. package/ccw/dist/commands/cli.js.map +1 -1
  93. package/ccw/dist/commands/issue.d.ts +152 -0
  94. package/ccw/dist/commands/issue.d.ts.map +1 -1
  95. package/ccw/dist/commands/issue.js +550 -85
  96. package/ccw/dist/commands/issue.js.map +1 -1
  97. package/ccw/dist/commands/serve.d.ts +1 -0
  98. package/ccw/dist/commands/serve.d.ts.map +1 -1
  99. package/ccw/dist/commands/serve.js +12 -5
  100. package/ccw/dist/commands/serve.js.map +1 -1
  101. package/ccw/dist/commands/stop.d.ts.map +1 -1
  102. package/ccw/dist/commands/stop.js +29 -5
  103. package/ccw/dist/commands/stop.js.map +1 -1
  104. package/ccw/dist/commands/tool.d.ts.map +1 -1
  105. package/ccw/dist/commands/tool.js +19 -2
  106. package/ccw/dist/commands/tool.js.map +1 -1
  107. package/ccw/dist/commands/view.d.ts +1 -0
  108. package/ccw/dist/commands/view.d.ts.map +1 -1
  109. package/ccw/dist/commands/view.js +10 -3
  110. package/ccw/dist/commands/view.js.map +1 -1
  111. package/ccw/dist/config/cli-settings-manager.d.ts +86 -0
  112. package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -0
  113. package/ccw/dist/config/cli-settings-manager.js +392 -0
  114. package/ccw/dist/config/cli-settings-manager.js.map +1 -0
  115. package/ccw/dist/config/litellm-api-config-manager.d.ts +71 -5
  116. package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
  117. package/ccw/dist/config/litellm-api-config-manager.js +290 -20
  118. package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
  119. package/ccw/dist/core/auth/csrf-manager.d.ts +18 -0
  120. package/ccw/dist/core/auth/csrf-manager.d.ts.map +1 -0
  121. package/ccw/dist/core/auth/csrf-manager.js +80 -0
  122. package/ccw/dist/core/auth/csrf-manager.js.map +1 -0
  123. package/ccw/dist/core/auth/csrf-middleware.d.ts +8 -0
  124. package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -0
  125. package/ccw/dist/core/auth/csrf-middleware.js +141 -0
  126. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -0
  127. package/ccw/dist/core/auth/middleware.d.ts +15 -0
  128. package/ccw/dist/core/auth/middleware.d.ts.map +1 -0
  129. package/ccw/dist/core/auth/middleware.js +76 -0
  130. package/ccw/dist/core/auth/middleware.js.map +1 -0
  131. package/ccw/dist/core/auth/token-manager.d.ts +41 -0
  132. package/ccw/dist/core/auth/token-manager.d.ts.map +1 -0
  133. package/ccw/dist/core/auth/token-manager.js +171 -0
  134. package/ccw/dist/core/auth/token-manager.js.map +1 -0
  135. package/ccw/dist/core/cache-manager.d.ts +6 -6
  136. package/ccw/dist/core/cache-manager.d.ts.map +1 -1
  137. package/ccw/dist/core/cache-manager.js +70 -48
  138. package/ccw/dist/core/cache-manager.js.map +1 -1
  139. package/ccw/dist/core/claude-freshness.d.ts.map +1 -1
  140. package/ccw/dist/core/claude-freshness.js +23 -3
  141. package/ccw/dist/core/claude-freshness.js.map +1 -1
  142. package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
  143. package/ccw/dist/core/core-memory-store.js +2 -1
  144. package/ccw/dist/core/core-memory-store.js.map +1 -1
  145. package/ccw/dist/core/cors.d.ts +3 -0
  146. package/ccw/dist/core/cors.d.ts.map +1 -0
  147. package/ccw/dist/core/cors.js +10 -0
  148. package/ccw/dist/core/cors.js.map +1 -0
  149. package/ccw/dist/core/dashboard-generator-patch.js +0 -1
  150. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
  151. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  152. package/ccw/dist/core/dashboard-generator.js +417 -416
  153. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  154. package/ccw/dist/core/data-aggregator.js +2 -2
  155. package/ccw/dist/core/data-aggregator.js.map +1 -1
  156. package/ccw/dist/core/lite-scanner.d.ts +1 -1
  157. package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
  158. package/ccw/dist/core/lite-scanner.js +130 -127
  159. package/ccw/dist/core/lite-scanner.js.map +1 -1
  160. package/ccw/dist/core/routes/auth-routes.d.ts +12 -0
  161. package/ccw/dist/core/routes/auth-routes.d.ts.map +1 -0
  162. package/ccw/dist/core/routes/auth-routes.js +80 -0
  163. package/ccw/dist/core/routes/auth-routes.js.map +1 -0
  164. package/ccw/dist/core/routes/ccw-routes.d.ts +1 -14
  165. package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
  166. package/ccw/dist/core/routes/ccw-routes.js +9 -4
  167. package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
  168. package/ccw/dist/core/routes/claude-routes.d.ts +1 -14
  169. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  170. package/ccw/dist/core/routes/claude-routes.js +98 -39
  171. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  172. package/ccw/dist/core/routes/cli-routes.d.ts +14 -12
  173. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  174. package/ccw/dist/core/routes/cli-routes.js +122 -43
  175. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  176. package/ccw/dist/core/routes/cli-settings-routes.d.ts +11 -0
  177. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -0
  178. package/ccw/dist/core/routes/cli-settings-routes.js +204 -0
  179. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -0
  180. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts +6 -0
  181. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -0
  182. package/ccw/dist/core/routes/codexlens/config-handlers.js +1195 -0
  183. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -0
  184. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts +10 -0
  185. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -0
  186. package/ccw/dist/core/routes/codexlens/index-handlers.js +322 -0
  187. package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -0
  188. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts +6 -0
  189. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -0
  190. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +865 -0
  191. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -0
  192. package/ccw/dist/core/routes/codexlens/utils.d.ts +23 -0
  193. package/ccw/dist/core/routes/codexlens/utils.d.ts.map +1 -0
  194. package/ccw/dist/core/routes/codexlens/utils.js +85 -0
  195. package/ccw/dist/core/routes/codexlens/utils.js.map +1 -0
  196. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts +13 -0
  197. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts.map +1 -0
  198. package/ccw/dist/core/routes/codexlens/watcher-handlers.js +235 -0
  199. package/ccw/dist/core/routes/codexlens/watcher-handlers.js.map +1 -0
  200. package/ccw/dist/core/routes/codexlens-routes.d.ts +2 -11
  201. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  202. package/ccw/dist/core/routes/codexlens-routes.js +10 -981
  203. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  204. package/ccw/dist/core/routes/discovery-routes.d.ts +1 -35
  205. package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -1
  206. package/ccw/dist/core/routes/discovery-routes.js +25 -0
  207. package/ccw/dist/core/routes/discovery-routes.js.map +1 -1
  208. package/ccw/dist/core/routes/files-routes.d.ts +1 -14
  209. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  210. package/ccw/dist/core/routes/files-routes.js +57 -14
  211. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  212. package/ccw/dist/core/routes/graph-routes.d.ts +1 -14
  213. package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
  214. package/ccw/dist/core/routes/graph-routes.js +36 -37
  215. package/ccw/dist/core/routes/graph-routes.js.map +1 -1
  216. package/ccw/dist/core/routes/help-routes.d.ts +1 -14
  217. package/ccw/dist/core/routes/help-routes.d.ts.map +1 -1
  218. package/ccw/dist/core/routes/help-routes.js +5 -0
  219. package/ccw/dist/core/routes/help-routes.js.map +1 -1
  220. package/ccw/dist/core/routes/hooks-routes.d.ts +4 -14
  221. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  222. package/ccw/dist/core/routes/hooks-routes.js +43 -21
  223. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  224. package/ccw/dist/core/routes/issue-routes.d.ts +1 -34
  225. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
  226. package/ccw/dist/core/routes/issue-routes.js +24 -0
  227. package/ccw/dist/core/routes/issue-routes.js.map +1 -1
  228. package/ccw/dist/core/routes/litellm-api-routes.d.ts +1 -14
  229. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
  230. package/ccw/dist/core/routes/litellm-api-routes.js +505 -48
  231. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
  232. package/ccw/dist/core/routes/litellm-routes.d.ts +1 -14
  233. package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -1
  234. package/ccw/dist/core/routes/litellm-routes.js +28 -11
  235. package/ccw/dist/core/routes/litellm-routes.js.map +1 -1
  236. package/ccw/dist/core/routes/mcp-routes.d.ts +1 -14
  237. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
  238. package/ccw/dist/core/routes/mcp-routes.js +99 -30
  239. package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
  240. package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
  241. package/ccw/dist/core/routes/mcp-templates-db.js +30 -31
  242. package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
  243. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  244. package/ccw/dist/core/routes/memory-routes.js +74 -24
  245. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  246. package/ccw/dist/core/routes/nav-status-routes.d.ts +3 -0
  247. package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -0
  248. package/ccw/dist/core/routes/nav-status-routes.js +217 -0
  249. package/ccw/dist/core/routes/nav-status-routes.js.map +1 -0
  250. package/ccw/dist/core/routes/rules-routes.d.ts +1 -14
  251. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
  252. package/ccw/dist/core/routes/rules-routes.js +481 -58
  253. package/ccw/dist/core/routes/rules-routes.js.map +1 -1
  254. package/ccw/dist/core/routes/session-routes.d.ts +1 -14
  255. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
  256. package/ccw/dist/core/routes/session-routes.js +15 -3
  257. package/ccw/dist/core/routes/session-routes.js.map +1 -1
  258. package/ccw/dist/core/routes/skills-routes.d.ts +1 -14
  259. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  260. package/ccw/dist/core/routes/skills-routes.js +394 -112
  261. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  262. package/ccw/dist/core/routes/status-routes.d.ts +1 -14
  263. package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
  264. package/ccw/dist/core/routes/status-routes.js +4 -0
  265. package/ccw/dist/core/routes/status-routes.js.map +1 -1
  266. package/ccw/dist/core/routes/system-routes.d.ts +4 -10
  267. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  268. package/ccw/dist/core/routes/system-routes.js +6 -4
  269. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  270. package/ccw/dist/core/routes/types.d.ts +19 -0
  271. package/ccw/dist/core/routes/types.d.ts.map +1 -0
  272. package/ccw/dist/core/routes/types.js +2 -0
  273. package/ccw/dist/core/routes/types.js.map +1 -0
  274. package/ccw/dist/core/server.d.ts.map +1 -1
  275. package/ccw/dist/core/server.js +201 -29
  276. package/ccw/dist/core/server.js.map +1 -1
  277. package/ccw/dist/core/services/api-key-tester.d.ts +31 -0
  278. package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
  279. package/ccw/dist/core/services/api-key-tester.js +106 -0
  280. package/ccw/dist/core/services/api-key-tester.js.map +1 -0
  281. package/ccw/dist/core/services/health-check-service.d.ts +82 -0
  282. package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
  283. package/ccw/dist/core/services/health-check-service.js +271 -0
  284. package/ccw/dist/core/services/health-check-service.js.map +1 -0
  285. package/ccw/dist/core/websocket.d.ts +9 -7
  286. package/ccw/dist/core/websocket.d.ts.map +1 -1
  287. package/ccw/dist/core/websocket.js +9 -4
  288. package/ccw/dist/core/websocket.js.map +1 -1
  289. package/ccw/dist/tools/claude-cli-tools.d.ts +152 -28
  290. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  291. package/ccw/dist/tools/claude-cli-tools.js +490 -100
  292. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  293. package/ccw/dist/tools/cli-config-manager.d.ts +24 -8
  294. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
  295. package/ccw/dist/tools/cli-config-manager.js +76 -156
  296. package/ccw/dist/tools/cli-config-manager.js.map +1 -1
  297. package/ccw/dist/tools/cli-executor-core.d.ts +85 -0
  298. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -0
  299. package/ccw/dist/tools/cli-executor-core.js +1310 -0
  300. package/ccw/dist/tools/cli-executor-core.js.map +1 -0
  301. package/ccw/dist/tools/cli-executor-state.d.ts +241 -0
  302. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -0
  303. package/ccw/dist/tools/cli-executor-state.js +392 -0
  304. package/ccw/dist/tools/cli-executor-state.js.map +1 -0
  305. package/ccw/dist/tools/cli-executor-utils.d.ts +36 -0
  306. package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -0
  307. package/ccw/dist/tools/cli-executor-utils.js +298 -0
  308. package/ccw/dist/tools/cli-executor-utils.js.map +1 -0
  309. package/ccw/dist/tools/cli-executor.d.ts +3 -377
  310. package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
  311. package/ccw/dist/tools/cli-executor.js +3 -1884
  312. package/ccw/dist/tools/cli-executor.js.map +1 -1
  313. package/ccw/dist/tools/cli-history-store.d.ts +2 -0
  314. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  315. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  316. package/ccw/dist/tools/cli-output-converter.d.ts +192 -0
  317. package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -0
  318. package/ccw/dist/tools/cli-output-converter.js +1047 -0
  319. package/ccw/dist/tools/cli-output-converter.js.map +1 -0
  320. package/ccw/dist/tools/cli-prompt-builder.d.ts +113 -0
  321. package/ccw/dist/tools/cli-prompt-builder.d.ts.map +1 -0
  322. package/ccw/dist/tools/cli-prompt-builder.js +363 -0
  323. package/ccw/dist/tools/cli-prompt-builder.js.map +1 -0
  324. package/ccw/dist/tools/codex-lens.d.ts +15 -1
  325. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  326. package/ccw/dist/tools/codex-lens.js +289 -55
  327. package/ccw/dist/tools/codex-lens.js.map +1 -1
  328. package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -1
  329. package/ccw/dist/tools/detect-changed-modules.js +22 -4
  330. package/ccw/dist/tools/detect-changed-modules.js.map +1 -1
  331. package/ccw/dist/tools/index.d.ts.map +1 -1
  332. package/ccw/dist/tools/index.js +2 -0
  333. package/ccw/dist/tools/index.js.map +1 -1
  334. package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
  335. package/ccw/dist/tools/litellm-client.js +10 -4
  336. package/ccw/dist/tools/litellm-client.js.map +1 -1
  337. package/ccw/dist/tools/litellm-executor.d.ts +2 -4
  338. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
  339. package/ccw/dist/tools/litellm-executor.js +39 -8
  340. package/ccw/dist/tools/litellm-executor.js.map +1 -1
  341. package/ccw/dist/tools/native-session-discovery.d.ts +2 -0
  342. package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
  343. package/ccw/dist/tools/native-session-discovery.js +197 -1
  344. package/ccw/dist/tools/native-session-discovery.js.map +1 -1
  345. package/ccw/dist/tools/session-manager.d.ts.map +1 -1
  346. package/ccw/dist/tools/session-manager.js +79 -0
  347. package/ccw/dist/tools/session-manager.js.map +1 -1
  348. package/ccw/dist/tools/skill-context-loader.d.ts +15 -0
  349. package/ccw/dist/tools/skill-context-loader.d.ts.map +1 -0
  350. package/ccw/dist/tools/skill-context-loader.js +198 -0
  351. package/ccw/dist/tools/skill-context-loader.js.map +1 -0
  352. package/ccw/dist/tools/smart-search.d.ts +8 -3
  353. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  354. package/ccw/dist/tools/smart-search.js +378 -75
  355. package/ccw/dist/tools/smart-search.js.map +1 -1
  356. package/ccw/dist/types/cli-settings.d.ts +86 -0
  357. package/ccw/dist/types/cli-settings.d.ts.map +1 -0
  358. package/ccw/dist/types/cli-settings.js +54 -0
  359. package/ccw/dist/types/cli-settings.js.map +1 -0
  360. package/ccw/dist/types/litellm-api-config.d.ts +40 -1
  361. package/ccw/dist/types/litellm-api-config.d.ts.map +1 -1
  362. package/ccw/dist/utils/exec-constants.d.ts +25 -0
  363. package/ccw/dist/utils/exec-constants.d.ts.map +1 -0
  364. package/ccw/dist/utils/exec-constants.js +25 -0
  365. package/ccw/dist/utils/exec-constants.js.map +1 -0
  366. package/ccw/dist/utils/path-resolver.d.ts +1 -0
  367. package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
  368. package/ccw/dist/utils/path-resolver.js +48 -3
  369. package/ccw/dist/utils/path-resolver.js.map +1 -1
  370. package/ccw/dist/utils/path-validator.d.ts.map +1 -1
  371. package/ccw/dist/utils/path-validator.js +25 -6
  372. package/ccw/dist/utils/path-validator.js.map +1 -1
  373. package/ccw/dist/utils/python-utils.d.ts.map +1 -1
  374. package/ccw/dist/utils/python-utils.js +27 -7
  375. package/ccw/dist/utils/python-utils.js.map +1 -1
  376. package/ccw/dist/utils/shell-escape.d.ts +8 -0
  377. package/ccw/dist/utils/shell-escape.d.ts.map +1 -0
  378. package/ccw/dist/utils/shell-escape.js +24 -0
  379. package/ccw/dist/utils/shell-escape.js.map +1 -0
  380. package/ccw/dist/utils/uv-manager.d.ts +167 -0
  381. package/ccw/dist/utils/uv-manager.d.ts.map +1 -0
  382. package/ccw/dist/utils/uv-manager.js +644 -0
  383. package/ccw/dist/utils/uv-manager.js.map +1 -0
  384. package/ccw/src/cli.ts +4 -1
  385. package/ccw/src/commands/cli.ts +132 -34
  386. package/ccw/src/commands/issue.ts +605 -91
  387. package/ccw/src/commands/serve.ts +15 -5
  388. package/ccw/src/commands/stop.ts +32 -5
  389. package/ccw/src/commands/tool.ts +17 -2
  390. package/ccw/src/commands/view.ts +13 -3
  391. package/ccw/src/config/cli-settings-manager.ts +460 -0
  392. package/ccw/src/config/litellm-api-config-manager.ts +392 -57
  393. package/ccw/src/core/auth/csrf-manager.ts +104 -0
  394. package/ccw/src/core/auth/csrf-middleware.ts +159 -0
  395. package/ccw/src/core/auth/middleware.ts +94 -0
  396. package/ccw/src/core/auth/token-manager.ts +219 -0
  397. package/ccw/src/core/cache-manager.ts +64 -52
  398. package/ccw/src/core/claude-freshness.ts +26 -6
  399. package/ccw/src/core/core-memory-store.ts +2 -1
  400. package/ccw/src/core/cors.ts +10 -0
  401. package/ccw/src/core/dashboard-generator-patch.ts +47 -48
  402. package/ccw/src/core/dashboard-generator.ts +797 -744
  403. package/ccw/src/core/data-aggregator.ts +667 -667
  404. package/ccw/src/core/lite-scanner.ts +156 -140
  405. package/ccw/src/core/routes/auth-routes.ts +98 -0
  406. package/ccw/src/core/routes/ccw-routes.ts +10 -20
  407. package/ccw/src/core/routes/claude-routes.ts +101 -51
  408. package/ccw/src/core/routes/cli-routes.ts +152 -55
  409. package/ccw/src/core/routes/cli-settings-routes.ts +232 -0
  410. package/ccw/src/core/routes/codexlens/README.md +37 -0
  411. package/ccw/src/core/routes/codexlens/config-handlers.ts +1269 -0
  412. package/ccw/src/core/routes/codexlens/index-handlers.ts +354 -0
  413. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +931 -0
  414. package/ccw/src/core/routes/codexlens/utils.ts +96 -0
  415. package/ccw/src/core/routes/codexlens/watcher-handlers.ts +265 -0
  416. package/ccw/src/core/routes/codexlens-routes.ts +11 -1044
  417. package/ccw/src/core/routes/discovery-routes.ts +1 -12
  418. package/ccw/src/core/routes/files-routes.ts +112 -40
  419. package/ccw/src/core/routes/graph-routes.ts +39 -46
  420. package/ccw/src/core/routes/help-routes.ts +2 -12
  421. package/ccw/src/core/routes/hooks-routes.ts +83 -44
  422. package/ccw/src/core/routes/issue-routes.ts +1 -12
  423. package/ccw/src/core/routes/litellm-api-routes.ts +566 -60
  424. package/ccw/src/core/routes/litellm-routes.ts +35 -27
  425. package/ccw/src/core/routes/mcp-routes.ts +157 -60
  426. package/ccw/src/core/routes/mcp-routes.ts.backup +549 -550
  427. package/ccw/src/core/routes/mcp-templates-db.ts +267 -268
  428. package/ccw/src/core/routes/memory-routes.ts +76 -22
  429. package/ccw/src/core/routes/nav-status-routes.ts +231 -0
  430. package/ccw/src/core/routes/rules-routes.ts +600 -81
  431. package/ccw/src/core/routes/session-routes.ts +28 -22
  432. package/ccw/src/core/routes/skills-routes.ts +452 -132
  433. package/ccw/src/core/routes/status-routes.ts +1 -12
  434. package/ccw/src/core/routes/system-routes.ts +15 -22
  435. package/ccw/src/core/routes/types.ts +25 -0
  436. package/ccw/src/core/server.ts +651 -468
  437. package/ccw/src/core/services/api-key-tester.ts +137 -0
  438. package/ccw/src/core/services/health-check-service.ts +340 -0
  439. package/ccw/src/core/websocket.ts +20 -12
  440. package/ccw/src/templates/dashboard-css/01-base.css +109 -0
  441. package/ccw/src/templates/dashboard-css/10-cli-status.css +202 -0
  442. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +308 -0
  443. package/ccw/src/templates/dashboard-css/30-core-memory.css +20 -0
  444. package/ccw/src/templates/dashboard-css/31-api-settings.css +751 -14
  445. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +230 -2
  446. package/ccw/src/templates/dashboard-js/api.js +5 -0
  447. package/ccw/src/templates/dashboard-js/components/cli-status.js +279 -107
  448. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +262 -20
  449. package/ccw/src/templates/dashboard-js/components/hook-manager.js +105 -5
  450. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +317 -0
  451. package/ccw/src/templates/dashboard-js/components/navigation.js +45 -0
  452. package/ccw/src/templates/dashboard-js/components/notifications.js +128 -0
  453. package/ccw/src/templates/dashboard-js/i18n.js +4438 -3983
  454. package/ccw/src/templates/dashboard-js/main.js +71 -0
  455. package/ccw/src/templates/dashboard-js/services.js +289 -0
  456. package/ccw/src/templates/dashboard-js/views/api-settings.js +5613 -3361
  457. package/ccw/src/templates/dashboard-js/views/claude-manager.js +1 -7
  458. package/ccw/src/templates/dashboard-js/views/cli-manager.js +581 -87
  459. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +6091 -1965
  460. package/ccw/src/templates/dashboard-js/views/core-memory.js +129 -20
  461. package/ccw/src/templates/dashboard-js/views/hook-manager.js +17 -3
  462. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +63 -0
  463. package/ccw/src/templates/dashboard-js/views/project-overview.js +182 -37
  464. package/ccw/src/templates/dashboard-js/views/rules-manager.js +26 -3
  465. package/ccw/src/templates/dashboard-js/views/skills-manager.js +2 -42
  466. package/ccw/src/templates/dashboard.html +6 -0
  467. package/ccw/src/tools/README.md +29 -0
  468. package/ccw/src/tools/claude-cli-tools.ts +640 -125
  469. package/ccw/src/tools/cli-config-manager.ts +102 -172
  470. package/ccw/src/tools/cli-executor-core.ts +1533 -0
  471. package/ccw/src/tools/cli-executor-state.ts +560 -0
  472. package/ccw/src/tools/cli-executor-utils.ts +349 -0
  473. package/ccw/src/tools/cli-executor.ts +3 -2309
  474. package/ccw/src/tools/cli-history-store.ts +2 -0
  475. package/ccw/src/tools/cli-output-converter.ts +1237 -0
  476. package/ccw/src/tools/cli-prompt-builder.ts +487 -0
  477. package/ccw/src/tools/codex-lens.ts +324 -59
  478. package/ccw/src/tools/detect-changed-modules.ts +24 -6
  479. package/ccw/src/tools/index.ts +2 -0
  480. package/ccw/src/tools/litellm-client.ts +10 -4
  481. package/ccw/src/tools/litellm-executor.ts +146 -114
  482. package/ccw/src/tools/native-session-discovery.ts +209 -1
  483. package/ccw/src/tools/session-manager.ts +88 -0
  484. package/ccw/src/tools/skill-context-loader.ts +213 -0
  485. package/ccw/src/tools/smart-search.ts +427 -76
  486. package/ccw/src/types/cli-settings.ts +137 -0
  487. package/ccw/src/types/litellm-api-config.ts +55 -1
  488. package/ccw/src/utils/exec-constants.ts +24 -0
  489. package/ccw/src/utils/path-resolver.ts +49 -3
  490. package/ccw/src/utils/path-validator.ts +28 -6
  491. package/ccw/src/utils/python-utils.ts +140 -121
  492. package/ccw/src/utils/shell-escape.ts +30 -0
  493. package/ccw/src/utils/uv-manager.ts +796 -0
  494. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
  495. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
  496. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
  497. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
  498. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  499. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  500. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  501. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
  502. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
  503. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
  504. package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +270 -251
  505. package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +33 -0
  506. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
  507. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
  508. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
  509. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
  510. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
  511. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
  512. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
  513. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
  514. package/ccw-litellm/src/ccw_litellm/config/loader.py +343 -316
  515. package/ccw-litellm/src/ccw_litellm/config/models.py +162 -130
  516. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
  517. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
  518. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
  519. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
  520. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
  521. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
  522. package/codex-lens/pyproject.toml +43 -0
  523. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
  524. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
  525. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
  526. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
  527. package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
  528. package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
  529. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  530. package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
  531. package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
  532. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  533. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
  534. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
  535. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
  536. package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
  537. package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
  538. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
  539. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  540. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
  541. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.pyc +0 -0
  542. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  543. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-310.pyc +0 -0
  544. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.pyc +0 -0
  545. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  546. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-310.pyc +0 -0
  547. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.pyc +0 -0
  548. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  549. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-310.pyc +0 -0
  550. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
  551. package/codex-lens/src/codexlens/cli/commands.py +4416 -2295
  552. package/codex-lens/src/codexlens/cli/embedding_manager.py +767 -14
  553. package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
  554. package/codex-lens/src/codexlens/config.py +321 -12
  555. package/codex-lens/src/codexlens/entities.py +4 -1
  556. package/codex-lens/src/codexlens/env_config.py +298 -0
  557. package/codex-lens/src/codexlens/indexing/__init__.py +23 -1
  558. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  559. package/codex-lens/src/codexlens/indexing/__pycache__/embedding.cpython-313.pyc +0 -0
  560. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  561. package/codex-lens/src/codexlens/indexing/embedding.py +582 -0
  562. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +62 -28
  563. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
  564. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
  565. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
  566. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.pyc +0 -0
  567. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  568. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-310.pyc +0 -0
  569. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
  570. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
  571. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
  572. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  573. package/codex-lens/src/codexlens/parsers/factory.py +139 -10
  574. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +487 -13
  575. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
  576. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
  577. package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
  578. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
  579. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.pyc +0 -0
  580. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  581. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  582. package/codex-lens/src/codexlens/search/__pycache__/graph_expander.cpython-313.pyc +0 -0
  583. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
  584. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
  585. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  586. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
  587. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
  588. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  589. package/codex-lens/src/codexlens/search/binary_searcher.py +277 -0
  590. package/codex-lens/src/codexlens/search/chain_search.py +1642 -8
  591. package/codex-lens/src/codexlens/search/enrichment.py +21 -0
  592. package/codex-lens/src/codexlens/search/graph_expander.py +264 -0
  593. package/codex-lens/src/codexlens/search/hybrid_search.py +772 -37
  594. package/codex-lens/src/codexlens/search/ranking.py +347 -8
  595. package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +225 -0
  596. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
  597. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
  598. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
  599. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
  600. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  601. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
  602. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
  603. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
  604. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
  605. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
  606. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
  607. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
  608. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
  609. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
  610. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
  611. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
  612. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  613. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  614. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  615. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  616. package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
  617. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
  618. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
  619. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
  620. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
  621. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.pyc +0 -0
  622. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  623. package/codex-lens/src/codexlens/semantic/ann_index.py +654 -0
  624. package/codex-lens/src/codexlens/semantic/factory.py +63 -3
  625. package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
  626. package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
  627. package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
  628. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
  629. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
  630. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
  631. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
  632. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
  633. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
  634. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
  635. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
  636. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
  637. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
  638. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
  639. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
  640. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
  641. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
  642. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
  643. package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
  644. package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
  645. package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
  646. package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
  647. package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
  648. package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
  649. package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
  650. package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
  651. package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
  652. package/codex-lens/src/codexlens/storage/__init__.py +3 -0
  653. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
  654. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
  655. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  656. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
  657. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
  658. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  659. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
  660. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
  661. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
  662. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
  663. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  664. package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
  665. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
  666. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
  667. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
  668. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
  669. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
  670. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
  671. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
  672. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
  673. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.pyc +0 -0
  674. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  675. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-310.pyc +0 -0
  676. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
  677. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
  678. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
  679. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
  680. package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
  681. package/codex-lens/src/codexlens/storage/index_tree.py +194 -23
  682. package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
  683. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
  684. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
  685. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
  686. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
  687. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
  688. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
  689. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
  690. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
  691. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
  692. package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
  693. package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
  694. package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
  695. package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
  696. package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
  697. package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
  698. package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
  699. package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
  700. package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
  701. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
  702. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
  703. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
  704. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
  705. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
  706. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
  707. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
  708. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
  709. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
  710. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
  711. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
  712. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
  713. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
  714. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
  715. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
  716. package/codex-lens/src/codexlens/watcher/events.py +82 -0
  717. package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
  718. package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
  719. package/codex-lens/src/codexlens/watcher/manager.py +255 -0
  720. package/package.json +4 -1
  721. package/.claude/commands/workflow/docs/analyze.md +0 -1467
  722. package/.claude/commands/workflow/docs/copyright.md +0 -1265
  723. package/.claude/skills/command-guide/SKILL.md +0 -388
  724. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
  725. package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
  726. package/.claude/skills/command-guide/guides/examples.md +0 -537
  727. package/.claude/skills/command-guide/guides/getting-started.md +0 -242
  728. package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
  729. package/.claude/skills/command-guide/guides/index-structure.md +0 -326
  730. package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
  731. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
  732. package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
  733. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
  734. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
  735. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
  736. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
  737. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
  738. package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
  739. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
  740. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
  741. package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
  742. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
  743. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
  744. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
  745. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
  746. package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
  747. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
  748. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
  749. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
  750. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
  751. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
  752. package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
  753. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
  754. package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
  755. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
  756. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
  757. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
  758. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
  759. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
  760. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
  761. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
  762. package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
  763. package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
  764. package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
  765. package/.claude/skills/command-guide/reference/commands/version.md +0 -254
  766. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
  767. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
  768. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
  769. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
  770. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
  771. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
  772. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
  773. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
  774. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  775. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
  776. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
  777. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
  778. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
  779. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
  780. package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
  781. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
  782. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
  783. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
  784. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
  785. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
  786. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
  787. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
  788. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
  789. package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
  790. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
  791. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
  792. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
  793. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
  794. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
  795. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
  796. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
  797. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
  798. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
  799. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
  800. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
  801. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
  802. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
  803. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  804. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
  805. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
  806. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
  807. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
  808. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
  809. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
  810. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
  811. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
  812. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
  813. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
  814. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
  815. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
  816. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
  817. package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
  818. package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
  819. package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
  820. package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
  821. package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
  822. package/.claude/skills/command-guide/templates/issue-question.md +0 -141
@@ -6,9 +6,174 @@ var currentCliExecution = null;
6
6
  var cliExecutionOutput = '';
7
7
  var ccwInstallations = [];
8
8
  var ccwEndpointTools = [];
9
+ var cliWrapperEndpoints = []; // CLI封装 endpoints from /api/cli/settings
9
10
  var cliToolConfig = null; // Store loaded CLI config
10
11
  var predefinedModels = {}; // Store predefined models per tool
11
12
 
13
+ // ========== Cache Key Mapping ==========
14
+ // 缓存键映射(旧键名 -> 新键名)
15
+ var CLI_CACHE_KEY_MAP = {
16
+ toolConfig: 'cli-config',
17
+ toolStatus: 'cli-status',
18
+ installations: 'cli-installations',
19
+ endpointTools: 'cli-endpoint-tools',
20
+ litellmEndpoints: 'cli-litellm-endpoints',
21
+ customEndpoints: 'cli-custom-endpoints',
22
+ wrapperEndpoints: 'cli-wrapper-endpoints'
23
+ };
24
+
25
+ // ========== CLI Cache Bridge ==========
26
+
27
+ /**
28
+ * 获取 CLI 缓存数据
29
+ * @param {string} key - 缓存键
30
+ * @returns {*} 缓存的数据或 null
31
+ */
32
+ function getCliCachedData(key) {
33
+ if (!window.cacheManager) return null;
34
+ var newKey = CLI_CACHE_KEY_MAP[key] || key;
35
+ return window.cacheManager.get(newKey);
36
+ }
37
+
38
+ /**
39
+ * 设置 CLI 缓存数据
40
+ * @param {string} key - 缓存键
41
+ * @param {*} data - 要缓存的数据
42
+ * @param {number} ttl - 缓存 TTL(毫秒),默认 5 分钟
43
+ */
44
+ function setCliCacheData(key, data, ttl) {
45
+ if (!window.cacheManager) return;
46
+ ttl = ttl || 300000;
47
+ var newKey = CLI_CACHE_KEY_MAP[key] || key;
48
+ window.cacheManager.set(newKey, data, ttl);
49
+ }
50
+
51
+ /**
52
+ * 注册 CLI 相关数据源到预加载服务
53
+ * 仅在数据源尚未注册时添加
54
+ */
55
+ function registerCliDataSources() {
56
+ if (!window.preloadService) return;
57
+
58
+ var sources = [
59
+ { key: 'cli-installations', url: '/api/ccw/installations', priority: false, ttl: 300000 },
60
+ { key: 'cli-endpoint-tools', url: '/api/ccw/tools', priority: false, ttl: 300000 },
61
+ { key: 'cli-litellm-endpoints', url: '/api/litellm-api/config', priority: false, ttl: 300000 },
62
+ { key: 'cli-custom-endpoints', url: '/api/cli/endpoints', priority: false, ttl: 300000 },
63
+ { key: 'cli-wrapper-endpoints', url: '/api/cli/settings', priority: false, ttl: 300000 }
64
+ ];
65
+
66
+ sources.forEach(function(src) {
67
+ if (!window.preloadService.sources.has(src.key)) {
68
+ window.preloadService.register(src.key,
69
+ function() { return fetch(src.url).then(function(r) { return r.ok ? r.json() : Promise.reject(r); }); },
70
+ { isHighPriority: src.priority, ttl: src.ttl }
71
+ );
72
+ }
73
+ });
74
+ }
75
+
76
+ // ========== CSRF Token Management ==========
77
+ var csrfToken = null; // Store CSRF token for state-changing requests
78
+
79
+ /**
80
+ * Fetch wrapper that handles CSRF token management
81
+ * Captures new token from response and includes token in requests
82
+ */
83
+ async function csrfFetch(url, options) {
84
+ options = options || {};
85
+ options.headers = options.headers || {};
86
+
87
+ // Add CSRF token header for state-changing methods
88
+ var method = (options.method || 'GET').toUpperCase();
89
+
90
+ // Auto-initialize CSRF token for state-changing requests
91
+ if (['POST', 'PUT', 'PATCH', 'DELETE'].indexOf(method) !== -1) {
92
+ await initCsrfToken();
93
+ }
94
+
95
+ if (['POST', 'PUT', 'PATCH', 'DELETE'].indexOf(method) !== -1 && csrfToken) {
96
+ options.headers['X-CSRF-Token'] = csrfToken;
97
+ }
98
+
99
+ var response = await fetch(url, options);
100
+
101
+ // Capture new CSRF token from response
102
+ var newToken = response.headers.get('X-CSRF-Token');
103
+ if (newToken) {
104
+ csrfToken = newToken;
105
+ }
106
+
107
+ return response;
108
+ }
109
+
110
+ /**
111
+ * Initialize CSRF token by fetching from server
112
+ * Should be called before any state-changing requests
113
+ */
114
+ async function initCsrfToken() {
115
+ if (csrfToken) return; // Already initialized
116
+
117
+ try {
118
+ var response = await fetch('/api/csrf-token');
119
+ if (response.ok) {
120
+ var data = await response.json();
121
+ csrfToken = data.csrfToken || response.headers.get('X-CSRF-Token');
122
+ }
123
+ } catch (err) {
124
+ console.warn('[CLI Manager] Failed to fetch CSRF token:', err);
125
+ }
126
+ }
127
+
128
+ // ========== Active Execution Sync ==========
129
+
130
+ /**
131
+ * Sync active CLI executions from server
132
+ * Called when view is opened to restore running execution state
133
+ */
134
+ async function syncActiveExecutions() {
135
+ try {
136
+ var response = await fetch('/api/cli/active');
137
+ if (!response.ok) return;
138
+
139
+ var data = await response.json();
140
+ if (!data.executions || data.executions.length === 0) return;
141
+
142
+ // Restore the first active execution
143
+ var active = data.executions[0];
144
+
145
+ // Restore execution state
146
+ currentCliExecution = {
147
+ executionId: active.id,
148
+ tool: active.tool,
149
+ mode: active.mode,
150
+ startTime: active.startTime
151
+ };
152
+ cliExecutionOutput = active.output || '';
153
+
154
+ // Update UI if output panel exists
155
+ var outputPanel = document.getElementById('cli-output-panel');
156
+ var outputContent = document.getElementById('cli-output-content');
157
+
158
+ if (outputPanel && outputContent) {
159
+ outputPanel.style.display = 'block';
160
+ outputContent.textContent = cliExecutionOutput;
161
+ outputContent.scrollTop = outputContent.scrollHeight;
162
+
163
+ // Update status indicator
164
+ var statusIndicator = outputPanel.querySelector('.cli-status-indicator');
165
+ if (statusIndicator) {
166
+ statusIndicator.className = 'cli-status-indicator running';
167
+ statusIndicator.textContent = t('cli.running') || 'Running...';
168
+ }
169
+ }
170
+
171
+ console.log('[CLI Manager] Restored active execution:', active.id);
172
+ } catch (err) {
173
+ console.warn('[CLI Manager] Failed to sync active executions:', err);
174
+ }
175
+ }
176
+
12
177
  // ========== Navigation Helpers ==========
13
178
 
14
179
  /**
@@ -92,9 +257,50 @@ async function loadCliCustomEndpoints() {
92
257
  }
93
258
  }
94
259
 
260
+ // ========== CLI Wrapper Endpoints (CLI封装) ==========
261
+ async function loadCliWrapperEndpoints() {
262
+ try {
263
+ var response = await fetch('/api/cli/settings');
264
+ if (!response.ok) throw new Error('Failed to load CLI wrapper endpoints');
265
+ var data = await response.json();
266
+ cliWrapperEndpoints = data.endpoints || [];
267
+ return cliWrapperEndpoints;
268
+ } catch (err) {
269
+ console.error('Failed to load CLI wrapper endpoints:', err);
270
+ cliWrapperEndpoints = [];
271
+ return [];
272
+ }
273
+ }
274
+
275
+ async function toggleCliWrapperEnabled(endpointId, enabled) {
276
+ try {
277
+ await initCsrfToken();
278
+ var response = await csrfFetch('/api/cli/settings/' + endpointId, {
279
+ method: 'PUT',
280
+ headers: { 'Content-Type': 'application/json' },
281
+ body: JSON.stringify({ enabled: enabled })
282
+ });
283
+ if (!response.ok) throw new Error('Failed to update CLI wrapper endpoint');
284
+ var data = await response.json();
285
+ if (data.success) {
286
+ // Update local state
287
+ var idx = cliWrapperEndpoints.findIndex(function(e) { return e.id === endpointId; });
288
+ if (idx >= 0) {
289
+ cliWrapperEndpoints[idx].enabled = enabled;
290
+ }
291
+ showRefreshToast((enabled ? t('cli.enabled') || 'Enabled' : t('cli.disabled') || 'Disabled') + ': ' + endpointId, 'success');
292
+ }
293
+ return data;
294
+ } catch (err) {
295
+ showRefreshToast((t('cli.updateFailed') || 'Failed to update') + ': ' + err.message, 'error');
296
+ throw err;
297
+ }
298
+ }
299
+
95
300
  async function toggleEndpointEnabled(endpointId, enabled) {
96
301
  try {
97
- var response = await fetch('/api/cli/endpoints/' + endpointId, {
302
+ await initCsrfToken();
303
+ var response = await csrfFetch('/api/cli/endpoints/' + endpointId, {
98
304
  method: 'PUT',
99
305
  headers: { 'Content-Type': 'application/json' },
100
306
  body: JSON.stringify({ enabled: enabled })
@@ -118,7 +324,8 @@ async function toggleEndpointEnabled(endpointId, enabled) {
118
324
 
119
325
  async function syncEndpointToCliTools(endpoint) {
120
326
  try {
121
- var response = await fetch('/api/cli/endpoints', {
327
+ await initCsrfToken();
328
+ var response = await csrfFetch('/api/cli/endpoints', {
122
329
  method: 'POST',
123
330
  headers: { 'Content-Type': 'application/json' },
124
331
  body: JSON.stringify({
@@ -146,12 +353,23 @@ window.syncEndpointToCliTools = syncEndpointToCliTools;
146
353
 
147
354
  // ========== CLI Tool Configuration ==========
148
355
  async function loadCliToolConfig() {
356
+ // 尝试从缓存获取
357
+ var cached = getCliCachedData('toolConfig');
358
+ if (cached) {
359
+ cliToolConfig = cached.config || null;
360
+ predefinedModels = cached.predefinedModels || {};
361
+ return cached;
362
+ }
363
+
149
364
  try {
150
365
  var response = await fetch('/api/cli/config');
151
366
  if (!response.ok) throw new Error('Failed to load CLI config');
152
367
  var data = await response.json();
153
368
  cliToolConfig = data.config || null;
154
369
  predefinedModels = data.predefinedModels || {};
370
+
371
+ // 缓存结果
372
+ setCliCacheData('toolConfig', data);
155
373
  return data;
156
374
  } catch (err) {
157
375
  console.error('Failed to load CLI config:', err);
@@ -163,13 +381,18 @@ async function loadCliToolConfig() {
163
381
 
164
382
  async function updateCliToolConfig(tool, updates) {
165
383
  try {
166
- var response = await fetch('/api/cli/config/' + tool, {
384
+ // Ensure CSRF token is initialized before making state-changing request
385
+ await initCsrfToken();
386
+
387
+ var response = await csrfFetch('/api/cli/config/' + tool, {
167
388
  method: 'PUT',
168
389
  headers: { 'Content-Type': 'application/json' },
169
390
  body: JSON.stringify(updates)
170
391
  });
171
- if (!response.ok) throw new Error('Failed to update CLI config');
172
392
  var data = await response.json();
393
+ if (!response.ok) {
394
+ throw new Error(data.error || 'Failed to update CLI config');
395
+ }
173
396
  if (data.success && cliToolConfig && cliToolConfig.tools) {
174
397
  cliToolConfig.tools[tool] = data.config;
175
398
  }
@@ -281,6 +504,25 @@ function buildToolConfigModalContent(tool, config, models, status) {
281
504
  '</div>' +
282
505
  '</div>' +
283
506
 
507
+ // Tags Section - Unified input with inline tags
508
+ '<div class="tool-config-section">' +
509
+ '<h4>Tags <span class="text-muted">(optional labels)</span></h4>' +
510
+ '<div class="tags-unified-input" id="tagsUnifiedInput">' +
511
+ (config.tags || []).map(function(tag) {
512
+ return '<span class="tag-item tag-' + escapeHtml(tag) + '">' + escapeHtml(tag) + '<button type="button" class="tag-remove" data-tag="' + escapeHtml(tag) + '">&times;</button></span>';
513
+ }).join('') +
514
+ '<input type="text" id="tagInput" class="tag-inline-input" placeholder="输入标签按 Enter 添加" />' +
515
+ '</div>' +
516
+ '<div class="predefined-tags-row">' +
517
+ '<button type="button" class="predefined-tag-btn" data-tag="分析"><i data-lucide="search" class="w-3 h-3"></i> 分析</button>' +
518
+ '<button type="button" class="predefined-tag-btn" data-tag="编码"><i data-lucide="code" class="w-3 h-3"></i> 编码</button>' +
519
+ '<button type="button" class="predefined-tag-btn" data-tag="Debug"><i data-lucide="bug" class="w-3 h-3"></i> Debug</button>' +
520
+ '<button type="button" class="predefined-tag-btn" data-tag="重构"><i data-lucide="refresh-cw" class="w-3 h-3"></i> 重构</button>' +
521
+ '<button type="button" class="predefined-tag-btn" data-tag="测试"><i data-lucide="check-square" class="w-3 h-3"></i> 测试</button>' +
522
+ '<button type="button" class="predefined-tag-btn" data-tag="文档"><i data-lucide="file-text" class="w-3 h-3"></i> 文档</button>' +
523
+ '</div>' +
524
+ '</div>' +
525
+
284
526
  // Footer
285
527
  '<div class="tool-config-footer">' +
286
528
  '<button class="btn btn-outline" onclick="closeModal()">' + t('common.cancel') + '</button>' +
@@ -292,6 +534,91 @@ function buildToolConfigModalContent(tool, config, models, status) {
292
534
  }
293
535
 
294
536
  function initToolConfigModalEvents(tool, currentConfig, models) {
537
+ // Local tags state (copy from config)
538
+ var currentTags = (currentConfig.tags || []).slice();
539
+
540
+ // Helper to render tags inline with input
541
+ function renderTags() {
542
+ var container = document.getElementById('tagsUnifiedInput');
543
+ var input = document.getElementById('tagInput');
544
+ if (!container) return;
545
+
546
+ // Remove existing tag items but keep the input
547
+ container.querySelectorAll('.tag-item').forEach(function(el) { el.remove(); });
548
+
549
+ // Insert tags before the input
550
+ currentTags.forEach(function(tag) {
551
+ var tagEl = document.createElement('span');
552
+ tagEl.className = 'tag-item tag-' + escapeHtml(tag);
553
+ tagEl.innerHTML = escapeHtml(tag) + '<button type="button" class="tag-remove" data-tag="' + escapeHtml(tag) + '">&times;</button>';
554
+ container.insertBefore(tagEl, input);
555
+ });
556
+
557
+ // Re-attach remove handlers
558
+ container.querySelectorAll('.tag-remove').forEach(function(btn) {
559
+ btn.onclick = function(e) {
560
+ e.stopPropagation();
561
+ var tagToRemove = this.getAttribute('data-tag');
562
+ currentTags = currentTags.filter(function(t) { return t !== tagToRemove; });
563
+ renderTags();
564
+ };
565
+ });
566
+
567
+ // Update predefined tag buttons state
568
+ document.querySelectorAll('.predefined-tag-btn').forEach(function(btn) {
569
+ var tag = btn.getAttribute('data-tag');
570
+ if (currentTags.indexOf(tag) !== -1) {
571
+ btn.classList.add('selected');
572
+ btn.disabled = true;
573
+ } else {
574
+ btn.classList.remove('selected');
575
+ btn.disabled = false;
576
+ }
577
+ });
578
+ }
579
+
580
+ // Click on unified input container focuses the input
581
+ var unifiedInput = document.getElementById('tagsUnifiedInput');
582
+ if (unifiedInput) {
583
+ unifiedInput.onclick = function(e) {
584
+ if (e.target === this) {
585
+ document.getElementById('tagInput').focus();
586
+ }
587
+ };
588
+ }
589
+
590
+ // Tag input handler
591
+ var tagInput = document.getElementById('tagInput');
592
+ if (tagInput) {
593
+ tagInput.onkeydown = function(e) {
594
+ if (e.key === 'Enter') {
595
+ e.preventDefault();
596
+ var newTag = this.value.trim();
597
+ if (newTag && currentTags.indexOf(newTag) === -1) {
598
+ currentTags.push(newTag);
599
+ renderTags();
600
+ }
601
+ this.value = '';
602
+ }
603
+ };
604
+ }
605
+
606
+ // Predefined tag click handlers
607
+ document.querySelectorAll('.predefined-tag-btn').forEach(function(btn) {
608
+ btn.onclick = function() {
609
+ var tag = this.getAttribute('data-tag');
610
+ if (tag && currentTags.indexOf(tag) === -1) {
611
+ currentTags.push(tag);
612
+ renderTags();
613
+ }
614
+ };
615
+ });
616
+
617
+ // Initialize tags display
618
+ renderTags();
619
+ // Initialize lucide icons for predefined buttons
620
+ if (window.lucide) lucide.createIcons();
621
+
295
622
  // Toggle Enable/Disable
296
623
  var toggleBtn = document.getElementById('toggleEnableBtn');
297
624
  if (toggleBtn) {
@@ -377,10 +704,15 @@ function initToolConfigModalEvents(tool, currentConfig, models) {
377
704
  try {
378
705
  await updateCliToolConfig(tool, {
379
706
  primaryModel: primaryModel,
380
- secondaryModel: secondaryModel
707
+ secondaryModel: secondaryModel,
708
+ tags: currentTags
381
709
  });
710
+ // Reload config to reflect changes
711
+ await loadCliToolConfig();
382
712
  showRefreshToast('Configuration saved', 'success');
383
713
  closeModal();
714
+ renderToolsSection();
715
+ if (window.lucide) lucide.createIcons();
384
716
  } catch (err) {
385
717
  showRefreshToast('Failed to save: ' + err.message, 'error');
386
718
  }
@@ -392,26 +724,50 @@ function initToolConfigModalEvents(tool, currentConfig, models) {
392
724
  }
393
725
 
394
726
  // ========== Rendering ==========
395
- async function renderCliManager() {
396
- var container = document.getElementById('mainContent');
397
- if (!container) return;
398
727
 
399
- // Hide stats grid and search for CLI view
400
- var statsGrid = document.getElementById('statsGrid');
401
- var searchInput = document.getElementById('searchInput');
402
- if (statsGrid) statsGrid.style.display = 'none';
403
- if (searchInput) searchInput.parentElement.style.display = 'none';
404
-
405
- // Load data (including CodexLens status for tools section)
406
- await Promise.all([
407
- loadCliToolStatus(),
408
- loadCodexLensStatus(),
409
- loadCcwInstallations(),
410
- loadCcwEndpointTools(),
411
- loadLitellmApiEndpoints(),
412
- loadCliCustomEndpoints()
413
- ]);
728
+ /**
729
+ * 构建 CLI Manager 骨架屏
730
+ * @returns {string} HTML 字符串
731
+ */
732
+ function buildCliManagerSkeleton() {
733
+ return '<div class="space-y-6">' +
734
+ '<div class="flex items-center justify-between mb-4">' +
735
+ '<h2 class="text-lg font-semibold">' + (t('title.cliTools') || 'CLI Tools & CCW') + '</h2>' +
736
+ '</div>' +
737
+ '<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">' +
738
+ // 左侧 Tools 区域骨架
739
+ '<div class="card p-4">' +
740
+ '<div class="animate-pulse space-y-4">' +
741
+ '<div class="h-4 bg-muted rounded w-1/3"></div>' +
742
+ '<div class="h-16 bg-muted rounded"></div>' +
743
+ '<div class="h-16 bg-muted rounded"></div>' +
744
+ '<div class="h-16 bg-muted rounded"></div>' +
745
+ '</div>' +
746
+ '</div>' +
747
+ // 右侧 CCW 区域骨架
748
+ '<div class="card p-4">' +
749
+ '<div class="animate-pulse space-y-4">' +
750
+ '<div class="h-4 bg-muted rounded w-1/3"></div>' +
751
+ '<div class="h-20 bg-muted rounded"></div>' +
752
+ '<div class="h-20 bg-muted rounded"></div>' +
753
+ '</div>' +
754
+ '</div>' +
755
+ '</div>' +
756
+ // 底部区域骨架
757
+ '<div class="card p-4">' +
758
+ '<div class="animate-pulse space-y-4">' +
759
+ '<div class="h-4 bg-muted rounded w-1/4"></div>' +
760
+ '<div class="h-12 bg-muted rounded"></div>' +
761
+ '</div>' +
762
+ '</div>' +
763
+ '</div>';
764
+ }
414
765
 
766
+ /**
767
+ * 渲染 CLI Manager 实际内容(内部容器结构 + 各子面板)
768
+ * @param {HTMLElement} container - 主容器元素
769
+ */
770
+ function renderCliManagerContent(container) {
415
771
  container.innerHTML = '<div class="status-manager">' +
416
772
  '<div class="status-two-column">' +
417
773
  '<div class="cli-section" id="tools-section"></div>' +
@@ -423,22 +779,89 @@ async function renderCliManager() {
423
779
  '</div>' +
424
780
  '<section id="storageCard" class="mb-6"></section>';
425
781
 
426
- // Render sub-panels
782
+ // 渲染子面板
427
783
  renderToolsSection();
428
784
  renderCcwSection();
429
785
  renderLanguageSettingsSection();
430
786
  renderCliSettingsSection();
431
787
  renderCcwEndpointToolsSection();
432
788
 
433
- // Initialize storage manager card
789
+ // 初始化存储管理器卡片
434
790
  if (typeof initStorageManager === 'function') {
435
791
  initStorageManager();
436
792
  }
437
793
 
438
- // Initialize Lucide icons
794
+ // 初始化 Lucide 图标
439
795
  if (window.lucide) lucide.createIcons();
440
796
  }
441
797
 
798
+ async function renderCliManager() {
799
+ var container = document.getElementById('mainContent');
800
+ if (!container) return;
801
+
802
+ // 隐藏统计网格和搜索框
803
+ var statsGrid = document.getElementById('statsGrid');
804
+ var searchInput = document.getElementById('searchInput');
805
+ if (statsGrid) statsGrid.style.display = 'none';
806
+ if (searchInput) searchInput.parentElement.style.display = 'none';
807
+
808
+ // 注册数据源(如果尚未注册)
809
+ registerCliDataSources();
810
+
811
+ // 1. 立即显示骨架屏
812
+ container.innerHTML = buildCliManagerSkeleton();
813
+ if (window.lucide) lucide.createIcons();
814
+
815
+ // 2. 尝试从缓存渲染(快速展示)
816
+ var cachedConfig = getCliCachedData('toolConfig');
817
+ var cachedStatus = getCliCachedData('toolStatus');
818
+ var hasCachedData = cachedConfig && cachedStatus;
819
+
820
+ if (hasCachedData) {
821
+ // 应用缓存数据
822
+ cliToolConfig = cachedConfig.config;
823
+ predefinedModels = cachedConfig.predefinedModels || {};
824
+ // 立即渲染缓存数据
825
+ renderCliManagerContent(container);
826
+ console.log('[CLI Manager] Rendered from cache');
827
+ }
828
+
829
+ // 3. 后台加载最新数据
830
+ try {
831
+ await Promise.all([
832
+ loadCliToolsConfig(),
833
+ loadCliToolStatus(),
834
+ loadCodexLensStatus(),
835
+ loadCcwInstallations(),
836
+ loadCcwEndpointTools(),
837
+ loadLitellmApiEndpoints(),
838
+ loadCliCustomEndpoints(),
839
+ loadCliWrapperEndpoints()
840
+ ]);
841
+
842
+ // 4. 用最新数据更新 UI(如果之前未渲染或数据有变化)
843
+ renderCliManagerContent(container);
844
+ console.log('[CLI Manager] Rendered with fresh data');
845
+ } catch (err) {
846
+ console.error('[CLI Manager] Failed to load data:', err);
847
+ // 如果没有缓存数据且加载失败,显示错误提示
848
+ if (!hasCachedData) {
849
+ container.innerHTML = '<div class="card p-4 text-center">' +
850
+ '<i data-lucide="alert-circle" class="w-8 h-8 text-muted-foreground mx-auto mb-2"></i>' +
851
+ '<p class="text-muted-foreground">' + (t('common.loadFailed') || 'Failed to load data') + '</p>' +
852
+ '<button class="btn btn-sm mt-2" onclick="renderCliManager()">' +
853
+ '<i data-lucide="refresh-cw" class="w-3 h-3 mr-1"></i>' +
854
+ (t('common.retry') || 'Retry') +
855
+ '</button>' +
856
+ '</div>';
857
+ if (window.lucide) lucide.createIcons();
858
+ }
859
+ }
860
+
861
+ // 同步活动执行
862
+ syncActiveExecutions();
863
+ }
864
+
442
865
  // ========== Helper Functions ==========
443
866
 
444
867
  /**
@@ -502,77 +925,48 @@ function renderToolsSection() {
502
925
  var toolDescriptions = {
503
926
  gemini: t('cli.geminiDesc'),
504
927
  qwen: t('cli.qwenDesc'),
505
- codex: t('cli.codexDesc')
928
+ codex: t('cli.codexDesc'),
929
+ claude: t('cli.claudeDesc') || 'Anthropic Claude Code CLI for AI-assisted development',
930
+ opencode: t('cli.opencodeDesc') || 'OpenCode CLI - Multi-provider AI coding assistant'
506
931
  };
507
932
 
508
- var tools = ['gemini', 'qwen', 'codex'];
933
+ var tools = ['gemini', 'qwen', 'codex', 'claude', 'opencode'];
509
934
  var available = Object.values(cliToolStatus).filter(function(t) { return t.available; }).length;
510
935
 
511
936
  var toolsHtml = tools.map(function(tool) {
512
937
  var status = cliToolStatus[tool] || {};
513
938
  var isAvailable = status.available;
514
- var isDefault = defaultCliTool === tool;
939
+ var toolConfig = cliToolConfig && cliToolConfig.tools ? cliToolConfig.tools[tool] : null;
940
+ var tags = toolConfig && toolConfig.tags ? toolConfig.tags : [];
941
+
942
+ // Build tags HTML with color classes
943
+ var tagsHtml = tags.length > 0
944
+ ? '<div class="tool-tags">' + tags.map(function(tag) {
945
+ return '<span class="tool-tag tag-' + escapeHtml(tag) + '">' + escapeHtml(tag) + '</span>';
946
+ }).join('') + '</div>'
947
+ : '';
515
948
 
516
949
  return '<div class="tool-item clickable ' + (isAvailable ? 'available' : 'unavailable') + '" onclick="showToolConfigModal(\'' + tool + '\')">' +
517
950
  '<div class="tool-item-left">' +
518
951
  '<span class="tool-status-dot ' + (isAvailable ? 'status-available' : 'status-unavailable') + '"></span>' +
519
952
  '<div class="tool-item-info">' +
520
953
  '<div class="tool-item-name">' + tool.charAt(0).toUpperCase() + tool.slice(1) +
521
- (isDefault ? '<span class="tool-default-badge">' + t('cli.default') + '</span>' : '') +
522
954
  '<i data-lucide="settings" class="w-3 h-3 tool-config-icon"></i>' +
523
955
  '</div>' +
524
956
  '<div class="tool-item-desc">' + toolDescriptions[tool] + '</div>' +
957
+ tagsHtml +
525
958
  '</div>' +
526
959
  '</div>' +
527
960
  '<div class="tool-item-right">' +
528
961
  (isAvailable
529
962
  ? '<span class="tool-status-text success"><i data-lucide="check-circle" class="w-3.5 h-3.5"></i> ' + t('cli.ready') + '</span>'
530
963
  : '<span class="tool-status-text muted"><i data-lucide="circle-dashed" class="w-3.5 h-3.5"></i> ' + t('cli.notInstalled') + '</span>') +
531
- (isAvailable && !isDefault
532
- ? '<button class="btn-sm btn-outline" onclick="event.stopPropagation(); setDefaultCliTool(\'' + tool + '\')"><i data-lucide="star" class="w-3 h-3"></i> ' + t('cli.setDefault') + '</button>'
533
- : '') +
534
964
  '</div>' +
535
965
  '</div>';
536
966
  }).join('');
537
967
 
538
- // CodexLens item - simplified view with link to manager page
539
- var codexLensHtml = '<div class="tool-item clickable ' + (codexLensStatus.ready ? 'available' : 'unavailable') + '" onclick="navigateToCodexLensManager()">' +
540
- '<div class="tool-item-left">' +
541
- '<span class="tool-status-dot ' + (codexLensStatus.ready ? 'status-available' : 'status-unavailable') + '"></span>' +
542
- '<div class="tool-item-info">' +
543
- '<div class="tool-item-name">CodexLens <span class="tool-type-badge">Index</span>' +
544
- '<i data-lucide="external-link" class="w-3 h-3 tool-config-icon"></i></div>' +
545
- '<div class="tool-item-desc">' + (codexLensStatus.ready ? t('cli.codexLensDesc') : t('cli.codexLensDescFull')) + '</div>' +
546
- '</div>' +
547
- '</div>' +
548
- '<div class="tool-item-right">' +
549
- (codexLensStatus.ready
550
- ? '<span class="tool-status-text success"><i data-lucide="check-circle" class="w-3.5 h-3.5"></i> v' + (codexLensStatus.version || 'installed') + '</span>' +
551
- '<button class="btn-sm btn-primary" onclick="event.stopPropagation(); navigateToCodexLensManager()"><i data-lucide="settings" class="w-3 h-3"></i> ' + t('cli.openManager') + '</button>'
552
- : '<span class="tool-status-text muted"><i data-lucide="circle-dashed" class="w-3.5 h-3.5"></i> ' + t('cli.notInstalled') + '</span>' +
553
- '<button class="btn-sm btn-primary" onclick="event.stopPropagation(); navigateToCodexLensManager()"><i data-lucide="settings" class="w-3 h-3"></i> ' + t('cli.openManager') + '</button>') +
554
- '</div>' +
555
- '</div>';
556
-
557
- // Semantic Search item (only show if CodexLens is installed)
558
- var semanticHtml = '';
559
- if (codexLensStatus.ready) {
560
- semanticHtml = '<div class="tool-item ' + (semanticStatus.available ? 'available' : 'unavailable') + '">' +
561
- '<div class="tool-item-left">' +
562
- '<span class="tool-status-dot ' + (semanticStatus.available ? 'status-available' : 'status-unavailable') + '"></span>' +
563
- '<div class="tool-item-info">' +
564
- '<div class="tool-item-name">Semantic Search <span class="tool-type-badge ai">AI</span></div>' +
565
- '<div class="tool-item-desc">' + (semanticStatus.available ? 'AI-powered code understanding' : 'Natural language code search') + '</div>' +
566
- '</div>' +
567
- '</div>' +
568
- '<div class="tool-item-right">' +
569
- (semanticStatus.available
570
- ? '<span class="tool-status-text success"><i data-lucide="sparkles" class="w-3.5 h-3.5"></i> ' + (semanticStatus.backend || 'Ready') + '</span>'
571
- : '<span class="tool-status-text muted"><i data-lucide="circle-dashed" class="w-3.5 h-3.5"></i> Not Installed</span>' +
572
- '<button class="btn-sm btn-primary" onclick="event.stopPropagation(); openSemanticInstallWizard()"><i data-lucide="brain" class="w-3 h-3"></i> Install</button>') +
573
- '</div>' +
574
- '</div>';
575
- }
968
+ // CodexLens and Semantic Search removed from this list
969
+ // They are managed in the dedicated CodexLens Manager page (left menu)
576
970
 
577
971
  // API Endpoints section
578
972
  var apiEndpointsHtml = '';
@@ -619,6 +1013,45 @@ function renderToolsSection() {
619
1013
  '</div>';
620
1014
  }
621
1015
 
1016
+ // CLI Wrapper (CLI封装) section
1017
+ var cliWrapperHtml = '';
1018
+ if (cliWrapperEndpoints.length > 0) {
1019
+ var wrapperItems = cliWrapperEndpoints.map(function(endpoint) {
1020
+ var isEnabled = endpoint.enabled !== false;
1021
+ var desc = endpoint.description || (t('cli.customClaudeSettings') || 'Custom Claude CLI settings');
1022
+ // Show command hint with name for easy copying
1023
+ var commandHint = 'ccw cli --tool ' + endpoint.name;
1024
+
1025
+ return '<div class="tool-item clickable ' + (isEnabled ? 'available' : 'unavailable') + '" onclick="navigateToApiSettings(\'' + endpoint.id + '\')">' +
1026
+ '<div class="tool-item-left">' +
1027
+ '<span class="tool-status-dot ' + (isEnabled ? 'status-available' : 'status-unavailable') + '"></span>' +
1028
+ '<div class="tool-item-info">' +
1029
+ '<div class="tool-item-name">' + escapeHtml(endpoint.name) + ' <span class="tool-type-badge" style="background: var(--primary); color: white;">' + (t('cli.wrapper') || 'Wrapper') + '</span></div>' +
1030
+ '<div class="tool-item-desc">' + escapeHtml(desc) + '</div>' +
1031
+ '<div class="tool-item-command" style="font-family: var(--font-mono); font-size: 0.7rem; color: var(--muted-foreground); margin-top: 0.25rem;">' + escapeHtml(commandHint) + '</div>' +
1032
+ '</div>' +
1033
+ '</div>' +
1034
+ '<div class="tool-item-right">' +
1035
+ '<label class="toggle-switch" onclick="event.stopPropagation()">' +
1036
+ '<input type="checkbox" ' + (isEnabled ? 'checked' : '') + ' onchange="toggleCliWrapperEnabled(\'' + endpoint.id + '\', this.checked); renderToolsSection();">' +
1037
+ '<span class="toggle-slider"></span>' +
1038
+ '</label>' +
1039
+ '</div>' +
1040
+ '</div>';
1041
+ }).join('');
1042
+
1043
+ var enabledCount = cliWrapperEndpoints.filter(function(e) { return e.enabled !== false; }).length;
1044
+ cliWrapperHtml = '<div class="tools-subsection" style="margin-top: 1rem; padding-top: 1rem; border-top: 1px solid var(--border);">' +
1045
+ '<div class="section-header-left" style="margin-bottom: 0.5rem;">' +
1046
+ '<h4 style="font-size: 0.875rem; font-weight: 600; display: flex; align-items: center; gap: 0.5rem;">' +
1047
+ '<i data-lucide="package-2" class="w-4 h-4"></i> ' + (t('cli.cliWrapper') || 'CLI Wrapper') +
1048
+ '</h4>' +
1049
+ '<span class="section-count">' + enabledCount + '/' + cliWrapperEndpoints.length + ' ' + (t('cli.enabled') || 'enabled') + '</span>' +
1050
+ '</div>' +
1051
+ '<div class="tools-list">' + wrapperItems + '</div>' +
1052
+ '</div>';
1053
+ }
1054
+
622
1055
  container.innerHTML = '<div class="section-header">' +
623
1056
  '<div class="section-header-left">' +
624
1057
  '<h3><i data-lucide="terminal" class="w-4 h-4"></i> ' + t('cli.tools') + '</h3>' +
@@ -630,14 +1063,34 @@ function renderToolsSection() {
630
1063
  '</div>' +
631
1064
  '<div class="tools-list">' +
632
1065
  toolsHtml +
633
- codexLensHtml +
634
- semanticHtml +
635
1066
  '</div>' +
636
- apiEndpointsHtml;
1067
+ apiEndpointsHtml +
1068
+ cliWrapperHtml;
637
1069
 
638
1070
  if (window.lucide) lucide.createIcons();
639
1071
  }
640
1072
 
1073
+ /**
1074
+ * Navigate to API Settings page and open the CLI wrapper endpoint for editing
1075
+ */
1076
+ function navigateToApiSettings(endpointId) {
1077
+ // Store the endpoint ID to edit after navigation
1078
+ window.pendingCliWrapperEdit = endpointId;
1079
+
1080
+ var navItem = document.querySelector('.nav-item[data-view="api-settings"]');
1081
+ if (navItem) {
1082
+ navItem.click();
1083
+ } else {
1084
+ // Fallback: try to render directly
1085
+ if (typeof renderApiSettings === 'function') {
1086
+ currentView = 'api-settings';
1087
+ renderApiSettings();
1088
+ } else {
1089
+ showRefreshToast(t('common.error') + ': API Settings not available', 'error');
1090
+ }
1091
+ }
1092
+ }
1093
+
641
1094
  // ========== CCW Section (Right Column) ==========
642
1095
  function renderCcwSection() {
643
1096
  var container = document.getElementById('ccw-section');
@@ -713,6 +1166,8 @@ function renderCcwSection() {
713
1166
  // ========== Language Settings State ==========
714
1167
  var chineseResponseEnabled = false;
715
1168
  var chineseResponseLoading = false;
1169
+ var codexChineseResponseEnabled = false;
1170
+ var codexChineseResponseLoading = false;
716
1171
  var windowsPlatformEnabled = false;
717
1172
  var windowsPlatformLoading = false;
718
1173
 
@@ -722,12 +1177,14 @@ async function loadLanguageSettings() {
722
1177
  var response = await fetch('/api/language/chinese-response');
723
1178
  if (!response.ok) throw new Error('Failed to load language settings');
724
1179
  var data = await response.json();
725
- chineseResponseEnabled = data.enabled || false;
1180
+ chineseResponseEnabled = data.claudeEnabled || data.enabled || false;
1181
+ codexChineseResponseEnabled = data.codexEnabled || false;
726
1182
  return data;
727
1183
  } catch (err) {
728
1184
  console.error('Failed to load language settings:', err);
729
1185
  chineseResponseEnabled = false;
730
- return { enabled: false, guidelinesExists: false };
1186
+ codexChineseResponseEnabled = false;
1187
+ return { claudeEnabled: false, codexEnabled: false, guidelinesExists: false };
731
1188
  }
732
1189
  }
733
1190
 
@@ -745,8 +1202,13 @@ async function loadWindowsPlatformSettings() {
745
1202
  }
746
1203
  }
747
1204
 
748
- async function toggleChineseResponse(enabled) {
749
- if (chineseResponseLoading) return;
1205
+ async function toggleChineseResponse(enabled, target) {
1206
+ // target: 'claude' (default) or 'codex'
1207
+ target = target || 'claude';
1208
+ var isCodex = target === 'codex';
1209
+ var loadingVar = isCodex ? 'codexChineseResponseLoading' : 'chineseResponseLoading';
1210
+
1211
+ if (isCodex ? codexChineseResponseLoading : chineseResponseLoading) return;
750
1212
 
751
1213
  // Pre-check: verify CCW workflows are installed (only when enabling)
752
1214
  if (enabled && typeof ccwInstallStatus !== 'undefined' && !ccwInstallStatus.installed) {
@@ -757,13 +1219,17 @@ async function toggleChineseResponse(enabled) {
757
1219
  }
758
1220
  }
759
1221
 
760
- chineseResponseLoading = true;
1222
+ if (isCodex) {
1223
+ codexChineseResponseLoading = true;
1224
+ } else {
1225
+ chineseResponseLoading = true;
1226
+ }
761
1227
 
762
1228
  try {
763
1229
  var response = await fetch('/api/language/chinese-response', {
764
1230
  method: 'POST',
765
1231
  headers: { 'Content-Type': 'application/json' },
766
- body: JSON.stringify({ enabled: enabled })
1232
+ body: JSON.stringify({ enabled: enabled, target: target })
767
1233
  });
768
1234
 
769
1235
  if (!response.ok) {
@@ -779,18 +1245,27 @@ async function toggleChineseResponse(enabled) {
779
1245
  }
780
1246
 
781
1247
  var data = await response.json();
782
- chineseResponseEnabled = data.enabled;
1248
+ if (isCodex) {
1249
+ codexChineseResponseEnabled = data.enabled;
1250
+ } else {
1251
+ chineseResponseEnabled = data.enabled;
1252
+ }
783
1253
 
784
1254
  // Update UI
785
1255
  renderLanguageSettingsSection();
786
1256
 
787
1257
  // Show toast
788
- showRefreshToast(enabled ? t('lang.enableSuccess') : t('lang.disableSuccess'), 'success');
1258
+ var toolName = isCodex ? 'Codex' : 'Claude';
1259
+ showRefreshToast(toolName + ': ' + (enabled ? t('lang.enableSuccess') : t('lang.disableSuccess')), 'success');
789
1260
  } catch (err) {
790
1261
  console.error('Failed to toggle Chinese response:', err);
791
1262
  // Error already shown in the !response.ok block
792
1263
  } finally {
793
- chineseResponseLoading = false;
1264
+ if (isCodex) {
1265
+ codexChineseResponseLoading = false;
1266
+ } else {
1267
+ chineseResponseLoading = false;
1268
+ }
794
1269
  }
795
1270
  }
796
1271
 
@@ -848,7 +1323,7 @@ async function renderLanguageSettingsSection() {
848
1323
  if (!container) return;
849
1324
 
850
1325
  // Load current state if not loaded
851
- if (!chineseResponseEnabled && !chineseResponseLoading) {
1326
+ if (!chineseResponseEnabled && !codexChineseResponseEnabled && !chineseResponseLoading) {
852
1327
  await loadLanguageSettings();
853
1328
  }
854
1329
  if (!windowsPlatformEnabled && !windowsPlatformLoading) {
@@ -861,22 +1336,41 @@ async function renderLanguageSettingsSection() {
861
1336
  '</div>' +
862
1337
  '</div>' +
863
1338
  '<div class="cli-settings-grid" style="grid-template-columns: 1fr 1fr;">' +
1339
+ // Chinese Response - Claude
864
1340
  '<div class="cli-setting-item">' +
865
1341
  '<label class="cli-setting-label">' +
866
1342
  '<i data-lucide="message-square-text" class="w-3 h-3"></i>' +
867
- t('lang.chinese') +
1343
+ t('lang.chinese') + ' <span class="badge badge-sm badge-primary">Claude</span>' +
868
1344
  '</label>' +
869
1345
  '<div class="cli-setting-control">' +
870
1346
  '<label class="cli-toggle">' +
871
- '<input type="checkbox"' + (chineseResponseEnabled ? ' checked' : '') + ' onchange="toggleChineseResponse(this.checked)"' + (chineseResponseLoading ? ' disabled' : '') + '>' +
1347
+ '<input type="checkbox"' + (chineseResponseEnabled ? ' checked' : '') + ' onchange="toggleChineseResponse(this.checked, \'claude\')"' + (chineseResponseLoading ? ' disabled' : '') + '>' +
872
1348
  '<span class="cli-toggle-slider"></span>' +
873
1349
  '</label>' +
874
1350
  '<span class="cli-setting-status ' + (chineseResponseEnabled ? 'enabled' : 'disabled') + '">' +
875
1351
  (chineseResponseEnabled ? t('lang.enabled') : t('lang.disabled')) +
876
1352
  '</span>' +
877
1353
  '</div>' +
878
- '<p class="cli-setting-desc">' + t('lang.chineseDesc') + '</p>' +
1354
+ '<p class="cli-setting-desc">' + t('lang.chineseDescClaude') + '</p>' +
1355
+ '</div>' +
1356
+ // Chinese Response - Codex
1357
+ '<div class="cli-setting-item">' +
1358
+ '<label class="cli-setting-label">' +
1359
+ '<i data-lucide="message-square-text" class="w-3 h-3"></i>' +
1360
+ t('lang.chinese') + ' <span class="badge badge-sm badge-secondary">Codex</span>' +
1361
+ '</label>' +
1362
+ '<div class="cli-setting-control">' +
1363
+ '<label class="cli-toggle">' +
1364
+ '<input type="checkbox"' + (codexChineseResponseEnabled ? ' checked' : '') + ' onchange="toggleChineseResponse(this.checked, \'codex\')"' + (codexChineseResponseLoading ? ' disabled' : '') + '>' +
1365
+ '<span class="cli-toggle-slider"></span>' +
1366
+ '</label>' +
1367
+ '<span class="cli-setting-status ' + (codexChineseResponseEnabled ? 'enabled' : 'disabled') + '">' +
1368
+ (codexChineseResponseEnabled ? t('lang.enabled') : t('lang.disabled')) +
1369
+ '</span>' +
1370
+ '</div>' +
1371
+ '<p class="cli-setting-desc">' + t('lang.chineseDescCodex') + '</p>' +
879
1372
  '</div>' +
1373
+ // Windows Platform
880
1374
  '<div class="cli-setting-item">' +
881
1375
  '<label class="cli-setting-label">' +
882
1376
  '<i data-lucide="monitor" class="w-3 h-3"></i>' +