claude-code-workflow 6.3.18 → 6.3.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (822) hide show
  1. package/.claude/CLAUDE.md +8 -5
  2. package/.claude/agents/action-planning-agent.md +26 -2
  3. package/.claude/agents/code-developer.md +132 -43
  4. package/.claude/agents/debug-explore-agent.md +434 -0
  5. package/.claude/agents/test-fix-agent.md +14 -0
  6. package/.claude/commands/issue/discover.md +41 -0
  7. package/.claude/commands/issue/execute.md +200 -19
  8. package/.claude/commands/issue/new.md +1 -1
  9. package/.claude/commands/issue/plan.md +6 -1
  10. package/.claude/commands/issue/queue.md +94 -39
  11. package/.claude/commands/memory/swagger-docs.md +773 -0
  12. package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
  13. package/.claude/commands/workflow/execute.md +54 -34
  14. package/.claude/commands/workflow/lite-execute.md +48 -164
  15. package/.claude/commands/workflow/lite-fix.md +4 -4
  16. package/.claude/commands/workflow/lite-plan.md +5 -5
  17. package/.claude/commands/workflow/plan.md +27 -27
  18. package/.claude/commands/workflow/review.md +42 -17
  19. package/.claude/commands/workflow/tdd-plan.md +25 -25
  20. package/.claude/commands/workflow/test-fix-gen.md +10 -10
  21. package/.claude/commands/workflow/test-gen.md +14 -14
  22. package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
  23. package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
  24. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
  25. package/.claude/skills/ccw/SKILL.md +462 -0
  26. package/.claude/skills/ccw/index/command-capabilities.json +127 -0
  27. package/.claude/skills/ccw/index/intent-rules.json +136 -0
  28. package/.claude/skills/ccw/index/workflow-chains.json +451 -0
  29. package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
  30. package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
  31. package/.claude/skills/ccw/phases/actions/docs.md +93 -0
  32. package/.claude/skills/ccw/phases/actions/full.md +154 -0
  33. package/.claude/skills/ccw/phases/actions/issue.md +201 -0
  34. package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
  35. package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
  36. package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
  37. package/.claude/skills/ccw/phases/actions/ui.md +79 -0
  38. package/.claude/skills/ccw/phases/orchestrator.md +435 -0
  39. package/.claude/skills/ccw/specs/intent-classification.md +336 -0
  40. package/.claude/skills/ccw-help/SKILL.md +177 -0
  41. package/.claude/skills/ccw-help/index/all-agents.json +82 -0
  42. package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
  43. package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
  44. package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
  45. package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
  46. package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
  47. package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
  48. package/.claude/skills/code-reviewer/README.md +340 -0
  49. package/.claude/skills/code-reviewer/SKILL.md +308 -0
  50. package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
  51. package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
  52. package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
  53. package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
  54. package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
  55. package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
  56. package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
  57. package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
  58. package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
  59. package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
  60. package/.claude/skills/skill-generator/SKILL.md +187 -0
  61. package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
  62. package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
  63. package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
  64. package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
  65. package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
  66. package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
  67. package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
  68. package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
  69. package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
  70. package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
  71. package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
  72. package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
  73. package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
  74. package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
  75. package/.claude/skills/skill-generator/templates/script-python.md +198 -0
  76. package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
  77. package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
  78. package/.claude/workflows/chinese-response.md +15 -28
  79. package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
  80. package/.claude/workflows/cli-tools-usage.md +221 -177
  81. package/.claude/workflows/windows-platform.md +13 -10
  82. package/.codex/prompts/issue-execute.md +305 -82
  83. package/.codex/prompts/issue-queue.md +22 -0
  84. package/.codex/prompts/lite-execute.md +36 -11
  85. package/README.md +309 -305
  86. package/ccw/README.md +10 -4
  87. package/ccw/dist/cli.d.ts.map +1 -1
  88. package/ccw/dist/cli.js +4 -1
  89. package/ccw/dist/cli.js.map +1 -1
  90. package/ccw/dist/commands/cli.d.ts.map +1 -1
  91. package/ccw/dist/commands/cli.js +131 -34
  92. package/ccw/dist/commands/cli.js.map +1 -1
  93. package/ccw/dist/commands/issue.d.ts +152 -0
  94. package/ccw/dist/commands/issue.d.ts.map +1 -1
  95. package/ccw/dist/commands/issue.js +550 -85
  96. package/ccw/dist/commands/issue.js.map +1 -1
  97. package/ccw/dist/commands/serve.d.ts +1 -0
  98. package/ccw/dist/commands/serve.d.ts.map +1 -1
  99. package/ccw/dist/commands/serve.js +12 -5
  100. package/ccw/dist/commands/serve.js.map +1 -1
  101. package/ccw/dist/commands/stop.d.ts.map +1 -1
  102. package/ccw/dist/commands/stop.js +29 -5
  103. package/ccw/dist/commands/stop.js.map +1 -1
  104. package/ccw/dist/commands/tool.d.ts.map +1 -1
  105. package/ccw/dist/commands/tool.js +19 -2
  106. package/ccw/dist/commands/tool.js.map +1 -1
  107. package/ccw/dist/commands/view.d.ts +1 -0
  108. package/ccw/dist/commands/view.d.ts.map +1 -1
  109. package/ccw/dist/commands/view.js +10 -3
  110. package/ccw/dist/commands/view.js.map +1 -1
  111. package/ccw/dist/config/cli-settings-manager.d.ts +86 -0
  112. package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -0
  113. package/ccw/dist/config/cli-settings-manager.js +392 -0
  114. package/ccw/dist/config/cli-settings-manager.js.map +1 -0
  115. package/ccw/dist/config/litellm-api-config-manager.d.ts +71 -5
  116. package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
  117. package/ccw/dist/config/litellm-api-config-manager.js +290 -20
  118. package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
  119. package/ccw/dist/core/auth/csrf-manager.d.ts +18 -0
  120. package/ccw/dist/core/auth/csrf-manager.d.ts.map +1 -0
  121. package/ccw/dist/core/auth/csrf-manager.js +80 -0
  122. package/ccw/dist/core/auth/csrf-manager.js.map +1 -0
  123. package/ccw/dist/core/auth/csrf-middleware.d.ts +8 -0
  124. package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -0
  125. package/ccw/dist/core/auth/csrf-middleware.js +141 -0
  126. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -0
  127. package/ccw/dist/core/auth/middleware.d.ts +15 -0
  128. package/ccw/dist/core/auth/middleware.d.ts.map +1 -0
  129. package/ccw/dist/core/auth/middleware.js +76 -0
  130. package/ccw/dist/core/auth/middleware.js.map +1 -0
  131. package/ccw/dist/core/auth/token-manager.d.ts +41 -0
  132. package/ccw/dist/core/auth/token-manager.d.ts.map +1 -0
  133. package/ccw/dist/core/auth/token-manager.js +171 -0
  134. package/ccw/dist/core/auth/token-manager.js.map +1 -0
  135. package/ccw/dist/core/cache-manager.d.ts +6 -6
  136. package/ccw/dist/core/cache-manager.d.ts.map +1 -1
  137. package/ccw/dist/core/cache-manager.js +70 -48
  138. package/ccw/dist/core/cache-manager.js.map +1 -1
  139. package/ccw/dist/core/claude-freshness.d.ts.map +1 -1
  140. package/ccw/dist/core/claude-freshness.js +23 -3
  141. package/ccw/dist/core/claude-freshness.js.map +1 -1
  142. package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
  143. package/ccw/dist/core/core-memory-store.js +2 -1
  144. package/ccw/dist/core/core-memory-store.js.map +1 -1
  145. package/ccw/dist/core/cors.d.ts +3 -0
  146. package/ccw/dist/core/cors.d.ts.map +1 -0
  147. package/ccw/dist/core/cors.js +10 -0
  148. package/ccw/dist/core/cors.js.map +1 -0
  149. package/ccw/dist/core/dashboard-generator-patch.js +0 -1
  150. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
  151. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  152. package/ccw/dist/core/dashboard-generator.js +417 -416
  153. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  154. package/ccw/dist/core/data-aggregator.js +2 -2
  155. package/ccw/dist/core/data-aggregator.js.map +1 -1
  156. package/ccw/dist/core/lite-scanner.d.ts +1 -1
  157. package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
  158. package/ccw/dist/core/lite-scanner.js +130 -127
  159. package/ccw/dist/core/lite-scanner.js.map +1 -1
  160. package/ccw/dist/core/routes/auth-routes.d.ts +12 -0
  161. package/ccw/dist/core/routes/auth-routes.d.ts.map +1 -0
  162. package/ccw/dist/core/routes/auth-routes.js +80 -0
  163. package/ccw/dist/core/routes/auth-routes.js.map +1 -0
  164. package/ccw/dist/core/routes/ccw-routes.d.ts +1 -14
  165. package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
  166. package/ccw/dist/core/routes/ccw-routes.js +9 -4
  167. package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
  168. package/ccw/dist/core/routes/claude-routes.d.ts +1 -14
  169. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  170. package/ccw/dist/core/routes/claude-routes.js +98 -39
  171. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  172. package/ccw/dist/core/routes/cli-routes.d.ts +14 -12
  173. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  174. package/ccw/dist/core/routes/cli-routes.js +122 -43
  175. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  176. package/ccw/dist/core/routes/cli-settings-routes.d.ts +11 -0
  177. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -0
  178. package/ccw/dist/core/routes/cli-settings-routes.js +204 -0
  179. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -0
  180. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts +6 -0
  181. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -0
  182. package/ccw/dist/core/routes/codexlens/config-handlers.js +1195 -0
  183. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -0
  184. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts +10 -0
  185. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -0
  186. package/ccw/dist/core/routes/codexlens/index-handlers.js +322 -0
  187. package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -0
  188. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts +6 -0
  189. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -0
  190. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +865 -0
  191. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -0
  192. package/ccw/dist/core/routes/codexlens/utils.d.ts +23 -0
  193. package/ccw/dist/core/routes/codexlens/utils.d.ts.map +1 -0
  194. package/ccw/dist/core/routes/codexlens/utils.js +85 -0
  195. package/ccw/dist/core/routes/codexlens/utils.js.map +1 -0
  196. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts +13 -0
  197. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts.map +1 -0
  198. package/ccw/dist/core/routes/codexlens/watcher-handlers.js +235 -0
  199. package/ccw/dist/core/routes/codexlens/watcher-handlers.js.map +1 -0
  200. package/ccw/dist/core/routes/codexlens-routes.d.ts +2 -11
  201. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  202. package/ccw/dist/core/routes/codexlens-routes.js +10 -981
  203. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  204. package/ccw/dist/core/routes/discovery-routes.d.ts +1 -35
  205. package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -1
  206. package/ccw/dist/core/routes/discovery-routes.js +25 -0
  207. package/ccw/dist/core/routes/discovery-routes.js.map +1 -1
  208. package/ccw/dist/core/routes/files-routes.d.ts +1 -14
  209. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  210. package/ccw/dist/core/routes/files-routes.js +57 -14
  211. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  212. package/ccw/dist/core/routes/graph-routes.d.ts +1 -14
  213. package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
  214. package/ccw/dist/core/routes/graph-routes.js +36 -37
  215. package/ccw/dist/core/routes/graph-routes.js.map +1 -1
  216. package/ccw/dist/core/routes/help-routes.d.ts +1 -14
  217. package/ccw/dist/core/routes/help-routes.d.ts.map +1 -1
  218. package/ccw/dist/core/routes/help-routes.js +5 -0
  219. package/ccw/dist/core/routes/help-routes.js.map +1 -1
  220. package/ccw/dist/core/routes/hooks-routes.d.ts +4 -14
  221. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  222. package/ccw/dist/core/routes/hooks-routes.js +43 -21
  223. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  224. package/ccw/dist/core/routes/issue-routes.d.ts +1 -34
  225. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
  226. package/ccw/dist/core/routes/issue-routes.js +24 -0
  227. package/ccw/dist/core/routes/issue-routes.js.map +1 -1
  228. package/ccw/dist/core/routes/litellm-api-routes.d.ts +1 -14
  229. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
  230. package/ccw/dist/core/routes/litellm-api-routes.js +505 -48
  231. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
  232. package/ccw/dist/core/routes/litellm-routes.d.ts +1 -14
  233. package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -1
  234. package/ccw/dist/core/routes/litellm-routes.js +28 -11
  235. package/ccw/dist/core/routes/litellm-routes.js.map +1 -1
  236. package/ccw/dist/core/routes/mcp-routes.d.ts +1 -14
  237. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
  238. package/ccw/dist/core/routes/mcp-routes.js +99 -30
  239. package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
  240. package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
  241. package/ccw/dist/core/routes/mcp-templates-db.js +30 -31
  242. package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
  243. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  244. package/ccw/dist/core/routes/memory-routes.js +74 -24
  245. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  246. package/ccw/dist/core/routes/nav-status-routes.d.ts +3 -0
  247. package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -0
  248. package/ccw/dist/core/routes/nav-status-routes.js +217 -0
  249. package/ccw/dist/core/routes/nav-status-routes.js.map +1 -0
  250. package/ccw/dist/core/routes/rules-routes.d.ts +1 -14
  251. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
  252. package/ccw/dist/core/routes/rules-routes.js +481 -58
  253. package/ccw/dist/core/routes/rules-routes.js.map +1 -1
  254. package/ccw/dist/core/routes/session-routes.d.ts +1 -14
  255. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
  256. package/ccw/dist/core/routes/session-routes.js +15 -3
  257. package/ccw/dist/core/routes/session-routes.js.map +1 -1
  258. package/ccw/dist/core/routes/skills-routes.d.ts +1 -14
  259. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  260. package/ccw/dist/core/routes/skills-routes.js +394 -112
  261. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  262. package/ccw/dist/core/routes/status-routes.d.ts +1 -14
  263. package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
  264. package/ccw/dist/core/routes/status-routes.js +4 -0
  265. package/ccw/dist/core/routes/status-routes.js.map +1 -1
  266. package/ccw/dist/core/routes/system-routes.d.ts +4 -10
  267. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  268. package/ccw/dist/core/routes/system-routes.js +6 -4
  269. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  270. package/ccw/dist/core/routes/types.d.ts +19 -0
  271. package/ccw/dist/core/routes/types.d.ts.map +1 -0
  272. package/ccw/dist/core/routes/types.js +2 -0
  273. package/ccw/dist/core/routes/types.js.map +1 -0
  274. package/ccw/dist/core/server.d.ts.map +1 -1
  275. package/ccw/dist/core/server.js +201 -29
  276. package/ccw/dist/core/server.js.map +1 -1
  277. package/ccw/dist/core/services/api-key-tester.d.ts +31 -0
  278. package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
  279. package/ccw/dist/core/services/api-key-tester.js +106 -0
  280. package/ccw/dist/core/services/api-key-tester.js.map +1 -0
  281. package/ccw/dist/core/services/health-check-service.d.ts +82 -0
  282. package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
  283. package/ccw/dist/core/services/health-check-service.js +271 -0
  284. package/ccw/dist/core/services/health-check-service.js.map +1 -0
  285. package/ccw/dist/core/websocket.d.ts +9 -7
  286. package/ccw/dist/core/websocket.d.ts.map +1 -1
  287. package/ccw/dist/core/websocket.js +9 -4
  288. package/ccw/dist/core/websocket.js.map +1 -1
  289. package/ccw/dist/tools/claude-cli-tools.d.ts +152 -28
  290. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  291. package/ccw/dist/tools/claude-cli-tools.js +490 -100
  292. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  293. package/ccw/dist/tools/cli-config-manager.d.ts +24 -8
  294. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
  295. package/ccw/dist/tools/cli-config-manager.js +76 -156
  296. package/ccw/dist/tools/cli-config-manager.js.map +1 -1
  297. package/ccw/dist/tools/cli-executor-core.d.ts +85 -0
  298. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -0
  299. package/ccw/dist/tools/cli-executor-core.js +1310 -0
  300. package/ccw/dist/tools/cli-executor-core.js.map +1 -0
  301. package/ccw/dist/tools/cli-executor-state.d.ts +241 -0
  302. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -0
  303. package/ccw/dist/tools/cli-executor-state.js +392 -0
  304. package/ccw/dist/tools/cli-executor-state.js.map +1 -0
  305. package/ccw/dist/tools/cli-executor-utils.d.ts +36 -0
  306. package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -0
  307. package/ccw/dist/tools/cli-executor-utils.js +298 -0
  308. package/ccw/dist/tools/cli-executor-utils.js.map +1 -0
  309. package/ccw/dist/tools/cli-executor.d.ts +3 -377
  310. package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
  311. package/ccw/dist/tools/cli-executor.js +3 -1884
  312. package/ccw/dist/tools/cli-executor.js.map +1 -1
  313. package/ccw/dist/tools/cli-history-store.d.ts +2 -0
  314. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  315. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  316. package/ccw/dist/tools/cli-output-converter.d.ts +192 -0
  317. package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -0
  318. package/ccw/dist/tools/cli-output-converter.js +1047 -0
  319. package/ccw/dist/tools/cli-output-converter.js.map +1 -0
  320. package/ccw/dist/tools/cli-prompt-builder.d.ts +113 -0
  321. package/ccw/dist/tools/cli-prompt-builder.d.ts.map +1 -0
  322. package/ccw/dist/tools/cli-prompt-builder.js +363 -0
  323. package/ccw/dist/tools/cli-prompt-builder.js.map +1 -0
  324. package/ccw/dist/tools/codex-lens.d.ts +15 -1
  325. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  326. package/ccw/dist/tools/codex-lens.js +289 -55
  327. package/ccw/dist/tools/codex-lens.js.map +1 -1
  328. package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -1
  329. package/ccw/dist/tools/detect-changed-modules.js +22 -4
  330. package/ccw/dist/tools/detect-changed-modules.js.map +1 -1
  331. package/ccw/dist/tools/index.d.ts.map +1 -1
  332. package/ccw/dist/tools/index.js +2 -0
  333. package/ccw/dist/tools/index.js.map +1 -1
  334. package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
  335. package/ccw/dist/tools/litellm-client.js +10 -4
  336. package/ccw/dist/tools/litellm-client.js.map +1 -1
  337. package/ccw/dist/tools/litellm-executor.d.ts +2 -4
  338. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
  339. package/ccw/dist/tools/litellm-executor.js +39 -8
  340. package/ccw/dist/tools/litellm-executor.js.map +1 -1
  341. package/ccw/dist/tools/native-session-discovery.d.ts +2 -0
  342. package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
  343. package/ccw/dist/tools/native-session-discovery.js +197 -1
  344. package/ccw/dist/tools/native-session-discovery.js.map +1 -1
  345. package/ccw/dist/tools/session-manager.d.ts.map +1 -1
  346. package/ccw/dist/tools/session-manager.js +79 -0
  347. package/ccw/dist/tools/session-manager.js.map +1 -1
  348. package/ccw/dist/tools/skill-context-loader.d.ts +15 -0
  349. package/ccw/dist/tools/skill-context-loader.d.ts.map +1 -0
  350. package/ccw/dist/tools/skill-context-loader.js +198 -0
  351. package/ccw/dist/tools/skill-context-loader.js.map +1 -0
  352. package/ccw/dist/tools/smart-search.d.ts +8 -3
  353. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  354. package/ccw/dist/tools/smart-search.js +378 -75
  355. package/ccw/dist/tools/smart-search.js.map +1 -1
  356. package/ccw/dist/types/cli-settings.d.ts +86 -0
  357. package/ccw/dist/types/cli-settings.d.ts.map +1 -0
  358. package/ccw/dist/types/cli-settings.js +54 -0
  359. package/ccw/dist/types/cli-settings.js.map +1 -0
  360. package/ccw/dist/types/litellm-api-config.d.ts +40 -1
  361. package/ccw/dist/types/litellm-api-config.d.ts.map +1 -1
  362. package/ccw/dist/utils/exec-constants.d.ts +25 -0
  363. package/ccw/dist/utils/exec-constants.d.ts.map +1 -0
  364. package/ccw/dist/utils/exec-constants.js +25 -0
  365. package/ccw/dist/utils/exec-constants.js.map +1 -0
  366. package/ccw/dist/utils/path-resolver.d.ts +1 -0
  367. package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
  368. package/ccw/dist/utils/path-resolver.js +48 -3
  369. package/ccw/dist/utils/path-resolver.js.map +1 -1
  370. package/ccw/dist/utils/path-validator.d.ts.map +1 -1
  371. package/ccw/dist/utils/path-validator.js +25 -6
  372. package/ccw/dist/utils/path-validator.js.map +1 -1
  373. package/ccw/dist/utils/python-utils.d.ts.map +1 -1
  374. package/ccw/dist/utils/python-utils.js +27 -7
  375. package/ccw/dist/utils/python-utils.js.map +1 -1
  376. package/ccw/dist/utils/shell-escape.d.ts +8 -0
  377. package/ccw/dist/utils/shell-escape.d.ts.map +1 -0
  378. package/ccw/dist/utils/shell-escape.js +24 -0
  379. package/ccw/dist/utils/shell-escape.js.map +1 -0
  380. package/ccw/dist/utils/uv-manager.d.ts +167 -0
  381. package/ccw/dist/utils/uv-manager.d.ts.map +1 -0
  382. package/ccw/dist/utils/uv-manager.js +644 -0
  383. package/ccw/dist/utils/uv-manager.js.map +1 -0
  384. package/ccw/src/cli.ts +4 -1
  385. package/ccw/src/commands/cli.ts +132 -34
  386. package/ccw/src/commands/issue.ts +605 -91
  387. package/ccw/src/commands/serve.ts +15 -5
  388. package/ccw/src/commands/stop.ts +32 -5
  389. package/ccw/src/commands/tool.ts +17 -2
  390. package/ccw/src/commands/view.ts +13 -3
  391. package/ccw/src/config/cli-settings-manager.ts +460 -0
  392. package/ccw/src/config/litellm-api-config-manager.ts +392 -57
  393. package/ccw/src/core/auth/csrf-manager.ts +104 -0
  394. package/ccw/src/core/auth/csrf-middleware.ts +159 -0
  395. package/ccw/src/core/auth/middleware.ts +94 -0
  396. package/ccw/src/core/auth/token-manager.ts +219 -0
  397. package/ccw/src/core/cache-manager.ts +64 -52
  398. package/ccw/src/core/claude-freshness.ts +26 -6
  399. package/ccw/src/core/core-memory-store.ts +2 -1
  400. package/ccw/src/core/cors.ts +10 -0
  401. package/ccw/src/core/dashboard-generator-patch.ts +47 -48
  402. package/ccw/src/core/dashboard-generator.ts +797 -744
  403. package/ccw/src/core/data-aggregator.ts +667 -667
  404. package/ccw/src/core/lite-scanner.ts +156 -140
  405. package/ccw/src/core/routes/auth-routes.ts +98 -0
  406. package/ccw/src/core/routes/ccw-routes.ts +10 -20
  407. package/ccw/src/core/routes/claude-routes.ts +101 -51
  408. package/ccw/src/core/routes/cli-routes.ts +152 -55
  409. package/ccw/src/core/routes/cli-settings-routes.ts +232 -0
  410. package/ccw/src/core/routes/codexlens/README.md +37 -0
  411. package/ccw/src/core/routes/codexlens/config-handlers.ts +1269 -0
  412. package/ccw/src/core/routes/codexlens/index-handlers.ts +354 -0
  413. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +931 -0
  414. package/ccw/src/core/routes/codexlens/utils.ts +96 -0
  415. package/ccw/src/core/routes/codexlens/watcher-handlers.ts +265 -0
  416. package/ccw/src/core/routes/codexlens-routes.ts +11 -1044
  417. package/ccw/src/core/routes/discovery-routes.ts +1 -12
  418. package/ccw/src/core/routes/files-routes.ts +112 -40
  419. package/ccw/src/core/routes/graph-routes.ts +39 -46
  420. package/ccw/src/core/routes/help-routes.ts +2 -12
  421. package/ccw/src/core/routes/hooks-routes.ts +83 -44
  422. package/ccw/src/core/routes/issue-routes.ts +1 -12
  423. package/ccw/src/core/routes/litellm-api-routes.ts +566 -60
  424. package/ccw/src/core/routes/litellm-routes.ts +35 -27
  425. package/ccw/src/core/routes/mcp-routes.ts +157 -60
  426. package/ccw/src/core/routes/mcp-routes.ts.backup +549 -550
  427. package/ccw/src/core/routes/mcp-templates-db.ts +267 -268
  428. package/ccw/src/core/routes/memory-routes.ts +76 -22
  429. package/ccw/src/core/routes/nav-status-routes.ts +231 -0
  430. package/ccw/src/core/routes/rules-routes.ts +600 -81
  431. package/ccw/src/core/routes/session-routes.ts +28 -22
  432. package/ccw/src/core/routes/skills-routes.ts +452 -132
  433. package/ccw/src/core/routes/status-routes.ts +1 -12
  434. package/ccw/src/core/routes/system-routes.ts +15 -22
  435. package/ccw/src/core/routes/types.ts +25 -0
  436. package/ccw/src/core/server.ts +651 -468
  437. package/ccw/src/core/services/api-key-tester.ts +137 -0
  438. package/ccw/src/core/services/health-check-service.ts +340 -0
  439. package/ccw/src/core/websocket.ts +20 -12
  440. package/ccw/src/templates/dashboard-css/01-base.css +109 -0
  441. package/ccw/src/templates/dashboard-css/10-cli-status.css +202 -0
  442. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +308 -0
  443. package/ccw/src/templates/dashboard-css/30-core-memory.css +20 -0
  444. package/ccw/src/templates/dashboard-css/31-api-settings.css +751 -14
  445. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +230 -2
  446. package/ccw/src/templates/dashboard-js/api.js +5 -0
  447. package/ccw/src/templates/dashboard-js/components/cli-status.js +279 -107
  448. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +262 -20
  449. package/ccw/src/templates/dashboard-js/components/hook-manager.js +105 -5
  450. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +317 -0
  451. package/ccw/src/templates/dashboard-js/components/navigation.js +45 -0
  452. package/ccw/src/templates/dashboard-js/components/notifications.js +128 -0
  453. package/ccw/src/templates/dashboard-js/i18n.js +4438 -3983
  454. package/ccw/src/templates/dashboard-js/main.js +71 -0
  455. package/ccw/src/templates/dashboard-js/services.js +289 -0
  456. package/ccw/src/templates/dashboard-js/views/api-settings.js +5613 -3361
  457. package/ccw/src/templates/dashboard-js/views/claude-manager.js +1 -7
  458. package/ccw/src/templates/dashboard-js/views/cli-manager.js +581 -87
  459. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +6091 -1965
  460. package/ccw/src/templates/dashboard-js/views/core-memory.js +129 -20
  461. package/ccw/src/templates/dashboard-js/views/hook-manager.js +17 -3
  462. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +63 -0
  463. package/ccw/src/templates/dashboard-js/views/project-overview.js +182 -37
  464. package/ccw/src/templates/dashboard-js/views/rules-manager.js +26 -3
  465. package/ccw/src/templates/dashboard-js/views/skills-manager.js +2 -42
  466. package/ccw/src/templates/dashboard.html +6 -0
  467. package/ccw/src/tools/README.md +29 -0
  468. package/ccw/src/tools/claude-cli-tools.ts +640 -125
  469. package/ccw/src/tools/cli-config-manager.ts +102 -172
  470. package/ccw/src/tools/cli-executor-core.ts +1533 -0
  471. package/ccw/src/tools/cli-executor-state.ts +560 -0
  472. package/ccw/src/tools/cli-executor-utils.ts +349 -0
  473. package/ccw/src/tools/cli-executor.ts +3 -2309
  474. package/ccw/src/tools/cli-history-store.ts +2 -0
  475. package/ccw/src/tools/cli-output-converter.ts +1237 -0
  476. package/ccw/src/tools/cli-prompt-builder.ts +487 -0
  477. package/ccw/src/tools/codex-lens.ts +324 -59
  478. package/ccw/src/tools/detect-changed-modules.ts +24 -6
  479. package/ccw/src/tools/index.ts +2 -0
  480. package/ccw/src/tools/litellm-client.ts +10 -4
  481. package/ccw/src/tools/litellm-executor.ts +146 -114
  482. package/ccw/src/tools/native-session-discovery.ts +209 -1
  483. package/ccw/src/tools/session-manager.ts +88 -0
  484. package/ccw/src/tools/skill-context-loader.ts +213 -0
  485. package/ccw/src/tools/smart-search.ts +427 -76
  486. package/ccw/src/types/cli-settings.ts +137 -0
  487. package/ccw/src/types/litellm-api-config.ts +55 -1
  488. package/ccw/src/utils/exec-constants.ts +24 -0
  489. package/ccw/src/utils/path-resolver.ts +49 -3
  490. package/ccw/src/utils/path-validator.ts +28 -6
  491. package/ccw/src/utils/python-utils.ts +140 -121
  492. package/ccw/src/utils/shell-escape.ts +30 -0
  493. package/ccw/src/utils/uv-manager.ts +796 -0
  494. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
  495. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
  496. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
  497. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
  498. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  499. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  500. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  501. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
  502. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
  503. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
  504. package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +270 -251
  505. package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +33 -0
  506. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
  507. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
  508. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
  509. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
  510. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
  511. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
  512. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
  513. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
  514. package/ccw-litellm/src/ccw_litellm/config/loader.py +343 -316
  515. package/ccw-litellm/src/ccw_litellm/config/models.py +162 -130
  516. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
  517. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
  518. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
  519. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
  520. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
  521. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
  522. package/codex-lens/pyproject.toml +43 -0
  523. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
  524. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
  525. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
  526. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
  527. package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
  528. package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
  529. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  530. package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
  531. package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
  532. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  533. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
  534. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
  535. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
  536. package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
  537. package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
  538. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
  539. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  540. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
  541. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.pyc +0 -0
  542. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  543. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-310.pyc +0 -0
  544. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.pyc +0 -0
  545. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  546. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-310.pyc +0 -0
  547. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.pyc +0 -0
  548. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  549. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-310.pyc +0 -0
  550. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
  551. package/codex-lens/src/codexlens/cli/commands.py +4416 -2295
  552. package/codex-lens/src/codexlens/cli/embedding_manager.py +767 -14
  553. package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
  554. package/codex-lens/src/codexlens/config.py +321 -12
  555. package/codex-lens/src/codexlens/entities.py +4 -1
  556. package/codex-lens/src/codexlens/env_config.py +298 -0
  557. package/codex-lens/src/codexlens/indexing/__init__.py +23 -1
  558. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  559. package/codex-lens/src/codexlens/indexing/__pycache__/embedding.cpython-313.pyc +0 -0
  560. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  561. package/codex-lens/src/codexlens/indexing/embedding.py +582 -0
  562. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +62 -28
  563. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
  564. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
  565. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
  566. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.pyc +0 -0
  567. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  568. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-310.pyc +0 -0
  569. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
  570. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
  571. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
  572. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  573. package/codex-lens/src/codexlens/parsers/factory.py +139 -10
  574. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +487 -13
  575. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
  576. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
  577. package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
  578. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
  579. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.pyc +0 -0
  580. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  581. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  582. package/codex-lens/src/codexlens/search/__pycache__/graph_expander.cpython-313.pyc +0 -0
  583. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
  584. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
  585. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  586. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
  587. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
  588. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  589. package/codex-lens/src/codexlens/search/binary_searcher.py +277 -0
  590. package/codex-lens/src/codexlens/search/chain_search.py +1642 -8
  591. package/codex-lens/src/codexlens/search/enrichment.py +21 -0
  592. package/codex-lens/src/codexlens/search/graph_expander.py +264 -0
  593. package/codex-lens/src/codexlens/search/hybrid_search.py +772 -37
  594. package/codex-lens/src/codexlens/search/ranking.py +347 -8
  595. package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +225 -0
  596. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
  597. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
  598. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
  599. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
  600. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  601. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
  602. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
  603. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
  604. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
  605. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
  606. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
  607. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
  608. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
  609. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
  610. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
  611. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
  612. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  613. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  614. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  615. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  616. package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
  617. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
  618. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
  619. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
  620. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
  621. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.pyc +0 -0
  622. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  623. package/codex-lens/src/codexlens/semantic/ann_index.py +654 -0
  624. package/codex-lens/src/codexlens/semantic/factory.py +63 -3
  625. package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
  626. package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
  627. package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
  628. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
  629. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
  630. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
  631. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
  632. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
  633. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
  634. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
  635. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
  636. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
  637. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
  638. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
  639. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
  640. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
  641. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
  642. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
  643. package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
  644. package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
  645. package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
  646. package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
  647. package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
  648. package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
  649. package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
  650. package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
  651. package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
  652. package/codex-lens/src/codexlens/storage/__init__.py +3 -0
  653. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
  654. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
  655. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  656. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
  657. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
  658. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  659. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
  660. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
  661. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
  662. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
  663. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  664. package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
  665. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
  666. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
  667. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
  668. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
  669. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
  670. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
  671. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
  672. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
  673. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.pyc +0 -0
  674. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  675. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-310.pyc +0 -0
  676. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
  677. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
  678. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
  679. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
  680. package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
  681. package/codex-lens/src/codexlens/storage/index_tree.py +194 -23
  682. package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
  683. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
  684. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
  685. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
  686. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
  687. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
  688. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
  689. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
  690. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
  691. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
  692. package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
  693. package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
  694. package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
  695. package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
  696. package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
  697. package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
  698. package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
  699. package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
  700. package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
  701. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
  702. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
  703. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
  704. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
  705. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
  706. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
  707. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
  708. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
  709. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
  710. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
  711. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
  712. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
  713. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
  714. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
  715. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
  716. package/codex-lens/src/codexlens/watcher/events.py +82 -0
  717. package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
  718. package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
  719. package/codex-lens/src/codexlens/watcher/manager.py +255 -0
  720. package/package.json +4 -1
  721. package/.claude/commands/workflow/docs/analyze.md +0 -1467
  722. package/.claude/commands/workflow/docs/copyright.md +0 -1265
  723. package/.claude/skills/command-guide/SKILL.md +0 -388
  724. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
  725. package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
  726. package/.claude/skills/command-guide/guides/examples.md +0 -537
  727. package/.claude/skills/command-guide/guides/getting-started.md +0 -242
  728. package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
  729. package/.claude/skills/command-guide/guides/index-structure.md +0 -326
  730. package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
  731. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
  732. package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
  733. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
  734. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
  735. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
  736. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
  737. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
  738. package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
  739. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
  740. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
  741. package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
  742. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
  743. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
  744. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
  745. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
  746. package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
  747. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
  748. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
  749. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
  750. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
  751. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
  752. package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
  753. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
  754. package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
  755. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
  756. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
  757. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
  758. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
  759. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
  760. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
  761. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
  762. package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
  763. package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
  764. package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
  765. package/.claude/skills/command-guide/reference/commands/version.md +0 -254
  766. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
  767. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
  768. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
  769. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
  770. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
  771. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
  772. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
  773. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
  774. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  775. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
  776. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
  777. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
  778. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
  779. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
  780. package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
  781. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
  782. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
  783. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
  784. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
  785. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
  786. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
  787. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
  788. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
  789. package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
  790. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
  791. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
  792. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
  793. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
  794. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
  795. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
  796. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
  797. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
  798. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
  799. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
  800. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
  801. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
  802. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
  803. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  804. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
  805. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
  806. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
  807. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
  808. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
  809. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
  810. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
  811. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
  812. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
  813. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
  814. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
  815. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
  816. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
  817. package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
  818. package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
  819. package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
  820. package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
  821. package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
  822. package/.claude/skills/command-guide/templates/issue-question.md +0 -141
