claude-code-workflow 6.2.2 → 6.2.4

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 (346) hide show
  1. package/ccw/dist/cli.d.ts +2 -0
  2. package/ccw/dist/cli.d.ts.map +1 -0
  3. package/ccw/dist/cli.js +219 -0
  4. package/ccw/dist/cli.js.map +1 -0
  5. package/ccw/dist/commands/cli.d.ts +32 -0
  6. package/ccw/dist/commands/cli.d.ts.map +1 -0
  7. package/ccw/dist/commands/cli.js +619 -0
  8. package/ccw/dist/commands/cli.js.map +1 -0
  9. package/ccw/dist/commands/core-memory.d.ts +32 -0
  10. package/ccw/dist/commands/core-memory.d.ts.map +1 -0
  11. package/ccw/dist/commands/core-memory.js +640 -0
  12. package/ccw/dist/commands/core-memory.js.map +1 -0
  13. package/ccw/dist/commands/hook.d.ts +16 -0
  14. package/ccw/dist/commands/hook.d.ts.map +1 -0
  15. package/ccw/dist/commands/hook.js +276 -0
  16. package/ccw/dist/commands/hook.js.map +1 -0
  17. package/ccw/dist/commands/install.d.ts +12 -0
  18. package/ccw/dist/commands/install.d.ts.map +1 -0
  19. package/ccw/dist/commands/install.js +443 -0
  20. package/ccw/dist/commands/install.js.map +1 -0
  21. package/ccw/dist/commands/list.d.ts +5 -0
  22. package/ccw/dist/commands/list.d.ts.map +1 -0
  23. package/ccw/dist/commands/list.js +32 -0
  24. package/ccw/dist/commands/list.js.map +1 -0
  25. package/ccw/dist/commands/memory.d.ts +57 -0
  26. package/ccw/dist/commands/memory.d.ts.map +1 -0
  27. package/ccw/dist/commands/memory.js +890 -0
  28. package/ccw/dist/commands/memory.js.map +1 -0
  29. package/ccw/dist/commands/serve.d.ts +12 -0
  30. package/ccw/dist/commands/serve.d.ts.map +1 -0
  31. package/ccw/dist/commands/serve.js +63 -0
  32. package/ccw/dist/commands/serve.js.map +1 -0
  33. package/ccw/dist/commands/session-path-resolver.d.ts +45 -0
  34. package/ccw/dist/commands/session-path-resolver.d.ts.map +1 -0
  35. package/ccw/dist/commands/session-path-resolver.js +302 -0
  36. package/ccw/dist/commands/session-path-resolver.js.map +1 -0
  37. package/ccw/dist/commands/session.d.ts +12 -0
  38. package/ccw/dist/commands/session.d.ts.map +1 -0
  39. package/ccw/dist/commands/session.js +954 -0
  40. package/ccw/dist/commands/session.js.map +1 -0
  41. package/ccw/dist/commands/stop.d.ts +11 -0
  42. package/ccw/dist/commands/stop.d.ts.map +1 -0
  43. package/ccw/dist/commands/stop.js +96 -0
  44. package/ccw/dist/commands/stop.js.map +1 -0
  45. package/ccw/dist/commands/tool.d.ts +29 -0
  46. package/ccw/dist/commands/tool.d.ts.map +1 -0
  47. package/ccw/dist/commands/tool.js +173 -0
  48. package/ccw/dist/commands/tool.js.map +1 -0
  49. package/ccw/dist/commands/uninstall.d.ts +9 -0
  50. package/ccw/dist/commands/uninstall.d.ts.map +1 -0
  51. package/ccw/dist/commands/uninstall.js +239 -0
  52. package/ccw/dist/commands/uninstall.js.map +1 -0
  53. package/ccw/dist/commands/upgrade.d.ts +10 -0
  54. package/ccw/dist/commands/upgrade.d.ts.map +1 -0
  55. package/ccw/dist/commands/upgrade.js +288 -0
  56. package/ccw/dist/commands/upgrade.js.map +1 -0
  57. package/ccw/dist/commands/view.d.ts +14 -0
  58. package/ccw/dist/commands/view.d.ts.map +1 -0
  59. package/ccw/dist/commands/view.js +100 -0
  60. package/ccw/dist/commands/view.js.map +1 -0
  61. package/ccw/dist/config/storage-paths.d.ts +184 -0
  62. package/ccw/dist/config/storage-paths.d.ts.map +1 -0
  63. package/ccw/dist/config/storage-paths.js +536 -0
  64. package/ccw/dist/config/storage-paths.js.map +1 -0
  65. package/ccw/dist/core/cache-manager.d.ts +80 -0
  66. package/ccw/dist/core/cache-manager.d.ts.map +1 -0
  67. package/ccw/dist/core/cache-manager.js +260 -0
  68. package/ccw/dist/core/cache-manager.js.map +1 -0
  69. package/ccw/dist/core/claude-freshness.d.ts +53 -0
  70. package/ccw/dist/core/claude-freshness.d.ts.map +1 -0
  71. package/ccw/dist/core/claude-freshness.js +232 -0
  72. package/ccw/dist/core/claude-freshness.js.map +1 -0
  73. package/ccw/dist/core/core-memory-store.d.ts +320 -0
  74. package/ccw/dist/core/core-memory-store.d.ts.map +1 -0
  75. package/ccw/dist/core/core-memory-store.js +1177 -0
  76. package/ccw/dist/core/core-memory-store.js.map +1 -0
  77. package/ccw/dist/core/dashboard-generator-patch.d.ts +2 -0
  78. package/ccw/dist/core/dashboard-generator-patch.d.ts.map +1 -0
  79. package/ccw/dist/core/dashboard-generator-patch.js +48 -0
  80. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -0
  81. package/ccw/dist/core/dashboard-generator.d.ts +8 -0
  82. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -0
  83. package/ccw/dist/core/dashboard-generator.js +695 -0
  84. package/ccw/dist/core/dashboard-generator.js.map +1 -0
  85. package/ccw/dist/core/data-aggregator.d.ts +145 -0
  86. package/ccw/dist/core/data-aggregator.d.ts.map +1 -0
  87. package/ccw/dist/core/data-aggregator.js +416 -0
  88. package/ccw/dist/core/data-aggregator.js.map +1 -0
  89. package/ccw/dist/core/history-importer.d.ts +102 -0
  90. package/ccw/dist/core/history-importer.d.ts.map +1 -0
  91. package/ccw/dist/core/history-importer.js +493 -0
  92. package/ccw/dist/core/history-importer.js.map +1 -0
  93. package/ccw/dist/core/lite-scanner-complete.d.ts +81 -0
  94. package/ccw/dist/core/lite-scanner-complete.d.ts.map +1 -0
  95. package/ccw/dist/core/lite-scanner-complete.js +368 -0
  96. package/ccw/dist/core/lite-scanner-complete.js.map +1 -0
  97. package/ccw/dist/core/lite-scanner.d.ts +81 -0
  98. package/ccw/dist/core/lite-scanner.d.ts.map +1 -0
  99. package/ccw/dist/core/lite-scanner.js +368 -0
  100. package/ccw/dist/core/lite-scanner.js.map +1 -0
  101. package/ccw/dist/core/manifest.d.ts +88 -0
  102. package/ccw/dist/core/manifest.d.ts.map +1 -0
  103. package/ccw/dist/core/manifest.js +214 -0
  104. package/ccw/dist/core/manifest.js.map +1 -0
  105. package/ccw/dist/core/memory-embedder-bridge.d.ts +83 -0
  106. package/ccw/dist/core/memory-embedder-bridge.d.ts.map +1 -0
  107. package/ccw/dist/core/memory-embedder-bridge.js +181 -0
  108. package/ccw/dist/core/memory-embedder-bridge.js.map +1 -0
  109. package/ccw/dist/core/memory-store.d.ts +249 -0
  110. package/ccw/dist/core/memory-store.d.ts.map +1 -0
  111. package/ccw/dist/core/memory-store.js +781 -0
  112. package/ccw/dist/core/memory-store.js.map +1 -0
  113. package/ccw/dist/core/routes/ccw-routes.d.ts +20 -0
  114. package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -0
  115. package/ccw/dist/core/routes/ccw-routes.js +70 -0
  116. package/ccw/dist/core/routes/ccw-routes.js.map +1 -0
  117. package/ccw/dist/core/routes/claude-routes.d.ts +19 -0
  118. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -0
  119. package/ccw/dist/core/routes/claude-routes.js +1017 -0
  120. package/ccw/dist/core/routes/claude-routes.js.map +1 -0
  121. package/ccw/dist/core/routes/cli-routes.d.ts +20 -0
  122. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -0
  123. package/ccw/dist/core/routes/cli-routes.js +468 -0
  124. package/ccw/dist/core/routes/cli-routes.js.map +1 -0
  125. package/ccw/dist/core/routes/codexlens-routes.d.ts +20 -0
  126. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -0
  127. package/ccw/dist/core/routes/codexlens-routes.js +754 -0
  128. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -0
  129. package/ccw/dist/core/routes/core-memory-routes.d.ts +21 -0
  130. package/ccw/dist/core/routes/core-memory-routes.d.ts.map +1 -0
  131. package/ccw/dist/core/routes/core-memory-routes.js +520 -0
  132. package/ccw/dist/core/routes/core-memory-routes.js.map +1 -0
  133. package/ccw/dist/core/routes/files-routes.d.ts +20 -0
  134. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -0
  135. package/ccw/dist/core/routes/files-routes.js +374 -0
  136. package/ccw/dist/core/routes/files-routes.js.map +1 -0
  137. package/ccw/dist/core/routes/graph-routes.d.ts +20 -0
  138. package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -0
  139. package/ccw/dist/core/routes/graph-routes.js +517 -0
  140. package/ccw/dist/core/routes/graph-routes.js.map +1 -0
  141. package/ccw/dist/core/routes/help-routes.d.ts +20 -0
  142. package/ccw/dist/core/routes/help-routes.d.ts.map +1 -0
  143. package/ccw/dist/core/routes/help-routes.js +250 -0
  144. package/ccw/dist/core/routes/help-routes.js.map +1 -0
  145. package/ccw/dist/core/routes/hooks-routes.d.ts +21 -0
  146. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -0
  147. package/ccw/dist/core/routes/hooks-routes.js +346 -0
  148. package/ccw/dist/core/routes/hooks-routes.js.map +1 -0
  149. package/ccw/dist/core/routes/mcp-routes.d.ts +20 -0
  150. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -0
  151. package/ccw/dist/core/routes/mcp-routes.js +1129 -0
  152. package/ccw/dist/core/routes/mcp-routes.js.map +1 -0
  153. package/ccw/dist/core/routes/mcp-templates-db.d.ts +54 -0
  154. package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -0
  155. package/ccw/dist/core/routes/mcp-templates-db.js +226 -0
  156. package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -0
  157. package/ccw/dist/core/routes/memory-routes.d.ts +21 -0
  158. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -0
  159. package/ccw/dist/core/routes/memory-routes.js +1095 -0
  160. package/ccw/dist/core/routes/memory-routes.js.map +1 -0
  161. package/ccw/dist/core/routes/rules-routes.d.ts +20 -0
  162. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -0
  163. package/ccw/dist/core/routes/rules-routes.js +442 -0
  164. package/ccw/dist/core/routes/rules-routes.js.map +1 -0
  165. package/ccw/dist/core/routes/session-routes.d.ts +20 -0
  166. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -0
  167. package/ccw/dist/core/routes/session-routes.js +423 -0
  168. package/ccw/dist/core/routes/session-routes.js.map +1 -0
  169. package/ccw/dist/core/routes/skills-routes.d.ts +20 -0
  170. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -0
  171. package/ccw/dist/core/routes/skills-routes.js +533 -0
  172. package/ccw/dist/core/routes/skills-routes.js.map +1 -0
  173. package/ccw/dist/core/routes/status-routes.d.ts +20 -0
  174. package/ccw/dist/core/routes/status-routes.d.ts.map +1 -0
  175. package/ccw/dist/core/routes/status-routes.js +38 -0
  176. package/ccw/dist/core/routes/status-routes.js.map +1 -0
  177. package/ccw/dist/core/routes/system-routes.d.ts +22 -0
  178. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -0
  179. package/ccw/dist/core/routes/system-routes.js +354 -0
  180. package/ccw/dist/core/routes/system-routes.js.map +1 -0
  181. package/ccw/dist/core/server.d.ts +17 -0
  182. package/ccw/dist/core/server.d.ts.map +1 -0
  183. package/ccw/dist/core/server.js +386 -0
  184. package/ccw/dist/core/server.js.map +1 -0
  185. package/ccw/dist/core/session-clustering-service.d.ts +153 -0
  186. package/ccw/dist/core/session-clustering-service.d.ts.map +1 -0
  187. package/ccw/dist/core/session-clustering-service.js +1065 -0
  188. package/ccw/dist/core/session-clustering-service.js.map +1 -0
  189. package/ccw/dist/core/session-scanner.d.ts +32 -0
  190. package/ccw/dist/core/session-scanner.d.ts.map +1 -0
  191. package/ccw/dist/core/session-scanner.js +253 -0
  192. package/ccw/dist/core/session-scanner.js.map +1 -0
  193. package/ccw/dist/core/websocket.d.ts +23 -0
  194. package/ccw/dist/core/websocket.d.ts.map +1 -0
  195. package/ccw/dist/core/websocket.js +168 -0
  196. package/ccw/dist/core/websocket.js.map +1 -0
  197. package/ccw/dist/index.d.ts +10 -0
  198. package/ccw/dist/index.d.ts.map +1 -0
  199. package/ccw/dist/index.js +10 -0
  200. package/ccw/dist/index.js.map +1 -0
  201. package/ccw/dist/mcp-server/index.d.ts +7 -0
  202. package/ccw/dist/mcp-server/index.d.ts.map +1 -0
  203. package/ccw/dist/mcp-server/index.js +157 -0
  204. package/ccw/dist/mcp-server/index.js.map +1 -0
  205. package/ccw/dist/tools/classify-folders.d.ts +26 -0
  206. package/ccw/dist/tools/classify-folders.d.ts.map +1 -0
  207. package/ccw/dist/tools/classify-folders.js +201 -0
  208. package/ccw/dist/tools/classify-folders.js.map +1 -0
  209. package/ccw/dist/tools/cli-config-manager.d.ts +62 -0
  210. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -0
  211. package/ccw/dist/tools/cli-config-manager.js +221 -0
  212. package/ccw/dist/tools/cli-config-manager.js.map +1 -0
  213. package/ccw/dist/tools/cli-executor.d.ts +373 -0
  214. package/ccw/dist/tools/cli-executor.d.ts.map +1 -0
  215. package/ccw/dist/tools/cli-executor.js +1625 -0
  216. package/ccw/dist/tools/cli-executor.js.map +1 -0
  217. package/ccw/dist/tools/cli-history-store.d.ts +330 -0
  218. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -0
  219. package/ccw/dist/tools/cli-history-store.js +916 -0
  220. package/ccw/dist/tools/cli-history-store.js.map +1 -0
  221. package/ccw/dist/tools/codex-lens.d.ts +118 -0
  222. package/ccw/dist/tools/codex-lens.d.ts.map +1 -0
  223. package/ccw/dist/tools/codex-lens.js +962 -0
  224. package/ccw/dist/tools/codex-lens.js.map +1 -0
  225. package/ccw/dist/tools/convert-tokens-to-css.d.ts +14 -0
  226. package/ccw/dist/tools/convert-tokens-to-css.d.ts.map +1 -0
  227. package/ccw/dist/tools/convert-tokens-to-css.js +244 -0
  228. package/ccw/dist/tools/convert-tokens-to-css.js.map +1 -0
  229. package/ccw/dist/tools/core-memory.d.ts +66 -0
  230. package/ccw/dist/tools/core-memory.d.ts.map +1 -0
  231. package/ccw/dist/tools/core-memory.js +324 -0
  232. package/ccw/dist/tools/core-memory.js.map +1 -0
  233. package/ccw/dist/tools/detect-changed-modules.d.ts +24 -0
  234. package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -0
  235. package/ccw/dist/tools/detect-changed-modules.js +277 -0
  236. package/ccw/dist/tools/detect-changed-modules.js.map +1 -0
  237. package/ccw/dist/tools/discover-design-files.d.ts +36 -0
  238. package/ccw/dist/tools/discover-design-files.d.ts.map +1 -0
  239. package/ccw/dist/tools/discover-design-files.js +147 -0
  240. package/ccw/dist/tools/discover-design-files.js.map +1 -0
  241. package/ccw/dist/tools/edit-file.d.ts +28 -0
  242. package/ccw/dist/tools/edit-file.d.ts.map +1 -0
  243. package/ccw/dist/tools/edit-file.js +479 -0
  244. package/ccw/dist/tools/edit-file.js.map +1 -0
  245. package/ccw/dist/tools/generate-module-docs.d.ts +22 -0
  246. package/ccw/dist/tools/generate-module-docs.d.ts.map +1 -0
  247. package/ccw/dist/tools/generate-module-docs.js +379 -0
  248. package/ccw/dist/tools/generate-module-docs.js.map +1 -0
  249. package/ccw/dist/tools/get-modules-by-depth.d.ts +15 -0
  250. package/ccw/dist/tools/get-modules-by-depth.d.ts.map +1 -0
  251. package/ccw/dist/tools/get-modules-by-depth.js +296 -0
  252. package/ccw/dist/tools/get-modules-by-depth.js.map +1 -0
  253. package/ccw/dist/tools/index.d.ts +55 -0
  254. package/ccw/dist/tools/index.d.ts.map +1 -0
  255. package/ccw/dist/tools/index.js +304 -0
  256. package/ccw/dist/tools/index.js.map +1 -0
  257. package/ccw/dist/tools/native-session-discovery.d.ts +97 -0
  258. package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -0
  259. package/ccw/dist/tools/native-session-discovery.js +700 -0
  260. package/ccw/dist/tools/native-session-discovery.js.map +1 -0
  261. package/ccw/dist/tools/notifier.d.ts +50 -0
  262. package/ccw/dist/tools/notifier.d.ts.map +1 -0
  263. package/ccw/dist/tools/notifier.js +90 -0
  264. package/ccw/dist/tools/notifier.js.map +1 -0
  265. package/ccw/dist/tools/read-file.d.ts +32 -0
  266. package/ccw/dist/tools/read-file.d.ts.map +1 -0
  267. package/ccw/dist/tools/read-file.js +329 -0
  268. package/ccw/dist/tools/read-file.js.map +1 -0
  269. package/ccw/dist/tools/resume-strategy.d.ts +48 -0
  270. package/ccw/dist/tools/resume-strategy.d.ts.map +1 -0
  271. package/ccw/dist/tools/resume-strategy.js +248 -0
  272. package/ccw/dist/tools/resume-strategy.js.map +1 -0
  273. package/ccw/dist/tools/session-content-parser.d.ts +58 -0
  274. package/ccw/dist/tools/session-content-parser.d.ts.map +1 -0
  275. package/ccw/dist/tools/session-content-parser.js +420 -0
  276. package/ccw/dist/tools/session-content-parser.js.map +1 -0
  277. package/ccw/dist/tools/session-manager.d.ts +9 -0
  278. package/ccw/dist/tools/session-manager.d.ts.map +1 -0
  279. package/ccw/dist/tools/session-manager.js +834 -0
  280. package/ccw/dist/tools/session-manager.js.map +1 -0
  281. package/ccw/dist/tools/smart-context.d.ts +35 -0
  282. package/ccw/dist/tools/smart-context.d.ts.map +1 -0
  283. package/ccw/dist/tools/smart-context.js +182 -0
  284. package/ccw/dist/tools/smart-context.js.map +1 -0
  285. package/ccw/dist/tools/smart-search.d.ts +105 -0
  286. package/ccw/dist/tools/smart-search.d.ts.map +1 -0
  287. package/ccw/dist/tools/smart-search.js +1753 -0
  288. package/ccw/dist/tools/smart-search.js.map +1 -0
  289. package/ccw/dist/tools/storage-manager.d.ts +114 -0
  290. package/ccw/dist/tools/storage-manager.d.ts.map +1 -0
  291. package/ccw/dist/tools/storage-manager.js +392 -0
  292. package/ccw/dist/tools/storage-manager.js.map +1 -0
  293. package/ccw/dist/tools/ui-generate-preview.d.ts +39 -0
  294. package/ccw/dist/tools/ui-generate-preview.d.ts.map +1 -0
  295. package/ccw/dist/tools/ui-generate-preview.js +300 -0
  296. package/ccw/dist/tools/ui-generate-preview.js.map +1 -0
  297. package/ccw/dist/tools/ui-instantiate-prototypes.d.ts +75 -0
  298. package/ccw/dist/tools/ui-instantiate-prototypes.d.ts.map +1 -0
  299. package/ccw/dist/tools/ui-instantiate-prototypes.js +256 -0
  300. package/ccw/dist/tools/ui-instantiate-prototypes.js.map +1 -0
  301. package/ccw/dist/tools/update-module-claude.d.ts +80 -0
  302. package/ccw/dist/tools/update-module-claude.d.ts.map +1 -0
  303. package/ccw/dist/tools/update-module-claude.js +351 -0
  304. package/ccw/dist/tools/update-module-claude.js.map +1 -0
  305. package/ccw/dist/tools/write-file.d.ts +19 -0
  306. package/ccw/dist/tools/write-file.d.ts.map +1 -0
  307. package/ccw/dist/tools/write-file.js +193 -0
  308. package/ccw/dist/tools/write-file.js.map +1 -0
  309. package/ccw/dist/types/config.d.ts +11 -0
  310. package/ccw/dist/types/config.d.ts.map +1 -0
  311. package/ccw/dist/types/config.js +2 -0
  312. package/ccw/dist/types/config.js.map +1 -0
  313. package/ccw/dist/types/index.d.ts +4 -0
  314. package/ccw/dist/types/index.d.ts.map +1 -0
  315. package/ccw/dist/types/index.js +4 -0
  316. package/ccw/dist/types/index.js.map +1 -0
  317. package/ccw/dist/types/session.d.ts +20 -0
  318. package/ccw/dist/types/session.d.ts.map +1 -0
  319. package/ccw/dist/types/session.js +2 -0
  320. package/ccw/dist/types/session.js.map +1 -0
  321. package/ccw/dist/types/tool.d.ts +36 -0
  322. package/ccw/dist/types/tool.d.ts.map +1 -0
  323. package/ccw/dist/types/tool.js +11 -0
  324. package/ccw/dist/types/tool.js.map +1 -0
  325. package/ccw/dist/utils/browser-launcher.d.ts +13 -0
  326. package/ccw/dist/utils/browser-launcher.d.ts.map +1 -0
  327. package/ccw/dist/utils/browser-launcher.js +60 -0
  328. package/ccw/dist/utils/browser-launcher.js.map +1 -0
  329. package/ccw/dist/utils/file-utils.d.ts +25 -0
  330. package/ccw/dist/utils/file-utils.d.ts.map +1 -0
  331. package/ccw/dist/utils/file-utils.js +48 -0
  332. package/ccw/dist/utils/file-utils.js.map +1 -0
  333. package/ccw/dist/utils/path-resolver.d.ts +80 -0
  334. package/ccw/dist/utils/path-resolver.d.ts.map +1 -0
  335. package/ccw/dist/utils/path-resolver.js +260 -0
  336. package/ccw/dist/utils/path-resolver.js.map +1 -0
  337. package/ccw/dist/utils/path-validator.d.ts +49 -0
  338. package/ccw/dist/utils/path-validator.d.ts.map +1 -0
  339. package/ccw/dist/utils/path-validator.js +123 -0
  340. package/ccw/dist/utils/path-validator.js.map +1 -0
  341. package/ccw/dist/utils/ui.d.ts +62 -0
  342. package/ccw/dist/utils/ui.d.ts.map +1 -0
  343. package/ccw/dist/utils/ui.js +129 -0
  344. package/ccw/dist/utils/ui.js.map +1 -0
  345. package/ccw/package.json +1 -1
  346. package/package.json +5 -2
@@ -0,0 +1,695 @@
1
+ // @ts-nocheck
2
+ import { readFileSync, existsSync } from 'fs';
3
+ import { join, dirname } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ // Bundled template paths (from dist/core/ -> src/templates/)
8
+ const UNIFIED_TEMPLATE = join(__dirname, '../../src/templates/dashboard.html');
9
+ const JS_FILE = join(__dirname, '../../src/templates/dashboard.js');
10
+ const MODULE_CSS_DIR = join(__dirname, '../../src/templates/dashboard-css');
11
+ const WORKFLOW_TEMPLATE = join(__dirname, '../../src/templates/workflow-dashboard.html');
12
+ const REVIEW_TEMPLATE = join(__dirname, '../../src/templates/review-cycle-dashboard.html');
13
+ // Modular CSS files in load order
14
+ const MODULE_CSS_FILES = [
15
+ '01-base.css',
16
+ '02-session.css',
17
+ '03-tasks.css',
18
+ '04-lite-tasks.css',
19
+ '05-context.css',
20
+ '06-cards.css',
21
+ '07-managers.css',
22
+ '08-review.css',
23
+ '09-explorer.css',
24
+ // CLI modules (split from 10-cli.css)
25
+ '10-cli-status.css',
26
+ '11-cli-history.css',
27
+ '12-cli-legacy.css',
28
+ '13-cli-ccw.css',
29
+ '14-cli-modals.css',
30
+ '15-cli-endpoints.css',
31
+ '16-cli-session.css',
32
+ '17-cli-conversation.css',
33
+ '18-cli-settings.css',
34
+ '19-cli-native-session.css',
35
+ '20-cli-taskqueue.css',
36
+ '21-cli-toolmgmt.css',
37
+ '22-cli-semantic.css',
38
+ // Other modules
39
+ '23-memory.css',
40
+ '24-prompt-history.css',
41
+ '25-skills-rules.css',
42
+ '26-claude-manager.css',
43
+ '27-graph-explorer.css',
44
+ '28-mcp-manager.css',
45
+ '29-help.css',
46
+ '30-core-memory.css'
47
+ ];
48
+ const MODULE_FILES = [
49
+ 'i18n.js', // Must be loaded first for translations
50
+ 'utils.js',
51
+ 'state.js',
52
+ 'api.js',
53
+ 'components/theme.js',
54
+ 'components/modals.js',
55
+ 'components/navigation.js',
56
+ 'components/sidebar.js',
57
+ 'components/tabs-context.js',
58
+ 'components/tabs-other.js',
59
+ 'components/task-drawer-core.js',
60
+ 'components/task-drawer-renderers.js',
61
+ 'components/flowchart.js',
62
+ 'components/carousel.js',
63
+ 'components/notifications.js',
64
+ 'components/global-notifications.js',
65
+ 'components/task-queue-sidebar.js',
66
+ 'components/cli-status.js',
67
+ 'components/cli-history.js',
68
+ 'components/mcp-manager.js',
69
+ 'components/hook-manager.js',
70
+ 'components/version-check.js',
71
+ 'components/storage-manager.js',
72
+ 'components/index-manager.js',
73
+ 'views/home.js',
74
+ 'views/project-overview.js',
75
+ 'views/session-detail.js',
76
+ 'views/review-session.js',
77
+ 'views/lite-tasks.js',
78
+ 'views/fix-session.js',
79
+ 'views/cli-manager.js',
80
+ 'views/codexlens-manager.js',
81
+ 'views/explorer.js',
82
+ 'views/mcp-manager.js',
83
+ 'views/hook-manager.js',
84
+ 'views/history.js',
85
+ 'views/graph-explorer.js',
86
+ 'views/memory.js',
87
+ 'views/core-memory.js',
88
+ 'views/core-memory-graph.js',
89
+ 'views/core-memory-clusters.js',
90
+ 'views/prompt-history.js',
91
+ 'views/skills-manager.js',
92
+ 'views/rules-manager.js',
93
+ 'views/claude-manager.js',
94
+ 'views/help.js',
95
+ 'main.js'
96
+ ];
97
+ /**
98
+ * Generate dashboard HTML from aggregated data
99
+ * Uses bundled templates from ccw package
100
+ * @param {Object} data - Aggregated dashboard data
101
+ * @returns {Promise<string>} - Generated HTML
102
+ */
103
+ export async function generateDashboard(data) {
104
+ // Use new unified template (with sidebar layout)
105
+ if (existsSync(UNIFIED_TEMPLATE)) {
106
+ return generateFromUnifiedTemplate(data);
107
+ }
108
+ // Fallback to legacy workflow template
109
+ if (existsSync(WORKFLOW_TEMPLATE)) {
110
+ return generateFromBundledTemplate(data, WORKFLOW_TEMPLATE);
111
+ }
112
+ // Fallback to inline dashboard if templates missing
113
+ return generateInlineDashboard(data);
114
+ }
115
+ /**
116
+ * Generate dashboard using unified template (new sidebar layout)
117
+ * @param {Object} data - Dashboard data
118
+ * @returns {string} - Generated HTML
119
+ */
120
+ function generateFromUnifiedTemplate(data) {
121
+ let html = readFileSync(UNIFIED_TEMPLATE, 'utf8');
122
+ // Read and concatenate modular CSS files in load order
123
+ let cssContent = MODULE_CSS_FILES.map(file => {
124
+ const filePath = join(MODULE_CSS_DIR, file);
125
+ return existsSync(filePath) ? readFileSync(filePath, 'utf8') : '';
126
+ }).join('\n\n');
127
+ // Read JS content
128
+ let jsContent = '';
129
+ const moduleBase = join(__dirname, '../../src/templates/dashboard-js');
130
+ if (existsSync(moduleBase)) {
131
+ jsContent = MODULE_FILES.map(file => {
132
+ const filePath = join(moduleBase, file);
133
+ return existsSync(filePath) ? readFileSync(filePath, 'utf8') : '';
134
+ }).join('\n\n');
135
+ }
136
+ else if (existsSync(JS_FILE)) {
137
+ jsContent = readFileSync(JS_FILE, 'utf8');
138
+ }
139
+ // Prepare complete workflow data
140
+ const workflowData = {
141
+ generatedAt: data.generatedAt || new Date().toISOString(),
142
+ activeSessions: data.activeSessions || [],
143
+ archivedSessions: data.archivedSessions || [],
144
+ liteTasks: data.liteTasks || { litePlan: [], liteFix: [] },
145
+ reviewData: data.reviewData || { dimensions: {} },
146
+ statistics: data.statistics || {
147
+ totalSessions: 0,
148
+ activeSessions: 0,
149
+ totalTasks: 0,
150
+ completedTasks: 0,
151
+ litePlanCount: 0,
152
+ liteFixCount: 0
153
+ }
154
+ };
155
+ // Get project path and recent paths
156
+ const projectPath = data.projectPath || process.cwd();
157
+ const recentPaths = data.recentPaths || [projectPath];
158
+ // Replace JS placeholders with actual data
159
+ jsContent = jsContent.replace('{{WORKFLOW_DATA}}', JSON.stringify(workflowData, null, 2));
160
+ jsContent = jsContent.replace(/\{\{PROJECT_PATH\}\}/g, projectPath.replace(/\\/g, '/'));
161
+ jsContent = jsContent.replace('{{RECENT_PATHS}}', JSON.stringify(recentPaths));
162
+ // Inject platform information for cross-platform MCP command generation
163
+ // 'win32' for Windows, 'darwin' for macOS, 'linux' for Linux
164
+ jsContent = jsContent.replace(/\{\{SERVER_PLATFORM\}\}/g, process.platform);
165
+ // Inject JS and CSS into HTML template
166
+ html = html.replace('{{JS_CONTENT}}', jsContent);
167
+ html = html.replace('{{CSS_CONTENT}}', cssContent);
168
+ // Also replace any remaining placeholders in HTML
169
+ html = html.replace(/\{\{PROJECT_PATH\}\}/g, projectPath.replace(/\\/g, '/'));
170
+ return html;
171
+ }
172
+ /**
173
+ * Generate dashboard using bundled template
174
+ * @param {Object} data - Dashboard data
175
+ * @param {string} templatePath - Path to workflow-dashboard.html
176
+ * @returns {string} - Generated HTML
177
+ */
178
+ function generateFromBundledTemplate(data, templatePath) {
179
+ let html = readFileSync(templatePath, 'utf8');
180
+ // Prepare workflow data for injection
181
+ const workflowData = {
182
+ activeSessions: data.activeSessions,
183
+ archivedSessions: data.archivedSessions
184
+ };
185
+ // Inject workflow data
186
+ html = html.replace('{{WORKFLOW_DATA}}', JSON.stringify(workflowData, null, 2));
187
+ // If we have review data, add a review tab
188
+ if (data.reviewData && data.reviewData.totalFindings > 0) {
189
+ html = injectReviewTab(html, data.reviewData);
190
+ }
191
+ return html;
192
+ }
193
+ /**
194
+ * Inject review tab into existing dashboard
195
+ * @param {string} html - Base dashboard HTML
196
+ * @param {Object} reviewData - Review data to display
197
+ * @returns {string} - Modified HTML with review tab
198
+ */
199
+ function injectReviewTab(html, reviewData) {
200
+ // Add review tab button in header controls
201
+ const tabButtonHtml = `
202
+ <button class="btn" data-tab="reviews" id="reviewTabBtn">Reviews (${reviewData.totalFindings})</button>
203
+ `;
204
+ // Insert after filter-group
205
+ html = html.replace('</div>\n </div>\n </header>', `</div>
206
+ <div class="filter-group" style="margin-left: auto;">
207
+ ${tabButtonHtml}
208
+ </div>
209
+ </div>
210
+ </header>`);
211
+ // Add review section before closing container
212
+ const reviewSectionHtml = generateReviewSection(reviewData);
213
+ html = html.replace('</div>\n\n <button class="theme-toggle"', `</div>
214
+
215
+ ${reviewSectionHtml}
216
+ </div>
217
+
218
+ <button class="theme-toggle"`);
219
+ // Add review tab JavaScript
220
+ const reviewScript = generateReviewScript(reviewData);
221
+ html = html.replace('</script>', `\n${reviewScript}\n</script>`);
222
+ return html;
223
+ }
224
+ /**
225
+ * Generate review section HTML
226
+ * @param {Object} reviewData - Review data
227
+ * @returns {string} - HTML for review section
228
+ */
229
+ function generateReviewSection(reviewData) {
230
+ const severityBars = Object.entries(reviewData.severityDistribution)
231
+ .map(([severity, count]) => {
232
+ const colors = {
233
+ critical: '#c53030',
234
+ high: '#f56565',
235
+ medium: '#ed8936',
236
+ low: '#48bb78'
237
+ };
238
+ const percent = reviewData.totalFindings > 0
239
+ ? Math.round((count / reviewData.totalFindings) * 100)
240
+ : 0;
241
+ return `
242
+ <div class="severity-bar-item">
243
+ <span class="severity-label">${severity}</span>
244
+ <div class="severity-bar">
245
+ <div class="severity-fill" style="width: ${percent}%; background-color: ${colors[severity]}"></div>
246
+ </div>
247
+ <span class="severity-count">${count}</span>
248
+ </div>
249
+ `;
250
+ }).join('');
251
+ const dimensionCards = Object.entries(reviewData.dimensionSummary)
252
+ .map(([name, info]) => `
253
+ <div class="dimension-card">
254
+ <div class="dimension-name">${name}</div>
255
+ <div class="dimension-count">${info.count} findings</div>
256
+ </div>
257
+ `).join('');
258
+ return `
259
+ <div class="section" id="reviewSectionContainer" style="display: none;">
260
+ <div class="section-header">
261
+ <h2 class="section-title">Code Review Findings</h2>
262
+ </div>
263
+
264
+ <div class="review-stats">
265
+ <div class="stat-card">
266
+ <div class="stat-value" style="color: #c53030;">${reviewData.severityDistribution.critical}</div>
267
+ <div class="stat-label">Critical</div>
268
+ </div>
269
+ <div class="stat-card">
270
+ <div class="stat-value" style="color: #f56565;">${reviewData.severityDistribution.high}</div>
271
+ <div class="stat-label">High</div>
272
+ </div>
273
+ <div class="stat-card">
274
+ <div class="stat-value" style="color: #ed8936;">${reviewData.severityDistribution.medium}</div>
275
+ <div class="stat-label">Medium</div>
276
+ </div>
277
+ <div class="stat-card">
278
+ <div class="stat-value" style="color: #48bb78;">${reviewData.severityDistribution.low}</div>
279
+ <div class="stat-label">Low</div>
280
+ </div>
281
+ </div>
282
+
283
+ <div class="severity-distribution">
284
+ <h3 style="margin-bottom: 15px; color: var(--text-secondary);">Severity Distribution</h3>
285
+ ${severityBars}
286
+ </div>
287
+
288
+ <div class="dimensions-grid" style="margin-top: 30px;">
289
+ <h3 style="margin-bottom: 15px; color: var(--text-secondary);">By Dimension</h3>
290
+ <div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 15px;">
291
+ ${dimensionCards}
292
+ </div>
293
+ </div>
294
+
295
+ <style>
296
+ .review-stats {
297
+ display: grid;
298
+ grid-template-columns: repeat(4, 1fr);
299
+ gap: 20px;
300
+ margin-bottom: 30px;
301
+ }
302
+ .severity-distribution {
303
+ background: var(--bg-card);
304
+ padding: 20px;
305
+ border-radius: 8px;
306
+ box-shadow: var(--shadow);
307
+ }
308
+ .severity-bar-item {
309
+ display: flex;
310
+ align-items: center;
311
+ gap: 10px;
312
+ margin-bottom: 10px;
313
+ }
314
+ .severity-label {
315
+ width: 80px;
316
+ text-transform: capitalize;
317
+ font-size: 0.9rem;
318
+ }
319
+ .severity-bar {
320
+ flex: 1;
321
+ height: 20px;
322
+ background: var(--bg-primary);
323
+ border-radius: 4px;
324
+ overflow: hidden;
325
+ }
326
+ .severity-fill {
327
+ height: 100%;
328
+ transition: width 0.3s;
329
+ }
330
+ .severity-count {
331
+ width: 40px;
332
+ text-align: right;
333
+ font-weight: bold;
334
+ }
335
+ .dimension-card {
336
+ background: var(--bg-card);
337
+ padding: 15px;
338
+ border-radius: 8px;
339
+ box-shadow: var(--shadow);
340
+ }
341
+ .dimension-name {
342
+ font-weight: 600;
343
+ text-transform: capitalize;
344
+ margin-bottom: 5px;
345
+ }
346
+ .dimension-count {
347
+ color: var(--text-secondary);
348
+ font-size: 0.9rem;
349
+ }
350
+ @media (max-width: 768px) {
351
+ .review-stats {
352
+ grid-template-columns: repeat(2, 1fr);
353
+ }
354
+ }
355
+ </style>
356
+ </div>
357
+ `;
358
+ }
359
+ /**
360
+ * Generate JavaScript for review tab functionality
361
+ * @param {Object} reviewData - Review data
362
+ * @returns {string} - JavaScript code
363
+ */
364
+ function generateReviewScript(reviewData) {
365
+ return `
366
+ // Review tab functionality
367
+ const reviewTabBtn = document.getElementById('reviewTabBtn');
368
+ const reviewSection = document.getElementById('reviewSectionContainer');
369
+ const activeSectionContainer = document.getElementById('activeSectionContainer');
370
+ const archivedSectionContainer = document.getElementById('archivedSectionContainer');
371
+
372
+ if (reviewTabBtn) {
373
+ reviewTabBtn.addEventListener('click', () => {
374
+ const isActive = reviewTabBtn.classList.contains('active');
375
+
376
+ // Toggle review section
377
+ if (isActive) {
378
+ // Hide reviews, show workflow
379
+ reviewTabBtn.classList.remove('active');
380
+ reviewSection.style.display = 'none';
381
+ activeSectionContainer.style.display = 'block';
382
+ archivedSectionContainer.style.display = 'block';
383
+ } else {
384
+ // Show reviews, hide workflow
385
+ reviewTabBtn.classList.add('active');
386
+ reviewSection.style.display = 'block';
387
+ activeSectionContainer.style.display = 'none';
388
+ archivedSectionContainer.style.display = 'none';
389
+
390
+ // Reset filter buttons
391
+ document.querySelectorAll('[data-filter]').forEach(b => b.classList.remove('active'));
392
+ document.querySelector('[data-filter="all"]').classList.add('active');
393
+ }
394
+ });
395
+ }
396
+ `;
397
+ }
398
+ /**
399
+ * Generate inline dashboard HTML (fallback if bundled templates missing)
400
+ * @param {Object} data - Dashboard data
401
+ * @returns {string}
402
+ */
403
+ function generateInlineDashboard(data) {
404
+ const stats = data.statistics;
405
+ const hasReviews = data.reviewData && data.reviewData.totalFindings > 0;
406
+ return `<!DOCTYPE html>
407
+ <html lang="en">
408
+ <head>
409
+ <meta charset="UTF-8">
410
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
411
+ <title>CCW Dashboard</title>
412
+ <style>
413
+ :root {
414
+ --bg-primary: #f5f7fa;
415
+ --bg-secondary: #ffffff;
416
+ --bg-card: #ffffff;
417
+ --text-primary: #1a202c;
418
+ --text-secondary: #718096;
419
+ --border-color: #e2e8f0;
420
+ --accent-color: #4299e1;
421
+ --success-color: #48bb78;
422
+ --warning-color: #ed8936;
423
+ --danger-color: #f56565;
424
+ --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
425
+ }
426
+ [data-theme="dark"] {
427
+ --bg-primary: #1a202c;
428
+ --bg-secondary: #2d3748;
429
+ --bg-card: #2d3748;
430
+ --text-primary: #f7fafc;
431
+ --text-secondary: #a0aec0;
432
+ --border-color: #4a5568;
433
+ }
434
+ * { margin: 0; padding: 0; box-sizing: border-box; }
435
+ body {
436
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
437
+ background: var(--bg-primary);
438
+ color: var(--text-primary);
439
+ line-height: 1.6;
440
+ }
441
+ .container { max-width: 1400px; margin: 0 auto; padding: 20px; }
442
+ header {
443
+ background: var(--bg-secondary);
444
+ padding: 20px;
445
+ border-radius: 8px;
446
+ box-shadow: var(--shadow);
447
+ margin-bottom: 30px;
448
+ }
449
+ h1 { font-size: 2rem; color: var(--accent-color); margin-bottom: 10px; }
450
+ .stats-grid {
451
+ display: grid;
452
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
453
+ gap: 20px;
454
+ margin-bottom: 30px;
455
+ }
456
+ .stat-card {
457
+ background: var(--bg-card);
458
+ padding: 20px;
459
+ border-radius: 8px;
460
+ box-shadow: var(--shadow);
461
+ }
462
+ .stat-value { font-size: 2rem; font-weight: bold; color: var(--accent-color); }
463
+ .stat-label { color: var(--text-secondary); font-size: 0.9rem; }
464
+ .section { margin-bottom: 40px; }
465
+ .section-title { font-size: 1.5rem; margin-bottom: 20px; }
466
+ .sessions-grid {
467
+ display: grid;
468
+ grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
469
+ gap: 20px;
470
+ }
471
+ .session-card {
472
+ background: var(--bg-card);
473
+ padding: 20px;
474
+ border-radius: 8px;
475
+ box-shadow: var(--shadow);
476
+ }
477
+ .session-title { font-size: 1.2rem; font-weight: 600; margin-bottom: 10px; }
478
+ .session-meta { color: var(--text-secondary); font-size: 0.9rem; }
479
+ .progress-bar {
480
+ width: 100%;
481
+ height: 8px;
482
+ background: var(--bg-primary);
483
+ border-radius: 4px;
484
+ margin: 15px 0;
485
+ overflow: hidden;
486
+ }
487
+ .progress-fill {
488
+ height: 100%;
489
+ background: linear-gradient(90deg, var(--accent-color), var(--success-color));
490
+ }
491
+ .task-item {
492
+ display: flex;
493
+ align-items: center;
494
+ padding: 10px;
495
+ margin-bottom: 8px;
496
+ background: var(--bg-primary);
497
+ border-radius: 6px;
498
+ border-left: 3px solid var(--border-color);
499
+ }
500
+ .task-item.completed { border-left-color: var(--success-color); opacity: 0.8; }
501
+ .task-item.in_progress { border-left-color: var(--warning-color); }
502
+ .task-title { flex: 1; font-size: 0.9rem; }
503
+ .task-id { font-size: 0.75rem; color: var(--text-secondary); font-family: monospace; }
504
+ .empty-state { text-align: center; padding: 60px 20px; color: var(--text-secondary); }
505
+ .tabs { display: flex; gap: 10px; margin-top: 15px; }
506
+ .tab-btn {
507
+ padding: 10px 20px;
508
+ border: 1px solid var(--border-color);
509
+ border-radius: 6px;
510
+ background: var(--bg-card);
511
+ color: var(--text-primary);
512
+ cursor: pointer;
513
+ }
514
+ .tab-btn.active { background: var(--accent-color); color: white; border-color: var(--accent-color); }
515
+ .theme-toggle {
516
+ position: fixed;
517
+ bottom: 30px;
518
+ right: 30px;
519
+ width: 50px;
520
+ height: 50px;
521
+ border-radius: 50%;
522
+ background: var(--accent-color);
523
+ color: white;
524
+ border: none;
525
+ cursor: pointer;
526
+ font-size: 1.5rem;
527
+ box-shadow: var(--shadow);
528
+ }
529
+ </style>
530
+ </head>
531
+ <body>
532
+ <div class="container">
533
+ <header>
534
+ <h1>CCW Dashboard</h1>
535
+ <p style="color: var(--text-secondary);">Workflow Sessions and Reviews</p>
536
+ <div class="tabs">
537
+ <button class="tab-btn active" data-tab="workflow">Workflow</button>
538
+ ${hasReviews ? '<button class="tab-btn" data-tab="reviews">Reviews</button>' : ''}
539
+ </div>
540
+ </header>
541
+
542
+ <div id="workflowTab">
543
+ <div class="stats-grid">
544
+ <div class="stat-card">
545
+ <div class="stat-value">${stats.totalSessions}</div>
546
+ <div class="stat-label">Total Sessions</div>
547
+ </div>
548
+ <div class="stat-card">
549
+ <div class="stat-value">${stats.activeSessions}</div>
550
+ <div class="stat-label">Active Sessions</div>
551
+ </div>
552
+ <div class="stat-card">
553
+ <div class="stat-value">${stats.totalTasks}</div>
554
+ <div class="stat-label">Total Tasks</div>
555
+ </div>
556
+ <div class="stat-card">
557
+ <div class="stat-value">${stats.completedTasks}</div>
558
+ <div class="stat-label">Completed Tasks</div>
559
+ </div>
560
+ </div>
561
+
562
+ <div class="section">
563
+ <h2 class="section-title">Active Sessions</h2>
564
+ <div class="sessions-grid" id="activeSessions">
565
+ ${data.activeSessions.length === 0
566
+ ? '<div class="empty-state">No active sessions</div>'
567
+ : data.activeSessions.map(s => renderSessionCard(s, true)).join('')}
568
+ </div>
569
+ </div>
570
+
571
+ <div class="section">
572
+ <h2 class="section-title">Archived Sessions</h2>
573
+ <div class="sessions-grid" id="archivedSessions">
574
+ ${data.archivedSessions.length === 0
575
+ ? '<div class="empty-state">No archived sessions</div>'
576
+ : data.archivedSessions.map(s => renderSessionCard(s, false)).join('')}
577
+ </div>
578
+ </div>
579
+ </div>
580
+
581
+ ${hasReviews ? renderReviewTab(data.reviewData) : ''}
582
+ </div>
583
+
584
+ <button class="theme-toggle" onclick="toggleTheme()">🌙</button>
585
+
586
+ <script>
587
+ function toggleTheme() {
588
+ const html = document.documentElement;
589
+ const current = html.getAttribute('data-theme');
590
+ const next = current === 'dark' ? 'light' : 'dark';
591
+ html.setAttribute('data-theme', next);
592
+ localStorage.setItem('theme', next);
593
+ document.querySelector('.theme-toggle').textContent = next === 'dark' ? '☀️' : '🌙';
594
+ }
595
+
596
+ // Initialize theme
597
+ const savedTheme = localStorage.getItem('theme') || 'light';
598
+ document.documentElement.setAttribute('data-theme', savedTheme);
599
+ document.querySelector('.theme-toggle').textContent = savedTheme === 'dark' ? '☀️' : '🌙';
600
+
601
+ // Tab switching
602
+ document.querySelectorAll('.tab-btn').forEach(btn => {
603
+ btn.addEventListener('click', () => {
604
+ document.querySelectorAll('.tab-btn').forEach(b => b.classList.remove('active'));
605
+ btn.classList.add('active');
606
+
607
+ const tab = btn.dataset.tab;
608
+ document.getElementById('workflowTab').style.display = tab === 'workflow' ? 'block' : 'none';
609
+ const reviewTab = document.getElementById('reviewsTab');
610
+ if (reviewTab) reviewTab.style.display = tab === 'reviews' ? 'block' : 'none';
611
+ });
612
+ });
613
+ </script>
614
+ </body>
615
+ </html>`;
616
+ }
617
+ /**
618
+ * Render a session card
619
+ * @param {Object} session - Session data
620
+ * @param {boolean} isActive - Whether session is active
621
+ * @returns {string} - HTML string
622
+ */
623
+ function renderSessionCard(session, isActive) {
624
+ const completedTasks = isActive
625
+ ? session.tasks.filter(t => t.status === 'completed').length
626
+ : session.taskCount;
627
+ const totalTasks = isActive ? session.tasks.length : session.taskCount;
628
+ const progress = totalTasks > 0 ? Math.round((completedTasks / totalTasks) * 100) : 0;
629
+ const tasksHtml = isActive && session.tasks.length > 0
630
+ ? session.tasks.map(t => `
631
+ <div class="task-item ${t.status}">
632
+ <div class="task-title">${t.title}</div>
633
+ <span class="task-id">${t.task_id}</span>
634
+ </div>
635
+ `).join('')
636
+ : '';
637
+ return `
638
+ <div class="session-card">
639
+ <div class="session-title">${session.session_id}</div>
640
+ <div class="session-meta">
641
+ ${session.project ? `<div>${session.project}</div>` : ''}
642
+ <div>${session.created_at} | ${completedTasks}/${totalTasks} tasks</div>
643
+ </div>
644
+ ${totalTasks > 0 ? `
645
+ <div class="progress-bar">
646
+ <div class="progress-fill" style="width: ${progress}%"></div>
647
+ </div>
648
+ ` : ''}
649
+ ${tasksHtml}
650
+ </div>
651
+ `;
652
+ }
653
+ /**
654
+ * Render review tab HTML
655
+ * @param {Object} reviewData - Review data
656
+ * @returns {string} - HTML string
657
+ */
658
+ function renderReviewTab(reviewData) {
659
+ const { severityDistribution, dimensionSummary } = reviewData;
660
+ return `
661
+ <div id="reviewsTab" style="display: none;">
662
+ <div class="stats-grid">
663
+ <div class="stat-card">
664
+ <div class="stat-value" style="color: #c53030;">${severityDistribution.critical}</div>
665
+ <div class="stat-label">Critical</div>
666
+ </div>
667
+ <div class="stat-card">
668
+ <div class="stat-value" style="color: #f56565;">${severityDistribution.high}</div>
669
+ <div class="stat-label">High</div>
670
+ </div>
671
+ <div class="stat-card">
672
+ <div class="stat-value" style="color: #ed8936;">${severityDistribution.medium}</div>
673
+ <div class="stat-label">Medium</div>
674
+ </div>
675
+ <div class="stat-card">
676
+ <div class="stat-value" style="color: #48bb78;">${severityDistribution.low}</div>
677
+ <div class="stat-label">Low</div>
678
+ </div>
679
+ </div>
680
+
681
+ <div class="section">
682
+ <h2 class="section-title">Findings by Dimension</h2>
683
+ <div class="sessions-grid">
684
+ ${Object.entries(dimensionSummary).map(([name, info]) => `
685
+ <div class="session-card">
686
+ <div class="session-title" style="text-transform: capitalize;">${name}</div>
687
+ <div class="session-meta">${info.count} findings</div>
688
+ </div>
689
+ `).join('')}
690
+ </div>
691
+ </div>
692
+ </div>
693
+ `;
694
+ }
695
+ //# sourceMappingURL=dashboard-generator.js.map