@@ -1,744 +1,797 @@
1
- // @ts-nocheck
2
- import { readFileSync, existsSync } from 'fs';
3
- import { join, dirname } from 'path';
4
- import { fileURLToPath } from 'url';
5
-
6
- const __filename = fileURLToPath(import.meta.url);
7
- const __dirname = dirname(__filename);
8
-
9
- // Bundled template paths (from dist/core/ -> src/templates/)
10
- const UNIFIED_TEMPLATE = join(__dirname, '../../src/templates/dashboard.html');
11
- const JS_FILE = join(__dirname, '../../src/templates/dashboard.js');
12
- const MODULE_CSS_DIR = join(__dirname, '../../src/templates/dashboard-css');
13
- const WORKFLOW_TEMPLATE = join(__dirname, '../../src/templates/workflow-dashboard.html');
14
- const REVIEW_TEMPLATE = join(__dirname, '../../src/templates/review-cycle-dashboard.html');
15
-
16
- // Modular CSS files in load order
17
- const MODULE_CSS_FILES = [
18
- '01-base.css',
19
- '02-session.css',
20
- '03-tasks.css',
21
- '04-lite-tasks.css',
22
- '05-context.css',
23
- '06-cards.css',
24
- '07-managers.css',
25
- '08-review.css',
26
- '09-explorer.css',
27
- // CLI modules (split from 10-cli.css)
28
- '10-cli-status.css',
29
- '11-cli-history.css',
30
- '12-cli-legacy.css',
31
- '13-cli-ccw.css',
32
- '14-cli-modals.css',
33
- '15-cli-endpoints.css',
34
- '16-cli-session.css',
35
- '17-cli-conversation.css',
36
- '18-cli-settings.css',
37
- '19-cli-native-session.css',
38
- '20-cli-taskqueue.css',
39
- '21-cli-toolmgmt.css',
40
- '22-cli-semantic.css',
41
- // Other modules
42
- '23-memory.css',
43
- '24-prompt-history.css',
44
- '25-skills-rules.css',
45
- '26-claude-manager.css',
46
- '27-graph-explorer.css',
47
- '28-mcp-manager.css',
48
- '29-help.css',
49
- '30-core-memory.css',
50
- '31-api-settings.css',
51
- '34-discovery.css'
52
- ];
53
-
54
- const MODULE_FILES = [
55
- 'i18n.js', // Must be loaded first for translations
56
- 'utils.js',
57
- 'state.js',
58
- 'api.js',
59
- 'components/theme.js',
60
- 'components/modals.js',
61
- 'components/navigation.js',
62
- 'components/sidebar.js',
63
- 'components/tabs-context.js',
64
- 'components/tabs-other.js',
65
- 'components/task-drawer-core.js',
66
- 'components/task-drawer-renderers.js',
67
- 'components/flowchart.js',
68
- 'components/carousel.js',
69
- 'components/notifications.js',
70
- 'components/global-notifications.js',
71
- 'components/task-queue-sidebar.js',
72
- 'components/cli-status.js',
73
- 'components/cli-history.js',
74
- 'components/mcp-manager.js',
75
- 'components/hook-manager.js',
76
- 'components/version-check.js',
77
- 'components/storage-manager.js',
78
- 'components/index-manager.js',
79
- 'views/home.js',
80
- 'views/project-overview.js',
81
- 'views/session-detail.js',
82
- 'views/review-session.js',
83
- 'views/lite-tasks.js',
84
- 'views/fix-session.js',
85
- 'views/cli-manager.js',
86
- 'views/codexlens-manager.js',
87
- 'views/explorer.js',
88
- 'views/mcp-manager.js',
89
- 'views/hook-manager.js',
90
- 'views/history.js',
91
- 'views/graph-explorer.js',
92
- 'views/memory.js',
93
- 'views/core-memory.js',
94
- 'views/core-memory-graph.js',
95
- 'views/core-memory-clusters.js',
96
- 'views/prompt-history.js',
97
- 'views/skills-manager.js',
98
- 'views/rules-manager.js',
99
- 'views/claude-manager.js',
100
- 'views/api-settings.js',
101
- 'views/issue-manager.js',
102
- 'views/issue-discovery.js',
103
- 'views/help.js',
104
- 'main.js'
105
- ];
106
-
107
- /**
108
- * Generate dashboard HTML from aggregated data
109
- * Uses bundled templates from ccw package
110
- * @param {Object} data - Aggregated dashboard data
111
- * @returns {Promise<string>} - Generated HTML
112
- */
113
- export async function generateDashboard(data: unknown): Promise<string> {
114
- // Use new unified template (with sidebar layout)
115
- if (existsSync(UNIFIED_TEMPLATE)) {
116
- return generateFromUnifiedTemplate(data);
117
- }
118
-
119
- // Fallback to legacy workflow template
120
- if (existsSync(WORKFLOW_TEMPLATE)) {
121
- return generateFromBundledTemplate(data, WORKFLOW_TEMPLATE);
122
- }
123
-
124
- // Fallback to inline dashboard if templates missing
125
- return generateInlineDashboard(data);
126
- }
127
-
128
- /**
129
- * Generate dashboard using unified template (new sidebar layout)
130
- * @param {Object} data - Dashboard data
131
- * @returns {string} - Generated HTML
132
- */
133
- function generateFromUnifiedTemplate(data: unknown): string {
134
- let html = readFileSync(UNIFIED_TEMPLATE, 'utf8');
135
-
136
- // Read and concatenate modular CSS files in load order
137
- let cssContent = MODULE_CSS_FILES.map(file => {
138
- const filePath = join(MODULE_CSS_DIR, file);
139
- return existsSync(filePath) ? readFileSync(filePath, 'utf8') : '';
140
- }).join('\n\n');
141
-
142
- // Read JS content
143
- let jsContent = '';
144
- const moduleBase = join(__dirname, '../../src/templates/dashboard-js');
145
-
146
- if (existsSync(moduleBase)) {
147
- jsContent = MODULE_FILES.map(file => {
148
- const filePath = join(moduleBase, file);
149
- return existsSync(filePath) ? readFileSync(filePath, 'utf8') : '';
150
- }).join('\n\n');
151
- } else if (existsSync(JS_FILE)) {
152
- jsContent = readFileSync(JS_FILE, 'utf8');
153
- }
154
-
155
- // Prepare complete workflow data
156
- const workflowData = {
157
- generatedAt: data.generatedAt || new Date().toISOString(),
158
- activeSessions: data.activeSessions || [],
159
- archivedSessions: data.archivedSessions || [],
160
- liteTasks: data.liteTasks || { litePlan: [], liteFix: [] },
161
- reviewData: data.reviewData || { dimensions: {} },
162
- statistics: data.statistics || {
163
- totalSessions: 0,
164
- activeSessions: 0,
165
- totalTasks: 0,
166
- completedTasks: 0,
167
- litePlanCount: 0,
168
- liteFixCount: 0
169
- }
170
- };
171
-
172
- // Get project path and recent paths
173
- const projectPath = data.projectPath || process.cwd();
174
- const recentPaths = data.recentPaths || [projectPath];
175
-
176
- // Replace JS placeholders with actual data
177
- jsContent = jsContent.replace('{{WORKFLOW_DATA}}', JSON.stringify(workflowData, null, 2));
178
- jsContent = jsContent.replace(/\{\{PROJECT_PATH\}\}/g, projectPath.replace(/\\/g, '/'));
179
- jsContent = jsContent.replace('{{RECENT_PATHS}}', JSON.stringify(recentPaths));
180
-
181
- // Inject platform information for cross-platform MCP command generation
182
- // 'win32' for Windows, 'darwin' for macOS, 'linux' for Linux
183
- jsContent = jsContent.replace(/\{\{SERVER_PLATFORM\}\}/g, process.platform);
184
-
185
- // Inject JS and CSS into HTML template
186
- html = html.replace('{{JS_CONTENT}}', jsContent);
187
- html = html.replace('{{CSS_CONTENT}}', cssContent);
188
-
189
- // Also replace any remaining placeholders in HTML
190
- html = html.replace(/\{\{PROJECT_PATH\}\}/g, projectPath.replace(/\\/g, '/'));
191
-
192
- return html;
193
- }
194
-
195
- /**
196
- * Generate dashboard using bundled template
197
- * @param {Object} data - Dashboard data
198
- * @param {string} templatePath - Path to workflow-dashboard.html
199
- * @returns {string} - Generated HTML
200
- */
201
- function generateFromBundledTemplate(data: unknown, templatePath: string): string {
202
- let html = readFileSync(templatePath, 'utf8');
203
-
204
- // Prepare workflow data for injection
205
- const workflowData = {
206
- activeSessions: data.activeSessions,
207
- archivedSessions: data.archivedSessions
208
- };
209
-
210
- // Inject workflow data
211
- html = html.replace('{{WORKFLOW_DATA}}', JSON.stringify(workflowData, null, 2));
212
-
213
- // If we have review data, add a review tab
214
- if (data.reviewData && data.reviewData.totalFindings > 0) {
215
- html = injectReviewTab(html, data.reviewData);
216
- }
217
-
218
- return html;
219
- }
220
-
221
- /**
222
- * Inject review tab into existing dashboard
223
- * @param {string} html - Base dashboard HTML
224
- * @param {Object} reviewData - Review data to display
225
- * @returns {string} - Modified HTML with review tab
226
- */
227
- function injectReviewTab(html, reviewData) {
228
- // Add review tab button in header controls
229
- const tabButtonHtml = `
230
- <button class="btn" data-tab="reviews" id="reviewTabBtn">Reviews (${reviewData.totalFindings})</button>
231
- `;
232
-
233
- // Insert after filter-group
234
- html = html.replace(
235
- '</div>\n </div>\n </header>',
236
- `</div>
237
- <div class="filter-group" style="margin-left: auto;">
238
- ${tabButtonHtml}
239
- </div>
240
- </div>
241
- </header>`
242
- );
243
-
244
- // Add review section before closing container
245
- const reviewSectionHtml = generateReviewSection(reviewData);
246
-
247
- html = html.replace(
248
- '</div>\n\n <button class="theme-toggle"',
249
- `</div>
250
-
251
- ${reviewSectionHtml}
252
- </div>
253
-
254
- <button class="theme-toggle"`
255
- );
256
-
257
- // Add review tab JavaScript
258
- const reviewScript = generateReviewScript(reviewData);
259
- html = html.replace('</script>', `\n${reviewScript}\n</script>`);
260
-
261
- return html;
262
- }
263
-
264
- /**
265
- * Generate review section HTML
266
- * @param {Object} reviewData - Review data
267
- * @returns {string} - HTML for review section
268
- */
269
- function generateReviewSection(reviewData) {
270
- const severityBars = Object.entries(reviewData.severityDistribution)
271
- .map(([severity, count]) => {
272
- const colors = {
273
- critical: '#c53030',
274
- high: '#f56565',
275
- medium: '#ed8936',
276
- low: '#48bb78'
277
- };
278
- const percent = reviewData.totalFindings > 0
279
- ? Math.round((count / reviewData.totalFindings) * 100)
280
- : 0;
281
- return `
282
- <div class="severity-bar-item">
283
- <span class="severity-label">${severity}</span>
284
- <div class="severity-bar">
285
- <div class="severity-fill" style="width: ${percent}%; background-color: ${colors[severity]}"></div>
286
- </div>
287
- <span class="severity-count">${count}</span>
288
- </div>
289
- `;
290
- }).join('');
291
-
292
- const dimensionCards = Object.entries(reviewData.dimensionSummary)
293
- .map(([name, info]) => `
294
- <div class="dimension-card">
295
- <div class="dimension-name">${name}</div>
296
- <div class="dimension-count">${info.count} findings</div>
297
- </div>
298
- `).join('');
299
-
300
- return `
301
- <div class="section" id="reviewSectionContainer" style="display: none;">
302
- <div class="section-header">
303
- <h2 class="section-title">Code Review Findings</h2>
304
- </div>
305
-
306
- <div class="review-stats">
307
- <div class="stat-card">
308
- <div class="stat-value" style="color: #c53030;">${reviewData.severityDistribution.critical}</div>
309
- <div class="stat-label">Critical</div>
310
- </div>
311
- <div class="stat-card">
312
- <div class="stat-value" style="color: #f56565;">${reviewData.severityDistribution.high}</div>
313
- <div class="stat-label">High</div>
314
- </div>
315
- <div class="stat-card">
316
- <div class="stat-value" style="color: #ed8936;">${reviewData.severityDistribution.medium}</div>
317
- <div class="stat-label">Medium</div>
318
- </div>
319
- <div class="stat-card">
320
- <div class="stat-value" style="color: #48bb78;">${reviewData.severityDistribution.low}</div>
321
- <div class="stat-label">Low</div>
322
- </div>
323
- </div>
324
-
325
- <div class="severity-distribution">
326
- <h3 style="margin-bottom: 15px; color: var(--text-secondary);">Severity Distribution</h3>
327
- ${severityBars}
328
- </div>
329
-
330
- <div class="dimensions-grid" style="margin-top: 30px;">
331
- <h3 style="margin-bottom: 15px; color: var(--text-secondary);">By Dimension</h3>
332
- <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 15px;">
333
- ${dimensionCards}
334
- </div>
335
- </div>
336
-
337
- <style>
338
- .review-stats {
339
- display: grid;
340
- grid-template-columns: repeat(4, 1fr);
341
- gap: 20px;
342
- margin-bottom: 30px;
343
- }
344
- .severity-distribution {
345
- background: var(--bg-card);
346
- padding: 20px;
347
- border-radius: 8px;
348
- box-shadow: var(--shadow);
349
- }
350
- .severity-bar-item {
351
- display: flex;
352
- align-items: center;
353
- gap: 10px;
354
- margin-bottom: 10px;
355
- }
356
- .severity-label {
357
- width: 80px;
358
- text-transform: capitalize;
359
- font-size: 0.9rem;
360
- }
361
- .severity-bar {
362
- flex: 1;
363
- height: 20px;
364
- background: var(--bg-primary);
365
- border-radius: 4px;
366
- overflow: hidden;
367
- }
368
- .severity-fill {
369
- height: 100%;
370
- transition: width 0.3s;
371
- }
372
- .severity-count {
373
- width: 40px;
374
- text-align: right;
375
- font-weight: bold;
376
- }
377
- .dimension-card {
378
- background: var(--bg-card);
379
- padding: 15px;
380
- border-radius: 8px;
381
- box-shadow: var(--shadow);
382
- }
383
- .dimension-name {
384
- font-weight: 600;
385
- text-transform: capitalize;
386
- margin-bottom: 5px;
387
- }
388
- .dimension-count {
389
- color: var(--text-secondary);
390
- font-size: 0.9rem;
391
- }
392
- @media (max-width: 768px) {
393
- .review-stats {
394
- grid-template-columns: repeat(2, 1fr);
395
- }
396
- }
397
- </style>
398
- </div>
399
- `;
400
- }
401
-
402
- /**
403
- * Generate JavaScript for review tab functionality
404
- * @param {Object} reviewData - Review data
405
- * @returns {string} - JavaScript code
406
- */
407
- function generateReviewScript(reviewData) {
408
- return `
409
- // Review tab functionality
410
- const reviewTabBtn = document.getElementById('reviewTabBtn');
411
- const reviewSection = document.getElementById('reviewSectionContainer');
412
- const activeSectionContainer = document.getElementById('activeSectionContainer');
413
- const archivedSectionContainer = document.getElementById('archivedSectionContainer');
414
-
415
- if (reviewTabBtn) {
416
- reviewTabBtn.addEventListener('click', () => {
417
- const isActive = reviewTabBtn.classList.contains('active');
418
-
419
- // Toggle review section
420
- if (isActive) {
421
- // Hide reviews, show workflow
422
- reviewTabBtn.classList.remove('active');
423
- reviewSection.style.display = 'none';
424
- activeSectionContainer.style.display = 'block';
425
- archivedSectionContainer.style.display = 'block';
426
- } else {
427
- // Show reviews, hide workflow
428
- reviewTabBtn.classList.add('active');
429
- reviewSection.style.display = 'block';
430
- activeSectionContainer.style.display = 'none';
431
- archivedSectionContainer.style.display = 'none';
432
-
433
- // Reset filter buttons
434
- document.querySelectorAll('[data-filter]').forEach(b => b.classList.remove('active'));
435
- document.querySelector('[data-filter="all"]').classList.add('active');
436
- }
437
- });
438
- }
439
- `;
440
- }
441
-
442
- /**
443
- * Generate inline dashboard HTML (fallback if bundled templates missing)
444
- * @param {Object} data - Dashboard data
445
- * @returns {string}
446
- */
447
- function generateInlineDashboard(data: unknown): string {
448
- const stats = data.statistics;
449
- const hasReviews = data.reviewData && data.reviewData.totalFindings > 0;
450
-
451
- return `<!DOCTYPE html>
452
- <html lang="en">
453
- <head>
454
- <meta charset="UTF-8">
455
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
456
- <title>CCW Dashboard</title>
457
- <style>
458
- :root {
459
- --bg-primary: #f5f7fa;
460
- --bg-secondary: #ffffff;
461
- --bg-card: #ffffff;
462
- --text-primary: #1a202c;
463
- --text-secondary: #718096;
464
- --border-color: #e2e8f0;
465
- --accent-color: #4299e1;
466
- --success-color: #48bb78;
467
- --warning-color: #ed8936;
468
- --danger-color: #f56565;
469
- --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
470
- }
471
- [data-theme="dark"] {
472
- --bg-primary: #1a202c;
473
- --bg-secondary: #2d3748;
474
- --bg-card: #2d3748;
475
- --text-primary: #f7fafc;
476
- --text-secondary: #a0aec0;
477
- --border-color: #4a5568;
478
- }
479
- * { margin: 0; padding: 0; box-sizing: border-box; }
480
- body {
481
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
482
- background: var(--bg-primary);
483
- color: var(--text-primary);
484
- line-height: 1.6;
485
- }
486
- .container { max-width: 1400px; margin: 0 auto; padding: 20px; }
487
- header {
488
- background: var(--bg-secondary);
489
- padding: 20px;
490
- border-radius: 8px;
491
- box-shadow: var(--shadow);
492
- margin-bottom: 30px;
493
- }
494
- h1 { font-size: 2rem; color: var(--accent-color); margin-bottom: 10px; }
495
- .stats-grid {
496
- display: grid;
497
- grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
498
- gap: 20px;
499
- margin-bottom: 30px;
500
- }
501
- .stat-card {
502
- background: var(--bg-card);
503
- padding: 20px;
504
- border-radius: 8px;
505
- box-shadow: var(--shadow);
506
- }
507
- .stat-value { font-size: 2rem; font-weight: bold; color: var(--accent-color); }
508
- .stat-label { color: var(--text-secondary); font-size: 0.9rem; }
509
- .section { margin-bottom: 40px; }
510
- .section-title { font-size: 1.5rem; margin-bottom: 20px; }
511
- .sessions-grid {
512
- display: grid;
513
- grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
514
- gap: 20px;
515
- }
516
- .session-card {
517
- background: var(--bg-card);
518
- padding: 20px;
519
- border-radius: 8px;
520
- box-shadow: var(--shadow);
521
- }
522
- .session-title { font-size: 1.2rem; font-weight: 600; margin-bottom: 10px; }
523
- .session-meta { color: var(--text-secondary); font-size: 0.9rem; }
524
- .progress-bar {
525
- width: 100%;
526
- height: 8px;
527
- background: var(--bg-primary);
528
- border-radius: 4px;
529
- margin: 15px 0;
530
- overflow: hidden;
531
- }
532
- .progress-fill {
533
- height: 100%;
534
- background: linear-gradient(90deg, var(--accent-color), var(--success-color));
535
- }
536
- .task-item {
537
- display: flex;
538
- align-items: center;
539
- padding: 10px;
540
- margin-bottom: 8px;
541
- background: var(--bg-primary);
542
- border-radius: 6px;
543
- border-left: 3px solid var(--border-color);
544
- }
545
- .task-item.completed { border-left-color: var(--success-color); opacity: 0.8; }
546
- .task-item.in_progress { border-left-color: var(--warning-color); }
547
- .task-title { flex: 1; font-size: 0.9rem; }
548
- .task-id { font-size: 0.75rem; color: var(--text-secondary); font-family: monospace; }
549
- .empty-state { text-align: center; padding: 60px 20px; color: var(--text-secondary); }
550
- .tabs { display: flex; gap: 10px; margin-top: 15px; }
551
- .tab-btn {
552
- padding: 10px 20px;
553
- border: 1px solid var(--border-color);
554
- border-radius: 6px;
555
- background: var(--bg-card);
556
- color: var(--text-primary);
557
- cursor: pointer;
558
- }
559
- .tab-btn.active { background: var(--accent-color); color: white; border-color: var(--accent-color); }
560
- .theme-toggle {
561
- position: fixed;
562
- bottom: 30px;
563
- right: 30px;
564
- width: 50px;
565
- height: 50px;
566
- border-radius: 50%;
567
- background: var(--accent-color);
568
- color: white;
569
- border: none;
570
- cursor: pointer;
571
- font-size: 1.5rem;
572
- box-shadow: var(--shadow);
573
- }
574
- </style>
575
- </head>
576
- <body>
577
- <div class="container">
578
- <header>
579
- <h1>CCW Dashboard</h1>
580
- <p style="color: var(--text-secondary);">Workflow Sessions and Reviews</p>
581
- <div class="tabs">
582
- <button class="tab-btn active" data-tab="workflow">Workflow</button>
583
- ${hasReviews ? '<button class="tab-btn" data-tab="reviews">Reviews</button>' : ''}
584
- </div>
585
- </header>
586
-
587
- <div id="workflowTab">
588
- <div class="stats-grid">
589
- <div class="stat-card">
590
- <div class="stat-value">${stats.totalSessions}</div>
591
- <div class="stat-label">Total Sessions</div>
592
- </div>
593
- <div class="stat-card">
594
- <div class="stat-value">${stats.activeSessions}</div>
595
- <div class="stat-label">Active Sessions</div>
596
- </div>
597
- <div class="stat-card">
598
- <div class="stat-value">${stats.totalTasks}</div>
599
- <div class="stat-label">Total Tasks</div>
600
- </div>
601
- <div class="stat-card">
602
- <div class="stat-value">${stats.completedTasks}</div>
603
- <div class="stat-label">Completed Tasks</div>
604
- </div>
605
- </div>
606
-
607
- <div class="section">
608
- <h2 class="section-title">Active Sessions</h2>
609
- <div class="sessions-grid" id="activeSessions">
610
- ${data.activeSessions.length === 0
611
- ? '<div class="empty-state">No active sessions</div>'
612
- : data.activeSessions.map(s => renderSessionCard(s, true)).join('')}
613
- </div>
614
- </div>
615
-
616
- <div class="section">
617
- <h2 class="section-title">Archived Sessions</h2>
618
- <div class="sessions-grid" id="archivedSessions">
619
- ${data.archivedSessions.length === 0
620
- ? '<div class="empty-state">No archived sessions</div>'
621
- : data.archivedSessions.map(s => renderSessionCard(s, false)).join('')}
622
- </div>
623
- </div>
624
- </div>
625
-
626
- ${hasReviews ? renderReviewTab(data.reviewData) : ''}
627
- </div>
628
-
629
- <button class="theme-toggle" onclick="toggleTheme()">🌙</button>
630
-
631
- <script>
632
- function toggleTheme() {
633
- const html = document.documentElement;
634
- const current = html.getAttribute('data-theme');
635
- const next = current === 'dark' ? 'light' : 'dark';
636
- html.setAttribute('data-theme', next);
637
- localStorage.setItem('theme', next);
638
- document.querySelector('.theme-toggle').textContent = next === 'dark' ? '☀️' : '🌙';
639
- }
640
-
641
- // Initialize theme
642
- const savedTheme = localStorage.getItem('theme') || 'light';
643
- document.documentElement.setAttribute('data-theme', savedTheme);
644
- document.querySelector('.theme-toggle').textContent = savedTheme === 'dark' ? '☀️' : '🌙';
645
-
646
- // Tab switching
647
- document.querySelectorAll('.tab-btn').forEach(btn => {
648
- btn.addEventListener('click', () => {
649
- document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
650
- btn.classList.add('active');
651
-
652
- const tab = btn.dataset.tab;
653
- document.getElementById('workflowTab').style.display = tab === 'workflow' ? 'block' : 'none';
654
- const reviewTab = document.getElementById('reviewsTab');
655
- if (reviewTab) reviewTab.style.display = tab === 'reviews' ? 'block' : 'none';
656
- });
657
- });
658
- </script>
659
- </body>
660
- </html>`;
661
- }
662
-
663
- /**
664
- * Render a session card
665
- * @param {Object} session - Session data
666
- * @param {boolean} isActive - Whether session is active
667
- * @returns {string} - HTML string
668
- */
669
- function renderSessionCard(session, isActive) {
670
- const completedTasks = isActive
671
- ? session.tasks.filter(t => t.status === 'completed').length
672
- : session.taskCount;
673
- const totalTasks = isActive ? session.tasks.length : session.taskCount;
674
- const progress = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;
675
-
676
- const tasksHtml = isActive && session.tasks.length > 0
677
- ? session.tasks.map(t => `
678
- <div class="task-item ${t.status}">
679
- <div class="task-title">${t.title}</div>
680
- <span class="task-id">${t.task_id}</span>
681
- </div>
682
- `).join('')
683
- : '';
684
-
685
- return `
686
- <div class="session-card">
687
- <div class="session-title">${session.session_id}</div>
688
- <div class="session-meta">
689
- ${session.project ? `<div>${session.project}</div>` : ''}
690
- <div>${session.created_at} | ${completedTasks}/${totalTasks} tasks</div>
691
- </div>
692
- ${totalTasks > 0 ? `
693
- <div class="progress-bar">
694
- <div class="progress-fill" style="width: ${progress}%"></div>
695
- </div>
696
- ` : ''}
697
- ${tasksHtml}
698
- </div>
699
- `;
700
- }
701
-
702
- /**
703
- * Render review tab HTML
704
- * @param {Object} reviewData - Review data
705
- * @returns {string} - HTML string
706
- */
707
- function renderReviewTab(reviewData) {
708
- const { severityDistribution, dimensionSummary } = reviewData;
709
-
710
- return `
711
- <div id="reviewsTab" style="display: none;">
712
- <div class="stats-grid">
713
- <div class="stat-card">
714
- <div class="stat-value" style="color: #c53030;">${severityDistribution.critical}</div>
715
- <div class="stat-label">Critical</div>
716
- </div>
717
- <div class="stat-card">
718
- <div class="stat-value" style="color: #f56565;">${severityDistribution.high}</div>
719
- <div class="stat-label">High</div>
720
- </div>
721
- <div class="stat-card">
722
- <div class="stat-value" style="color: #ed8936;">${severityDistribution.medium}</div>
723
- <div class="stat-label">Medium</div>
724
- </div>
725
- <div class="stat-card">
726
- <div class="stat-value" style="color: #48bb78;">${severityDistribution.low}</div>
727
- <div class="stat-label">Low</div>
728
- </div>
729
- </div>
730
-
731
- <div class="section">
732
- <h2 class="section-title">Findings by Dimension</h2>
733
- <div class="sessions-grid">
734
- ${Object.entries(dimensionSummary).map(([name, info]) => `
735
- <div class="session-card">
736
- <div class="session-title" style="text-transform: capitalize;">${name}</div>
737
- <div class="session-meta">${info.count} findings</div>
738
- </div>
739
- `).join('')}
740
- </div>
741
- </div>
742
- </div>
743
- `;
744
- }
1
+ import { readFileSync, existsSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ interface ReviewDimensionInfo {
6
+ count: number;
7
+ [key: string]: unknown;
8
+ }
9
+
10
+ interface ReviewData {
11
+ totalFindings: number;
12
+ severityDistribution: Record<string, number>;
13
+ dimensionSummary: Record<string, ReviewDimensionInfo>;
14
+ [key: string]: unknown;
15
+ }
16
+
17
+ interface SessionTaskData {
18
+ status?: string;
19
+ title?: string;
20
+ task_id?: string;
21
+ [key: string]: unknown;
22
+ }
23
+
24
+ interface SessionData {
25
+ session_id?: string;
26
+ project?: string;
27
+ created_at?: string;
28
+ tasks: SessionTaskData[];
29
+ taskCount: number;
30
+ [key: string]: unknown;
31
+ }
32
+
33
+ interface DashboardStatistics {
34
+ totalSessions: number;
35
+ activeSessions: number;
36
+ totalTasks: number;
37
+ completedTasks: number;
38
+ [key: string]: unknown;
39
+ }
40
+
41
+ interface DashboardData {
42
+ generatedAt?: string;
43
+ activeSessions: SessionData[];
44
+ archivedSessions: SessionData[];
45
+ statistics: DashboardStatistics;
46
+ reviewData?: ReviewData;
47
+ liteTasks?: {
48
+ litePlan?: unknown[];
49
+ liteFix?: unknown[];
50
+ [key: string]: unknown;
51
+ };
52
+ projectPath?: string;
53
+ recentPaths?: string[];
54
+ [key: string]: unknown;
55
+ }
56
+
57
+ const __filename = fileURLToPath(import.meta.url);
58
+ const __dirname = dirname(__filename);
59
+
60
+ // Bundled template paths (from dist/core/ -> src/templates/)
61
+ const UNIFIED_TEMPLATE = join(__dirname, '../../src/templates/dashboard.html');
62
+ const JS_FILE = join(__dirname, '../../src/templates/dashboard.js');
63
+ const MODULE_CSS_DIR = join(__dirname, '../../src/templates/dashboard-css');
64
+ const WORKFLOW_TEMPLATE = join(__dirname, '../../src/templates/workflow-dashboard.html');
65
+ const REVIEW_TEMPLATE = join(__dirname, '../../src/templates/review-cycle-dashboard.html');
66
+
67
+ // Modular CSS files in load order
68
+ const MODULE_CSS_FILES = [
69
+ '01-base.css',
70
+ '02-session.css',
71
+ '03-tasks.css',
72
+ '04-lite-tasks.css',
73
+ '05-context.css',
74
+ '06-cards.css',
75
+ '07-managers.css',
76
+ '08-review.css',
77
+ '09-explorer.css',
78
+ // CLI modules (split from 10-cli.css)
79
+ '10-cli-status.css',
80
+ '11-cli-history.css',
81
+ '12-cli-legacy.css',
82
+ '13-cli-ccw.css',
83
+ '14-cli-modals.css',
84
+ '15-cli-endpoints.css',
85
+ '16-cli-session.css',
86
+ '17-cli-conversation.css',
87
+ '18-cli-settings.css',
88
+ '19-cli-native-session.css',
89
+ '20-cli-taskqueue.css',
90
+ '21-cli-toolmgmt.css',
91
+ '22-cli-semantic.css',
92
+ // Other modules
93
+ '23-memory.css',
94
+ '24-prompt-history.css',
95
+ '25-skills-rules.css',
96
+ '26-claude-manager.css',
97
+ '27-graph-explorer.css',
98
+ '28-mcp-manager.css',
99
+ '29-help.css',
100
+ '30-core-memory.css',
101
+ '31-api-settings.css',
102
+ '34-discovery.css'
103
+ ];
104
+
105
+ const MODULE_FILES = [
106
+ 'i18n.js', // Must be loaded first for translations
107
+ 'utils.js',
108
+ 'state.js',
109
+ 'services.js', // CacheManager, EventManager, PreloadService - must be before main.js
110
+ 'api.js',
111
+ 'components/theme.js',
112
+ 'components/modals.js',
113
+ 'components/navigation.js',
114
+ 'components/sidebar.js',
115
+ 'components/tabs-context.js',
116
+ 'components/tabs-other.js',
117
+ 'components/task-drawer-core.js',
118
+ 'components/task-drawer-renderers.js',
119
+ 'components/flowchart.js',
120
+ 'components/carousel.js',
121
+ 'components/notifications.js',
122
+ 'components/global-notifications.js',
123
+ 'components/task-queue-sidebar.js',
124
+ 'components/cli-status.js',
125
+ 'components/cli-history.js',
126
+ 'components/mcp-manager.js',
127
+ 'components/hook-manager.js',
128
+ 'components/version-check.js',
129
+ 'components/storage-manager.js',
130
+ 'components/index-manager.js',
131
+ 'views/home.js',
132
+ 'views/project-overview.js',
133
+ 'views/session-detail.js',
134
+ 'views/review-session.js',
135
+ 'views/lite-tasks.js',
136
+ 'views/fix-session.js',
137
+ 'views/cli-manager.js',
138
+ 'views/codexlens-manager.js',
139
+ 'views/explorer.js',
140
+ 'views/mcp-manager.js',
141
+ 'views/hook-manager.js',
142
+ 'views/history.js',
143
+ 'views/graph-explorer.js',
144
+ 'views/memory.js',
145
+ 'views/core-memory.js',
146
+ 'views/core-memory-graph.js',
147
+ 'views/core-memory-clusters.js',
148
+ 'views/prompt-history.js',
149
+ 'views/skills-manager.js',
150
+ 'views/rules-manager.js',
151
+ 'views/claude-manager.js',
152
+ 'views/api-settings.js',
153
+ 'views/issue-manager.js',
154
+ 'views/issue-discovery.js',
155
+ 'views/help.js',
156
+ 'main.js'
157
+ ];
158
+
159
+ /**
160
+ * Generate dashboard HTML from aggregated data
161
+ * Uses bundled templates from ccw package
162
+ * @param {Object} data - Aggregated dashboard data
163
+ * @returns {Promise<string>} - Generated HTML
164
+ */
165
+ export async function generateDashboard(data: unknown): Promise<string> {
166
+ const dashboardData = (data ?? {}) as DashboardData;
167
+ // Use new unified template (with sidebar layout)
168
+ if (existsSync(UNIFIED_TEMPLATE)) {
169
+ return generateFromUnifiedTemplate(dashboardData);
170
+ }
171
+
172
+ // Fallback to legacy workflow template
173
+ if (existsSync(WORKFLOW_TEMPLATE)) {
174
+ return generateFromBundledTemplate(dashboardData, WORKFLOW_TEMPLATE);
175
+ }
176
+
177
+ // Fallback to inline dashboard if templates missing
178
+ return generateInlineDashboard(dashboardData);
179
+ }
180
+
181
+ /**
182
+ * Generate dashboard using unified template (new sidebar layout)
183
+ * @param {Object} data - Dashboard data
184
+ * @returns {string} - Generated HTML
185
+ */
186
+ function generateFromUnifiedTemplate(data: DashboardData): string {
187
+ let html = readFileSync(UNIFIED_TEMPLATE, 'utf8');
188
+
189
+ // Read and concatenate modular CSS files in load order
190
+ let cssContent = MODULE_CSS_FILES.map(file => {
191
+ const filePath = join(MODULE_CSS_DIR, file);
192
+ return existsSync(filePath) ? readFileSync(filePath, 'utf8') : '';
193
+ }).join('\n\n');
194
+
195
+ // Read JS content
196
+ let jsContent = '';
197
+ const moduleBase = join(__dirname, '../../src/templates/dashboard-js');
198
+
199
+ if (existsSync(moduleBase)) {
200
+ jsContent = MODULE_FILES.map(file => {
201
+ const filePath = join(moduleBase, file);
202
+ return existsSync(filePath) ? readFileSync(filePath, 'utf8') : '';
203
+ }).join('\n\n');
204
+ } else if (existsSync(JS_FILE)) {
205
+ jsContent = readFileSync(JS_FILE, 'utf8');
206
+ }
207
+
208
+ // Prepare complete workflow data
209
+ const workflowData = {
210
+ generatedAt: data.generatedAt || new Date().toISOString(),
211
+ activeSessions: data.activeSessions || [],
212
+ archivedSessions: data.archivedSessions || [],
213
+ liteTasks: data.liteTasks || { litePlan: [], liteFix: [] },
214
+ reviewData: data.reviewData || { dimensions: {} },
215
+ statistics: data.statistics || {
216
+ totalSessions: 0,
217
+ activeSessions: 0,
218
+ totalTasks: 0,
219
+ completedTasks: 0,
220
+ litePlanCount: 0,
221
+ liteFixCount: 0
222
+ }
223
+ };
224
+
225
+ // Get project path and recent paths
226
+ const projectPath = data.projectPath || process.cwd();
227
+ const recentPaths = data.recentPaths || [projectPath];
228
+
229
+ // Replace JS placeholders with actual data
230
+ jsContent = jsContent.replace('{{WORKFLOW_DATA}}', JSON.stringify(workflowData, null, 2));
231
+ jsContent = jsContent.replace(/\{\{PROJECT_PATH\}\}/g, projectPath.replace(/\\/g, '/'));
232
+ jsContent = jsContent.replace('{{RECENT_PATHS}}', JSON.stringify(recentPaths));
233
+
234
+ // Inject platform information for cross-platform MCP command generation
235
+ // 'win32' for Windows, 'darwin' for macOS, 'linux' for Linux
236
+ jsContent = jsContent.replace(/\{\{SERVER_PLATFORM\}\}/g, process.platform);
237
+
238
+ // Inject JS and CSS into HTML template
239
+ html = html.replace('{{JS_CONTENT}}', jsContent);
240
+ html = html.replace('{{CSS_CONTENT}}', cssContent);
241
+
242
+ // Also replace any remaining placeholders in HTML
243
+ html = html.replace(/\{\{PROJECT_PATH\}\}/g, projectPath.replace(/\\/g, '/'));
244
+
245
+ return html;
246
+ }
247
+
248
+ /**
249
+ * Generate dashboard using bundled template
250
+ * @param {Object} data - Dashboard data
251
+ * @param {string} templatePath - Path to workflow-dashboard.html
252
+ * @returns {string} - Generated HTML
253
+ */
254
+ function generateFromBundledTemplate(data: DashboardData, templatePath: string): string {
255
+ let html = readFileSync(templatePath, 'utf8');
256
+
257
+ // Prepare workflow data for injection
258
+ const workflowData = {
259
+ activeSessions: data.activeSessions,
260
+ archivedSessions: data.archivedSessions
261
+ };
262
+
263
+ // Inject workflow data
264
+ html = html.replace('{{WORKFLOW_DATA}}', JSON.stringify(workflowData, null, 2));
265
+
266
+ // If we have review data, add a review tab
267
+ if (data.reviewData && data.reviewData.totalFindings > 0) {
268
+ html = injectReviewTab(html, data.reviewData);
269
+ }
270
+
271
+ return html;
272
+ }
273
+
274
+ /**
275
+ * Inject review tab into existing dashboard
276
+ * @param {string} html - Base dashboard HTML
277
+ * @param {Object} reviewData - Review data to display
278
+ * @returns {string} - Modified HTML with review tab
279
+ */
280
+ function injectReviewTab(html: string, reviewData: ReviewData): string {
281
+ // Add review tab button in header controls
282
+ const tabButtonHtml = `
283
+ <button class="btn" data-tab="reviews" id="reviewTabBtn">Reviews (${reviewData.totalFindings})</button>
284
+ `;
285
+
286
+ // Insert after filter-group
287
+ html = html.replace(
288
+ '</div>\n </div>\n </header>',
289
+ `</div>
290
+ <div class="filter-group" style="margin-left: auto;">
291
+ ${tabButtonHtml}
292
+ </div>
293
+ </div>
294
+ </header>`
295
+ );
296
+
297
+ // Add review section before closing container
298
+ const reviewSectionHtml = generateReviewSection(reviewData);
299
+
300
+ html = html.replace(
301
+ '</div>\n\n <button class="theme-toggle"',
302
+ `</div>
303
+
304
+ ${reviewSectionHtml}
305
+ </div>
306
+
307
+ <button class="theme-toggle"`
308
+ );
309
+
310
+ // Add review tab JavaScript
311
+ const reviewScript = generateReviewScript(reviewData);
312
+ html = html.replace('</script>', `\n${reviewScript}\n</script>`);
313
+
314
+ return html;
315
+ }
316
+
317
+ /**
318
+ * Generate review section HTML
319
+ * @param {Object} reviewData - Review data
320
+ * @returns {string} - HTML for review section
321
+ */
322
+ function generateReviewSection(reviewData: ReviewData): string {
323
+ const severityBars = Object.entries(reviewData.severityDistribution)
324
+ .map(([severity, count]) => {
325
+ const colors: Record<string, string> = {
326
+ critical: '#c53030',
327
+ high: '#f56565',
328
+ medium: '#ed8936',
329
+ low: '#48bb78'
330
+ };
331
+ const percent = reviewData.totalFindings > 0
332
+ ? Math.round((count / reviewData.totalFindings) * 100)
333
+ : 0;
334
+ return `
335
+ <div class="severity-bar-item">
336
+ <span class="severity-label">${severity}</span>
337
+ <div class="severity-bar">
338
+ <div class="severity-fill" style="width: ${percent}%; background-color: ${colors[severity]}"></div>
339
+ </div>
340
+ <span class="severity-count">${count}</span>
341
+ </div>
342
+ `;
343
+ }).join('');
344
+
345
+ const dimensionCards = Object.entries(reviewData.dimensionSummary)
346
+ .map(([name, info]) => `
347
+ <div class="dimension-card">
348
+ <div class="dimension-name">${name}</div>
349
+ <div class="dimension-count">${info.count} findings</div>
350
+ </div>
351
+ `).join('');
352
+
353
+ return `
354
+ <div class="section" id="reviewSectionContainer" style="display: none;">
355
+ <div class="section-header">
356
+ <h2 class="section-title">Code Review Findings</h2>
357
+ </div>
358
+
359
+ <div class="review-stats">
360
+ <div class="stat-card">
361
+ <div class="stat-value" style="color: #c53030;">${reviewData.severityDistribution.critical}</div>
362
+ <div class="stat-label">Critical</div>
363
+ </div>
364
+ <div class="stat-card">
365
+ <div class="stat-value" style="color: #f56565;">${reviewData.severityDistribution.high}</div>
366
+ <div class="stat-label">High</div>
367
+ </div>
368
+ <div class="stat-card">
369
+ <div class="stat-value" style="color: #ed8936;">${reviewData.severityDistribution.medium}</div>
370
+ <div class="stat-label">Medium</div>
371
+ </div>
372
+ <div class="stat-card">
373
+ <div class="stat-value" style="color: #48bb78;">${reviewData.severityDistribution.low}</div>
374
+ <div class="stat-label">Low</div>
375
+ </div>
376
+ </div>
377
+
378
+ <div class="severity-distribution">
379
+ <h3 style="margin-bottom: 15px; color: var(--text-secondary);">Severity Distribution</h3>
380
+ ${severityBars}
381
+ </div>
382
+
383
+ <div class="dimensions-grid" style="margin-top: 30px;">
384
+ <h3 style="margin-bottom: 15px; color: var(--text-secondary);">By Dimension</h3>
385
+ <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 15px;">
386
+ ${dimensionCards}
387
+ </div>
388
+ </div>
389
+
390
+ <style>
391
+ .review-stats {
392
+ display: grid;
393
+ grid-template-columns: repeat(4, 1fr);
394
+ gap: 20px;
395
+ margin-bottom: 30px;
396
+ }
397
+ .severity-distribution {
398
+ background: var(--bg-card);
399
+ padding: 20px;
400
+ border-radius: 8px;
401
+ box-shadow: var(--shadow);
402
+ }
403
+ .severity-bar-item {
404
+ display: flex;
405
+ align-items: center;
406
+ gap: 10px;
407
+ margin-bottom: 10px;
408
+ }
409
+ .severity-label {
410
+ width: 80px;
411
+ text-transform: capitalize;
412
+ font-size: 0.9rem;
413
+ }
414
+ .severity-bar {
415
+ flex: 1;
416
+ height: 20px;
417
+ background: var(--bg-primary);
418
+ border-radius: 4px;
419
+ overflow: hidden;
420
+ }
421
+ .severity-fill {
422
+ height: 100%;
423
+ transition: width 0.3s;
424
+ }
425
+ .severity-count {
426
+ width: 40px;
427
+ text-align: right;
428
+ font-weight: bold;
429
+ }
430
+ .dimension-card {
431
+ background: var(--bg-card);
432
+ padding: 15px;
433
+ border-radius: 8px;
434
+ box-shadow: var(--shadow);
435
+ }
436
+ .dimension-name {
437
+ font-weight: 600;
438
+ text-transform: capitalize;
439
+ margin-bottom: 5px;
440
+ }
441
+ .dimension-count {
442
+ color: var(--text-secondary);
443
+ font-size: 0.9rem;
444
+ }
445
+ @media (max-width: 768px) {
446
+ .review-stats {
447
+ grid-template-columns: repeat(2, 1fr);
448
+ }
449
+ }
450
+ </style>
451
+ </div>
452
+ `;
453
+ }
454
+
455
+ /**
456
+ * Generate JavaScript for review tab functionality
457
+ * @param {Object} reviewData - Review data
458
+ * @returns {string} - JavaScript code
459
+ */
460
+ function generateReviewScript(reviewData: ReviewData): string {
461
+ return `
462
+ // Review tab functionality
463
+ const reviewTabBtn = document.getElementById('reviewTabBtn');
464
+ const reviewSection = document.getElementById('reviewSectionContainer');
465
+ const activeSectionContainer = document.getElementById('activeSectionContainer');
466
+ const archivedSectionContainer = document.getElementById('archivedSectionContainer');
467
+
468
+ if (reviewTabBtn) {
469
+ reviewTabBtn.addEventListener('click', () => {
470
+ const isActive = reviewTabBtn.classList.contains('active');
471
+
472
+ // Toggle review section
473
+ if (isActive) {
474
+ // Hide reviews, show workflow
475
+ reviewTabBtn.classList.remove('active');
476
+ reviewSection.style.display = 'none';
477
+ activeSectionContainer.style.display = 'block';
478
+ archivedSectionContainer.style.display = 'block';
479
+ } else {
480
+ // Show reviews, hide workflow
481
+ reviewTabBtn.classList.add('active');
482
+ reviewSection.style.display = 'block';
483
+ activeSectionContainer.style.display = 'none';
484
+ archivedSectionContainer.style.display = 'none';
485
+
486
+ // Reset filter buttons
487
+ document.querySelectorAll('[data-filter]').forEach(b => b.classList.remove('active'));
488
+ document.querySelector('[data-filter="all"]').classList.add('active');
489
+ }
490
+ });
491
+ }
492
+ `;
493
+ }
494
+
495
+ /**
496
+ * Generate inline dashboard HTML (fallback if bundled templates missing)
497
+ * @param {Object} data - Dashboard data
498
+ * @returns {string}
499
+ */
500
+ function generateInlineDashboard(data: DashboardData): string {
501
+ const stats = data.statistics;
502
+ const hasReviews = data.reviewData && data.reviewData.totalFindings > 0;
503
+
504
+ return `<!DOCTYPE html>
505
+ <html lang="en">
506
+ <head>
507
+ <meta charset="UTF-8">
508
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
509
+ <title>CCW Dashboard</title>
510
+ <style>
511
+ :root {
512
+ --bg-primary: #f5f7fa;
513
+ --bg-secondary: #ffffff;
514
+ --bg-card: #ffffff;
515
+ --text-primary: #1a202c;
516
+ --text-secondary: #718096;
517
+ --border-color: #e2e8f0;
518
+ --accent-color: #4299e1;
519
+ --success-color: #48bb78;
520
+ --warning-color: #ed8936;
521
+ --danger-color: #f56565;
522
+ --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
523
+ }
524
+ [data-theme="dark"] {
525
+ --bg-primary: #1a202c;
526
+ --bg-secondary: #2d3748;
527
+ --bg-card: #2d3748;
528
+ --text-primary: #f7fafc;
529
+ --text-secondary: #a0aec0;
530
+ --border-color: #4a5568;
531
+ }
532
+ * { margin: 0; padding: 0; box-sizing: border-box; }
533
+ body {
534
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
535
+ background: var(--bg-primary);
536
+ color: var(--text-primary);
537
+ line-height: 1.6;
538
+ }
539
+ .container { max-width: 1400px; margin: 0 auto; padding: 20px; }
540
+ header {
541
+ background: var(--bg-secondary);
542
+ padding: 20px;
543
+ border-radius: 8px;
544
+ box-shadow: var(--shadow);
545
+ margin-bottom: 30px;
546
+ }
547
+ h1 { font-size: 2rem; color: var(--accent-color); margin-bottom: 10px; }
548
+ .stats-grid {
549
+ display: grid;
550
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
551
+ gap: 20px;
552
+ margin-bottom: 30px;
553
+ }
554
+ .stat-card {
555
+ background: var(--bg-card);
556
+ padding: 20px;
557
+ border-radius: 8px;
558
+ box-shadow: var(--shadow);
559
+ }
560
+ .stat-value { font-size: 2rem; font-weight: bold; color: var(--accent-color); }
561
+ .stat-label { color: var(--text-secondary); font-size: 0.9rem; }
562
+ .section { margin-bottom: 40px; }
563
+ .section-title { font-size: 1.5rem; margin-bottom: 20px; }
564
+ .sessions-grid {
565
+ display: grid;
566
+ grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
567
+ gap: 20px;
568
+ }
569
+ .session-card {
570
+ background: var(--bg-card);
571
+ padding: 20px;
572
+ border-radius: 8px;
573
+ box-shadow: var(--shadow);
574
+ }
575
+ .session-title { font-size: 1.2rem; font-weight: 600; margin-bottom: 10px; }
576
+ .session-meta { color: var(--text-secondary); font-size: 0.9rem; }
577
+ .progress-bar {
578
+ width: 100%;
579
+ height: 8px;
580
+ background: var(--bg-primary);
581
+ border-radius: 4px;
582
+ margin: 15px 0;
583
+ overflow: hidden;
584
+ }
585
+ .progress-fill {
586
+ height: 100%;
587
+ background: linear-gradient(90deg, var(--accent-color), var(--success-color));
588
+ }
589
+ .task-item {
590
+ display: flex;
591
+ align-items: center;
592
+ padding: 10px;
593
+ margin-bottom: 8px;
594
+ background: var(--bg-primary);
595
+ border-radius: 6px;
596
+ border-left: 3px solid var(--border-color);
597
+ }
598
+ .task-item.completed { border-left-color: var(--success-color); opacity: 0.8; }
599
+ .task-item.in_progress { border-left-color: var(--warning-color); }
600
+ .task-title { flex: 1; font-size: 0.9rem; }
601
+ .task-id { font-size: 0.75rem; color: var(--text-secondary); font-family: monospace; }
602
+ .empty-state { text-align: center; padding: 60px 20px; color: var(--text-secondary); }
603
+ .tabs { display: flex; gap: 10px; margin-top: 15px; }
604
+ .tab-btn {
605
+ padding: 10px 20px;
606
+ border: 1px solid var(--border-color);
607
+ border-radius: 6px;
608
+ background: var(--bg-card);
609
+ color: var(--text-primary);
610
+ cursor: pointer;
611
+ }
612
+ .tab-btn.active { background: var(--accent-color); color: white; border-color: var(--accent-color); }
613
+ .theme-toggle {
614
+ position: fixed;
615
+ bottom: 30px;
616
+ right: 30px;
617
+ width: 50px;
618
+ height: 50px;
619
+ border-radius: 50%;
620
+ background: var(--accent-color);
621
+ color: white;
622
+ border: none;
623
+ cursor: pointer;
624
+ font-size: 1.5rem;
625
+ box-shadow: var(--shadow);
626
+ }
627
+ </style>
628
+ </head>
629
+ <body>
630
+ <div class="container">
631
+ <header>
632
+ <h1>CCW Dashboard</h1>
633
+ <p style="color: var(--text-secondary);">Workflow Sessions and Reviews</p>
634
+ <div class="tabs">
635
+ <button class="tab-btn active" data-tab="workflow">Workflow</button>
636
+ ${hasReviews ? '<button class="tab-btn" data-tab="reviews">Reviews</button>' : ''}
637
+ </div>
638
+ </header>
639
+
640
+ <div id="workflowTab">
641
+ <div class="stats-grid">
642
+ <div class="stat-card">
643
+ <div class="stat-value">${stats.totalSessions}</div>
644
+ <div class="stat-label">Total Sessions</div>
645
+ </div>
646
+ <div class="stat-card">
647
+ <div class="stat-value">${stats.activeSessions}</div>
648
+ <div class="stat-label">Active Sessions</div>
649
+ </div>
650
+ <div class="stat-card">
651
+ <div class="stat-value">${stats.totalTasks}</div>
652
+ <div class="stat-label">Total Tasks</div>
653
+ </div>
654
+ <div class="stat-card">
655
+ <div class="stat-value">${stats.completedTasks}</div>
656
+ <div class="stat-label">Completed Tasks</div>
657
+ </div>
658
+ </div>
659
+
660
+ <div class="section">
661
+ <h2 class="section-title">Active Sessions</h2>
662
+ <div class="sessions-grid" id="activeSessions">
663
+ ${data.activeSessions.length === 0
664
+ ? '<div class="empty-state">No active sessions</div>'
665
+ : data.activeSessions.map(s => renderSessionCard(s, true)).join('')}
666
+ </div>
667
+ </div>
668
+
669
+ <div class="section">
670
+ <h2 class="section-title">Archived Sessions</h2>
671
+ <div class="sessions-grid" id="archivedSessions">
672
+ ${data.archivedSessions.length === 0
673
+ ? '<div class="empty-state">No archived sessions</div>'
674
+ : data.archivedSessions.map(s => renderSessionCard(s, false)).join('')}
675
+ </div>
676
+ </div>
677
+ </div>
678
+
679
+ ${hasReviews ? renderReviewTab(data.reviewData as ReviewData) : ''}
680
+ </div>
681
+
682
+ <button class="theme-toggle" onclick="toggleTheme()">🌙</button>
683
+
684
+ <script>
685
+ function toggleTheme() {
686
+ const html = document.documentElement;
687
+ const current = html.getAttribute('data-theme');
688
+ const next = current === 'dark' ? 'light' : 'dark';
689
+ html.setAttribute('data-theme', next);
690
+ localStorage.setItem('theme', next);
691
+ document.querySelector('.theme-toggle').textContent = next === 'dark' ? '☀️' : '🌙';
692
+ }
693
+
694
+ // Initialize theme
695
+ const savedTheme = localStorage.getItem('theme') || 'light';
696
+ document.documentElement.setAttribute('data-theme', savedTheme);
697
+ document.querySelector('.theme-toggle').textContent = savedTheme === 'dark' ? '☀️' : '🌙';
698
+
699
+ // Tab switching
700
+ document.querySelectorAll('.tab-btn').forEach(btn => {
701
+ btn.addEventListener('click', () => {
702
+ document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
703
+ btn.classList.add('active');
704
+
705
+ const tab = btn.dataset.tab;
706
+ document.getElementById('workflowTab').style.display = tab === 'workflow' ? 'block' : 'none';
707
+ const reviewTab = document.getElementById('reviewsTab');
708
+ if (reviewTab) reviewTab.style.display = tab === 'reviews' ? 'block' : 'none';
709
+ });
710
+ });
711
+ </script>
712
+ </body>
713
+ </html>`;
714
+ }
715
+
716
+ /**
717
+ * Render a session card
718
+ * @param {Object} session - Session data
719
+ * @param {boolean} isActive - Whether session is active
720
+ * @returns {string} - HTML string
721
+ */
722
+ function renderSessionCard(session: SessionData, isActive: boolean): string {
723
+ const completedTasks = isActive
724
+ ? session.tasks.filter(t => t.status === 'completed').length
725
+ : session.taskCount;
726
+ const totalTasks = isActive ? session.tasks.length : session.taskCount;
727
+ const progress = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;
728
+
729
+ const tasksHtml = isActive && session.tasks.length > 0
730
+ ? session.tasks.map(t => `
731
+ <div class="task-item ${t.status}">
732
+ <div class="task-title">${t.title}</div>
733
+ <span class="task-id">${t.task_id}</span>
734
+ </div>
735
+ `).join('')
736
+ : '';
737
+
738
+ return `
739
+ <div class="session-card">
740
+ <div class="session-title">${session.session_id}</div>
741
+ <div class="session-meta">
742
+ ${session.project ? `<div>${session.project}</div>` : ''}
743
+ <div>${session.created_at} | ${completedTasks}/${totalTasks} tasks</div>
744
+ </div>
745
+ ${totalTasks > 0 ? `
746
+ <div class="progress-bar">
747
+ <div class="progress-fill" style="width: ${progress}%"></div>
748
+ </div>
749
+ ` : ''}
750
+ ${tasksHtml}
751
+ </div>
752
+ `;
753
+ }
754
+
755
+ /**
756
+ * Render review tab HTML
757
+ * @param {Object} reviewData - Review data
758
+ * @returns {string} - HTML string
759
+ */
760
+ function renderReviewTab(reviewData: ReviewData): string {
761
+ const { severityDistribution, dimensionSummary } = reviewData;
762
+
763
+ return `
764
+ <div id="reviewsTab" style="display: none;">
765
+ <div class="stats-grid">
766
+ <div class="stat-card">
767
+ <div class="stat-value" style="color: #c53030;">${severityDistribution.critical}</div>
768
+ <div class="stat-label">Critical</div>
769
+ </div>
770
+ <div class="stat-card">
771
+ <div class="stat-value" style="color: #f56565;">${severityDistribution.high}</div>
772
+ <div class="stat-label">High</div>
773
+ </div>
774
+ <div class="stat-card">
775
+ <div class="stat-value" style="color: #ed8936;">${severityDistribution.medium}</div>
776
+ <div class="stat-label">Medium</div>
777
+ </div>
778
+ <div class="stat-card">
779
+ <div class="stat-value" style="color: #48bb78;">${severityDistribution.low}</div>
780
+ <div class="stat-label">Low</div>
781
+ </div>
782
+ </div>
783
+
784
+ <div class="section">
785
+ <h2 class="section-title">Findings by Dimension</h2>
786
+ <div class="sessions-grid">
787
+ ${Object.entries(dimensionSummary).map(([name, info]) => `
788
+ <div class="session-card">
789
+ <div class="session-title" style="text-transform: capitalize;">${name}</div>
790
+ <div class="session-meta">${info.count} findings</div>
791
+ </div>
792
+ `).join('')}
793
+ </div>
794
+ </div>
795
+ </div>
796
+ `;
797
+ }