claude-code-workflow 6.1.4 → 6.2.2

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 (437) hide show
  1. package/.claude/CLAUDE.md +10 -0
  2. package/.claude/agents/action-planning-agent.md +857 -778
  3. package/.claude/agents/cli-execution-agent.md +266 -269
  4. package/.claude/agents/cli-explore-agent.md +2 -2
  5. package/.claude/agents/cli-lite-planning-agent.md +142 -92
  6. package/.claude/agents/cli-planning-agent.md +4 -4
  7. package/.claude/agents/code-developer.md +7 -6
  8. package/.claude/agents/conceptual-planning-agent.md +2 -2
  9. package/.claude/agents/context-search-agent.md +31 -32
  10. package/.claude/agents/doc-generator.md +4 -4
  11. package/.claude/agents/memory-bridge.md +93 -93
  12. package/.claude/agents/test-context-search-agent.md +8 -7
  13. package/.claude/agents/test-fix-agent.md +7 -6
  14. package/.claude/commands/clean.md +516 -0
  15. package/.claude/commands/memory/compact.md +383 -0
  16. package/.claude/commands/memory/docs-full-cli.md +471 -471
  17. package/.claude/commands/memory/docs-related-cli.md +386 -386
  18. package/.claude/commands/memory/docs.md +615 -615
  19. package/.claude/commands/memory/load.md +5 -5
  20. package/.claude/commands/memory/tech-research-rules.md +310 -0
  21. package/.claude/commands/memory/update-full.md +332 -332
  22. package/.claude/commands/memory/workflow-skill-memory.md +4 -4
  23. package/.claude/commands/task/create.md +151 -151
  24. package/.claude/commands/version.md +254 -254
  25. package/.claude/commands/workflow/brainstorm/api-designer.md +587 -585
  26. package/.claude/commands/workflow/brainstorm/artifacts.md +1 -0
  27. package/.claude/commands/workflow/brainstorm/auto-parallel.md +443 -443
  28. package/.claude/commands/workflow/brainstorm/data-architect.md +220 -220
  29. package/.claude/commands/workflow/brainstorm/product-manager.md +200 -200
  30. package/.claude/commands/workflow/brainstorm/product-owner.md +200 -200
  31. package/.claude/commands/workflow/brainstorm/scrum-master.md +200 -200
  32. package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
  33. package/.claude/commands/workflow/brainstorm/system-architect.md +389 -387
  34. package/.claude/commands/workflow/brainstorm/ui-designer.md +221 -221
  35. package/.claude/commands/workflow/brainstorm/ux-expert.md +221 -221
  36. package/.claude/commands/workflow/debug.md +321 -0
  37. package/.claude/commands/workflow/execute.md +13 -0
  38. package/.claude/commands/workflow/init.md +165 -164
  39. package/.claude/commands/workflow/lite-execute.md +119 -13
  40. package/.claude/commands/workflow/lite-fix.md +623 -621
  41. package/.claude/commands/workflow/lite-plan.md +610 -592
  42. package/.claude/commands/workflow/plan.md +5 -5
  43. package/.claude/commands/workflow/review-module-cycle.md +2 -0
  44. package/.claude/commands/workflow/review-session-cycle.md +2 -0
  45. package/.claude/commands/workflow/review.md +297 -291
  46. package/.claude/commands/workflow/session/complete.md +153 -500
  47. package/.claude/commands/workflow/session/list.md +95 -95
  48. package/.claude/commands/workflow/session/resume.md +60 -60
  49. package/.claude/commands/workflow/session/start.md +199 -199
  50. package/.claude/commands/workflow/tdd-plan.md +3 -3
  51. package/.claude/commands/workflow/tdd-verify.md +23 -9
  52. package/.claude/commands/workflow/test-cycle-execute.md +2 -0
  53. package/.claude/commands/workflow/test-fix-gen.md +699 -699
  54. package/.claude/commands/workflow/tools/conflict-resolution.md +104 -18
  55. package/.claude/commands/workflow/tools/context-gather.md +436 -434
  56. package/.claude/commands/workflow/tools/task-generate-agent.md +490 -291
  57. package/.claude/commands/workflow/tools/task-generate-tdd.md +18 -10
  58. package/.claude/commands/workflow/tools/test-concept-enhanced.md +2 -1
  59. package/.claude/commands/workflow/tools/test-context-gather.md +1 -0
  60. package/.claude/commands/workflow/tools/test-task-generate.md +1 -0
  61. package/.claude/commands/workflow/ui-design/import-from-code.md +9 -6
  62. package/.claude/skills/command-guide/SKILL.md +5 -5
  63. package/.claude/skills/command-guide/index/all-commands.json +1 -1
  64. package/.claude/skills/command-guide/index/by-category.json +1 -1
  65. package/.claude/skills/command-guide/index/by-use-case.json +1 -1
  66. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +857 -778
  67. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +266 -269
  68. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +2 -2
  69. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +142 -92
  70. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +4 -4
  71. package/.claude/skills/command-guide/reference/agents/code-developer.md +7 -6
  72. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +2 -2
  73. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +31 -32
  74. package/.claude/skills/command-guide/reference/agents/doc-generator.md +4 -4
  75. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
  76. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +8 -7
  77. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +7 -6
  78. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
  79. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
  80. package/.claude/skills/command-guide/reference/commands/memory/docs.md +17 -16
  81. package/.claude/skills/command-guide/reference/commands/memory/load.md +5 -5
  82. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +194 -357
  83. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
  84. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +4 -4
  85. package/.claude/skills/command-guide/reference/commands/task/create.md +151 -151
  86. package/.claude/skills/command-guide/reference/commands/version.md +254 -254
  87. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +585 -585
  88. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +443 -443
  89. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +220 -220
  90. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +200 -200
  91. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +200 -200
  92. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +200 -200
  93. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
  94. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +387 -387
  95. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +221 -221
  96. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +221 -221
  97. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +25 -20
  98. package/.claude/skills/command-guide/reference/commands/workflow/init.md +164 -164
  99. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +748 -686
  100. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +664 -621
  101. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +645 -592
  102. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +5 -5
  103. package/.claude/skills/command-guide/reference/commands/workflow/review.md +25 -18
  104. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +547 -500
  105. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +45 -27
  106. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +35 -19
  107. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +90 -33
  108. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +3 -3
  109. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +23 -9
  110. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +699 -699
  111. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +103 -17
  112. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
  113. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +487 -291
  114. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +17 -10
  115. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +1 -1
  116. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +6 -6
  117. package/.claude/workflows/chinese-response.md +38 -0
  118. package/.claude/workflows/cli-templates/prompts/rules/rule-api.txt +122 -0
  119. package/.claude/workflows/cli-templates/prompts/rules/rule-components.txt +122 -0
  120. package/.claude/workflows/cli-templates/prompts/rules/rule-config.txt +89 -0
  121. package/.claude/workflows/cli-templates/prompts/rules/rule-core.txt +60 -0
  122. package/.claude/workflows/cli-templates/prompts/rules/rule-patterns.txt +70 -0
  123. package/.claude/workflows/cli-templates/prompts/rules/rule-testing.txt +81 -0
  124. package/.claude/workflows/cli-templates/prompts/rules/tech-rules-agent-prompt.txt +89 -0
  125. package/.claude/workflows/cli-templates/prompts/workflow/gemini-solution-design.txt +131 -131
  126. package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +5 -9
  127. package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +5 -9
  128. package/.claude/workflows/cli-templates/protocols/analysis-protocol.md +112 -0
  129. package/.claude/workflows/cli-templates/protocols/write-protocol.md +201 -0
  130. package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +137 -0
  131. package/.claude/workflows/cli-templates/schemas/debug-log-json-schema.json +127 -0
  132. package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +25 -0
  133. package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +25 -0
  134. package/.claude/workflows/cli-tools-usage.md +526 -0
  135. package/{CLAUDE.md → .claude/workflows/coding-philosophy.md} +24 -45
  136. package/.claude/workflows/context-tools.md +84 -0
  137. package/.claude/workflows/file-modification.md +64 -0
  138. package/.claude/workflows/tool-strategy.md +216 -79
  139. package/.claude/workflows/windows-platform.md +16 -0
  140. package/.claude/workflows/workflow-architecture.md +942 -942
  141. package/.codex/AGENTS.md +63 -330
  142. package/.codex/prompts/debug.md +318 -0
  143. package/.codex/prompts/execute.md +273 -0
  144. package/.codex/prompts/lite-execute.md +164 -0
  145. package/.codex/prompts/lite-plan.md +469 -0
  146. package/.codex/prompts.zip +0 -0
  147. package/.gemini/GEMINI.md +25 -164
  148. package/.qwen/QWEN.md +0 -139
  149. package/README.md +29 -9
  150. package/ccw/README.md +30 -6
  151. package/ccw/bin/ccw-mcp.js +7 -0
  152. package/ccw/bin/ccw.js +9 -9
  153. package/ccw/package.json +65 -47
  154. package/ccw/src/.workflow/.cli-history/history.db +0 -0
  155. package/ccw/src/.workflow/.cli-history/history.db-shm +0 -0
  156. package/ccw/src/.workflow/.cli-history/history.db-wal +0 -0
  157. package/ccw/src/cli.ts +244 -0
  158. package/ccw/src/commands/cli.ts +740 -0
  159. package/ccw/src/commands/core-memory.ts +770 -0
  160. package/ccw/src/commands/hook.ts +315 -0
  161. package/ccw/src/commands/install.ts +519 -0
  162. package/ccw/src/commands/{list.js → list.ts} +1 -1
  163. package/ccw/src/commands/memory.ts +1090 -0
  164. package/ccw/src/commands/{serve.js → serve.ts} +14 -5
  165. package/ccw/src/commands/session-path-resolver.ts +372 -0
  166. package/ccw/src/commands/session.ts +1141 -0
  167. package/ccw/src/commands/{stop.js → stop.ts} +16 -6
  168. package/ccw/src/commands/tool.ts +201 -0
  169. package/ccw/src/commands/{uninstall.js → uninstall.ts} +89 -40
  170. package/ccw/src/commands/{upgrade.js → upgrade.ts} +68 -23
  171. package/ccw/src/commands/{view.js → view.ts} +22 -8
  172. package/ccw/src/config/storage-paths.ts +670 -0
  173. package/ccw/src/core/cache-manager.ts +294 -0
  174. package/ccw/src/core/claude-freshness.ts +319 -0
  175. package/ccw/src/core/core-memory-store.ts +1528 -0
  176. package/ccw/src/core/{dashboard-generator-patch.js → dashboard-generator-patch.ts} +18 -0
  177. package/ccw/src/core/{dashboard-generator.js → dashboard-generator.ts} +69 -12
  178. package/ccw/src/core/data-aggregator.ts +584 -0
  179. package/ccw/src/core/history-importer.ts +625 -0
  180. package/ccw/src/core/{lite-scanner.js → lite-scanner-complete.ts} +162 -66
  181. package/ccw/src/core/lite-scanner.ts +469 -0
  182. package/ccw/src/core/{manifest.js → manifest.ts} +104 -34
  183. package/ccw/src/core/memory-embedder-bridge.ts +262 -0
  184. package/ccw/src/core/memory-store.ts +978 -0
  185. package/ccw/src/core/routes/ccw-routes.ts +96 -0
  186. package/ccw/src/core/routes/claude-routes.ts +1183 -0
  187. package/ccw/src/core/routes/cli-routes.ts +561 -0
  188. package/ccw/src/core/routes/codexlens-routes.ts +806 -0
  189. package/ccw/src/core/routes/core-memory-routes.ts +605 -0
  190. package/ccw/src/core/routes/files-routes.ts +428 -0
  191. package/ccw/src/core/routes/graph-routes.md +164 -0
  192. package/ccw/src/core/routes/graph-routes.ts +626 -0
  193. package/ccw/src/core/routes/help-routes.ts +308 -0
  194. package/ccw/src/core/routes/hooks-routes.ts +405 -0
  195. package/ccw/src/core/routes/mcp-routes.ts +1271 -0
  196. package/ccw/src/core/routes/mcp-routes.ts.backup +550 -0
  197. package/ccw/src/core/routes/mcp-templates-db.ts +268 -0
  198. package/ccw/src/core/routes/memory-routes.ts +1206 -0
  199. package/ccw/src/core/routes/rules-routes.ts +526 -0
  200. package/ccw/src/core/routes/session-routes.ts +467 -0
  201. package/ccw/src/core/routes/skills-routes.ts +599 -0
  202. package/ccw/src/core/routes/status-routes.ts +57 -0
  203. package/ccw/src/core/routes/system-routes.ts +427 -0
  204. package/ccw/src/core/server.ts +431 -0
  205. package/ccw/src/core/session-clustering-service.ts +1258 -0
  206. package/ccw/src/core/session-scanner.ts +283 -0
  207. package/ccw/src/core/websocket.ts +190 -0
  208. package/ccw/src/{index.js → index.ts} +1 -0
  209. package/ccw/src/mcp-server/index.ts +186 -0
  210. package/ccw/src/templates/assets/css/github-dark.min.css +10 -0
  211. package/ccw/src/templates/assets/css/github.min.css +10 -0
  212. package/ccw/src/templates/assets/js/cytoscape.min.js +32 -0
  213. package/ccw/src/templates/assets/js/d3.min.js +2 -0
  214. package/ccw/src/templates/assets/js/highlight.min.js +1244 -0
  215. package/ccw/src/templates/assets/js/lucide.min.js +12 -0
  216. package/ccw/src/templates/assets/js/marked.min.js +69 -0
  217. package/ccw/src/templates/assets/js/tailwind.js +83 -0
  218. package/ccw/src/templates/dashboard-css/01-base.css +11 -0
  219. package/ccw/src/templates/dashboard-css/02-session.css +22 -0
  220. package/ccw/src/templates/dashboard-css/04-lite-tasks.css +10 -0
  221. package/ccw/src/templates/dashboard-css/06-cards.css +10 -4
  222. package/ccw/src/templates/dashboard-css/07-managers.css +1178 -7
  223. package/ccw/src/templates/dashboard-css/09-explorer.css +23 -12
  224. package/ccw/src/templates/dashboard-css/10-cli-status.css +337 -0
  225. package/ccw/src/templates/dashboard-css/11-cli-history.css +271 -0
  226. package/ccw/src/templates/dashboard-css/12-cli-legacy.css +796 -0
  227. package/ccw/src/templates/dashboard-css/13-cli-ccw.css +199 -0
  228. package/ccw/src/templates/dashboard-css/14-cli-modals.css +258 -0
  229. package/ccw/src/templates/dashboard-css/15-cli-endpoints.css +305 -0
  230. package/ccw/src/templates/dashboard-css/16-cli-session.css +241 -0
  231. package/ccw/src/templates/dashboard-css/17-cli-conversation.css +283 -0
  232. package/ccw/src/templates/dashboard-css/18-cli-settings.css +160 -0
  233. package/ccw/src/templates/dashboard-css/19-cli-native-session.css +496 -0
  234. package/ccw/src/templates/dashboard-css/20-cli-taskqueue.css +188 -0
  235. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +310 -0
  236. package/ccw/src/templates/dashboard-css/22-cli-semantic.css +240 -0
  237. package/ccw/src/templates/dashboard-css/23-memory.css +2390 -0
  238. package/ccw/src/templates/dashboard-css/24-prompt-history.css +1089 -0
  239. package/ccw/src/templates/dashboard-css/25-skills-rules.css +326 -0
  240. package/ccw/src/templates/dashboard-css/26-claude-manager.css +908 -0
  241. package/ccw/src/templates/dashboard-css/27-graph-explorer.css +1678 -0
  242. package/ccw/src/templates/dashboard-css/28-mcp-manager.css +748 -0
  243. package/ccw/src/templates/dashboard-css/29-help.css +264 -0
  244. package/ccw/src/templates/dashboard-css/30-core-memory.css +1700 -0
  245. package/ccw/src/templates/dashboard-js/api.js +162 -142
  246. package/ccw/src/templates/dashboard-js/components/carousel.js +4 -4
  247. package/ccw/src/templates/dashboard-js/components/cli-history.js +876 -0
  248. package/ccw/src/templates/dashboard-js/components/cli-status.js +978 -0
  249. package/ccw/src/templates/dashboard-js/components/global-notifications.js +508 -219
  250. package/ccw/src/templates/dashboard-js/components/hook-manager.js +1277 -282
  251. package/ccw/src/templates/dashboard-js/components/index-manager.js +302 -0
  252. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +718 -27
  253. package/ccw/src/templates/dashboard-js/components/modals.js +66 -0
  254. package/ccw/src/templates/dashboard-js/components/navigation.js +80 -12
  255. package/ccw/src/templates/dashboard-js/components/notifications.js +758 -194
  256. package/ccw/src/templates/dashboard-js/components/storage-manager.js +478 -0
  257. package/ccw/src/templates/dashboard-js/components/tabs-other.js +157 -6
  258. package/ccw/src/templates/dashboard-js/components/task-queue-sidebar.js +716 -0
  259. package/ccw/src/templates/dashboard-js/help-i18n.js +272 -0
  260. package/ccw/src/templates/dashboard-js/i18n.js +2807 -0
  261. package/ccw/src/templates/dashboard-js/main.js +15 -0
  262. package/ccw/src/templates/dashboard-js/state.js +243 -42
  263. package/ccw/src/templates/dashboard-js/utils.js +47 -1
  264. package/ccw/src/templates/dashboard-js/views/claude-manager.js +912 -0
  265. package/ccw/src/templates/dashboard-js/views/cli-manager.js +2272 -0
  266. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +964 -0
  267. package/ccw/src/templates/dashboard-js/views/core-memory-clusters.js +503 -0
  268. package/ccw/src/templates/dashboard-js/views/core-memory.js +782 -0
  269. package/ccw/src/templates/dashboard-js/views/explorer.js +888 -852
  270. package/ccw/src/templates/dashboard-js/views/graph-explorer.js +1157 -0
  271. package/ccw/src/templates/dashboard-js/views/help.js +856 -0
  272. package/ccw/src/templates/dashboard-js/views/history.js +337 -0
  273. package/ccw/src/templates/dashboard-js/views/home.js +61 -15
  274. package/ccw/src/templates/dashboard-js/views/hook-manager.js +311 -43
  275. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +204 -28
  276. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +2187 -411
  277. package/ccw/src/templates/dashboard-js/views/mcp-manager.js.backup +1729 -0
  278. package/ccw/src/templates/dashboard-js/views/mcp-manager.js.new +928 -0
  279. package/ccw/src/templates/dashboard-js/views/memory.js +1221 -0
  280. package/ccw/src/templates/dashboard-js/views/prompt-history.js +713 -0
  281. package/ccw/src/templates/dashboard-js/views/rules-manager.js +828 -0
  282. package/ccw/src/templates/dashboard-js/views/session-detail.js +54 -53
  283. package/ccw/src/templates/dashboard-js/views/skills-manager.js +819 -0
  284. package/ccw/src/templates/dashboard.html +185 -85
  285. package/ccw/src/templates/hooks-config-example.json +60 -0
  286. package/ccw/src/tools/classify-folders.ts +245 -0
  287. package/ccw/src/tools/cli-config-manager.ts +268 -0
  288. package/ccw/src/tools/cli-executor.ts +2014 -0
  289. package/ccw/src/tools/cli-history-store.ts +1195 -0
  290. package/ccw/src/tools/codex-lens.ts +1141 -0
  291. package/ccw/src/tools/{convert-tokens-to-css.js → convert-tokens-to-css.ts} +73 -23
  292. package/ccw/src/tools/core-memory.ts +444 -0
  293. package/ccw/src/tools/detect-changed-modules.ts +325 -0
  294. package/ccw/src/tools/{discover-design-files.js → discover-design-files.ts} +74 -24
  295. package/ccw/src/tools/edit-file.ts +568 -0
  296. package/ccw/src/tools/{generate-module-docs.js → generate-module-docs.ts} +207 -185
  297. package/ccw/src/tools/{get-modules-by-depth.js → get-modules-by-depth.ts} +120 -79
  298. package/ccw/src/tools/index.ts +370 -0
  299. package/ccw/src/tools/native-session-discovery.ts +795 -0
  300. package/ccw/src/tools/notifier.ts +129 -0
  301. package/ccw/src/tools/read-file.ts +410 -0
  302. package/ccw/src/tools/resume-strategy.ts +345 -0
  303. package/ccw/src/tools/session-content-parser.ts +619 -0
  304. package/ccw/src/tools/session-manager.ts +1026 -0
  305. package/ccw/src/tools/smart-context.ts +228 -0
  306. package/ccw/src/tools/smart-search.ts +2065 -0
  307. package/ccw/src/tools/smart-search.ts.backup +1233 -0
  308. package/ccw/src/tools/storage-manager.ts +455 -0
  309. package/ccw/src/tools/write-file.ts +222 -0
  310. package/ccw/src/types/config.ts +11 -0
  311. package/ccw/src/types/index.ts +3 -0
  312. package/ccw/src/types/session.ts +25 -0
  313. package/ccw/src/types/tool.ts +41 -0
  314. package/ccw/src/utils/{browser-launcher.js → browser-launcher.ts} +10 -8
  315. package/ccw/src/utils/file-utils.ts +48 -0
  316. package/ccw/src/utils/{path-resolver.js → path-resolver.ts} +114 -78
  317. package/ccw/src/utils/path-validator.ts +153 -0
  318. package/ccw/src/utils/{ui.js → ui.ts} +32 -25
  319. package/codex-lens/pyproject.toml +48 -0
  320. package/codex-lens/src/codexlens/.workflow/.cli-history/history.db +0 -0
  321. package/codex-lens/src/codexlens/__init__.py +28 -0
  322. package/codex-lens/src/codexlens/__main__.py +14 -0
  323. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-313.pyc +0 -0
  324. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-313.pyc +0 -0
  325. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  326. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  327. package/codex-lens/src/codexlens/__pycache__/errors.cpython-313.pyc +0 -0
  328. package/codex-lens/src/codexlens/cli/__init__.py +27 -0
  329. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-313.pyc +0 -0
  330. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  331. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  332. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  333. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-313.pyc +0 -0
  334. package/codex-lens/src/codexlens/cli/commands.py +1931 -0
  335. package/codex-lens/src/codexlens/cli/embedding_manager.py +620 -0
  336. package/codex-lens/src/codexlens/cli/model_manager.py +289 -0
  337. package/codex-lens/src/codexlens/cli/output.py +124 -0
  338. package/codex-lens/src/codexlens/config.py +201 -0
  339. package/codex-lens/src/codexlens/entities.py +121 -0
  340. package/codex-lens/src/codexlens/errors.py +55 -0
  341. package/codex-lens/src/codexlens/indexing/README.md +77 -0
  342. package/codex-lens/src/codexlens/indexing/__init__.py +4 -0
  343. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  344. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  345. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +243 -0
  346. package/codex-lens/src/codexlens/parsers/__init__.py +8 -0
  347. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
  348. package/codex-lens/src/codexlens/parsers/__pycache__/encoding.cpython-313.pyc +0 -0
  349. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  350. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-313.pyc +0 -0
  351. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  352. package/codex-lens/src/codexlens/parsers/encoding.py +202 -0
  353. package/codex-lens/src/codexlens/parsers/factory.py +256 -0
  354. package/codex-lens/src/codexlens/parsers/tokenizer.py +98 -0
  355. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +335 -0
  356. package/codex-lens/src/codexlens/search/__init__.py +15 -0
  357. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-313.pyc +0 -0
  358. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  359. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  360. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  361. package/codex-lens/src/codexlens/search/__pycache__/query_parser.cpython-313.pyc +0 -0
  362. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  363. package/codex-lens/src/codexlens/search/chain_search.py +647 -0
  364. package/codex-lens/src/codexlens/search/enrichment.py +150 -0
  365. package/codex-lens/src/codexlens/search/hybrid_search.py +313 -0
  366. package/codex-lens/src/codexlens/search/query_parser.py +242 -0
  367. package/codex-lens/src/codexlens/search/ranking.py +274 -0
  368. package/codex-lens/src/codexlens/semantic/__init__.py +39 -0
  369. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-313.pyc +0 -0
  370. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  371. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
  372. package/codex-lens/src/codexlens/semantic/__pycache__/code_extractor.cpython-313.pyc +0 -0
  373. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-313.pyc +0 -0
  374. package/codex-lens/src/codexlens/semantic/__pycache__/graph_analyzer.cpython-313.pyc +0 -0
  375. package/codex-lens/src/codexlens/semantic/__pycache__/llm_enhancer.cpython-313.pyc +0 -0
  376. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  377. package/codex-lens/src/codexlens/semantic/ann_index.py +414 -0
  378. package/codex-lens/src/codexlens/semantic/chunker.py +448 -0
  379. package/codex-lens/src/codexlens/semantic/code_extractor.py +274 -0
  380. package/codex-lens/src/codexlens/semantic/embedder.py +185 -0
  381. package/codex-lens/src/codexlens/semantic/vector_store.py +955 -0
  382. package/codex-lens/src/codexlens/storage/__init__.py +29 -0
  383. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  384. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  385. package/codex-lens/src/codexlens/storage/__pycache__/file_cache.cpython-313.pyc +0 -0
  386. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  387. package/codex-lens/src/codexlens/storage/__pycache__/migration_manager.cpython-313.pyc +0 -0
  388. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-313.pyc +0 -0
  389. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-313.pyc +0 -0
  390. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  391. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-313.pyc +0 -0
  392. package/codex-lens/src/codexlens/storage/dir_index.py +1850 -0
  393. package/codex-lens/src/codexlens/storage/file_cache.py +32 -0
  394. package/codex-lens/src/codexlens/storage/index_tree.py +776 -0
  395. package/codex-lens/src/codexlens/storage/migration_manager.py +154 -0
  396. package/codex-lens/src/codexlens/storage/migrations/__init__.py +1 -0
  397. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  398. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_001_normalize_keywords.cpython-313.pyc +0 -0
  399. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_002_add_token_metadata.cpython-313.pyc +0 -0
  400. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_003_code_relationships.cpython-313.pyc +0 -0
  401. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_004_dual_fts.cpython-313.pyc +0 -0
  402. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_005_cleanup_unused_fields.cpython-313.pyc +0 -0
  403. package/codex-lens/src/codexlens/storage/migrations/migration_001_normalize_keywords.py +123 -0
  404. package/codex-lens/src/codexlens/storage/migrations/migration_002_add_token_metadata.py +48 -0
  405. package/codex-lens/src/codexlens/storage/migrations/migration_004_dual_fts.py +232 -0
  406. package/codex-lens/src/codexlens/storage/migrations/migration_005_cleanup_unused_fields.py +196 -0
  407. package/codex-lens/src/codexlens/storage/path_mapper.py +274 -0
  408. package/codex-lens/src/codexlens/storage/registry.py +670 -0
  409. package/codex-lens/src/codexlens/storage/sqlite_store.py +576 -0
  410. package/codex-lens/src/codexlens/storage/sqlite_utils.py +64 -0
  411. package/package.json +4 -1
  412. package/.claude/commands/memory/tech-research.md +0 -477
  413. package/.claude/scripts/classify-folders.sh +0 -39
  414. package/.claude/scripts/convert_tokens_to_css.sh +0 -229
  415. package/.claude/scripts/detect_changed_modules.sh +0 -161
  416. package/.claude/scripts/discover-design-files.sh +0 -87
  417. package/.claude/scripts/extract-animations.js +0 -243
  418. package/.claude/scripts/extract-computed-styles.js +0 -118
  419. package/.claude/scripts/extract-layout-structure.js +0 -411
  420. package/.claude/scripts/generate_module_docs.sh +0 -717
  421. package/.claude/scripts/get_modules_by_depth.sh +0 -170
  422. package/.claude/scripts/ui-generate-preview.sh +0 -395
  423. package/.claude/scripts/ui-instantiate-prototypes.sh +0 -815
  424. package/.claude/scripts/update_module_claude.sh +0 -337
  425. package/.claude/workflows/context-search-strategy.md +0 -77
  426. package/.claude/workflows/intelligent-tools-strategy.md +0 -662
  427. package/ccw/src/cli.js +0 -119
  428. package/ccw/src/commands/install.js +0 -324
  429. package/ccw/src/commands/tool.js +0 -138
  430. package/ccw/src/core/data-aggregator.js +0 -409
  431. package/ccw/src/core/server.js +0 -2063
  432. package/ccw/src/core/session-scanner.js +0 -235
  433. package/ccw/src/tools/classify-folders.js +0 -204
  434. package/ccw/src/tools/detect-changed-modules.js +0 -288
  435. package/ccw/src/tools/edit-file.js +0 -266
  436. package/ccw/src/tools/index.js +0 -176
  437. package/ccw/src/utils/file-utils.js +0 -48
@@ -1,194 +1,758 @@
1
- // ==========================================
2
- // NOTIFICATIONS COMPONENT
3
- // ==========================================
4
- // Real-time silent refresh (no notification bubbles)
5
-
6
- let wsConnection = null;
7
- let autoRefreshInterval = null;
8
- let lastDataHash = null;
9
- const AUTO_REFRESH_INTERVAL_MS = 30000; // 30 seconds
10
-
11
- // ========== WebSocket Connection ==========
12
- function initWebSocket() {
13
- const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
14
- const wsUrl = `${protocol}//${window.location.host}/ws`;
15
-
16
- try {
17
- wsConnection = new WebSocket(wsUrl);
18
-
19
- wsConnection.onopen = () => {
20
- console.log('[WS] Connected');
21
- };
22
-
23
- wsConnection.onmessage = (event) => {
24
- try {
25
- const data = JSON.parse(event.data);
26
- handleNotification(data);
27
- } catch (e) {
28
- console.error('[WS] Failed to parse message:', e);
29
- }
30
- };
31
-
32
- wsConnection.onclose = () => {
33
- console.log('[WS] Disconnected, reconnecting in 5s...');
34
- setTimeout(initWebSocket, 5000);
35
- };
36
-
37
- wsConnection.onerror = (error) => {
38
- console.error('[WS] Error:', error);
39
- };
40
- } catch (e) {
41
- console.log('[WS] WebSocket not available, using polling');
42
- }
43
- }
44
-
45
- // ========== Notification Handler ==========
46
- function handleNotification(data) {
47
- const { type, payload } = data;
48
-
49
- // Silent refresh - no notification bubbles
50
- switch (type) {
51
- case 'session_updated':
52
- case 'summary_written':
53
- case 'task_completed':
54
- case 'new_session':
55
- // Just refresh data silently
56
- refreshIfNeeded();
57
- // Optionally highlight in carousel if it's the current session
58
- if (payload.sessionId && typeof carouselGoTo === 'function') {
59
- carouselGoTo(payload.sessionId);
60
- }
61
- break;
62
-
63
- default:
64
- console.log('[WS] Unknown notification type:', type);
65
- }
66
- }
67
-
68
- // ========== Auto Refresh ==========
69
- function initAutoRefresh() {
70
- // Calculate initial hash
71
- lastDataHash = calculateDataHash();
72
-
73
- // Start polling interval
74
- autoRefreshInterval = setInterval(checkForChanges, AUTO_REFRESH_INTERVAL_MS);
75
- }
76
-
77
- function calculateDataHash() {
78
- if (!workflowData) return null;
79
-
80
- // Simple hash based on key data points
81
- const hashData = {
82
- activeSessions: (workflowData.activeSessions || []).length,
83
- archivedSessions: (workflowData.archivedSessions || []).length,
84
- totalTasks: workflowData.statistics?.totalTasks || 0,
85
- completedTasks: workflowData.statistics?.completedTasks || 0,
86
- generatedAt: workflowData.generatedAt
87
- };
88
-
89
- return JSON.stringify(hashData);
90
- }
91
-
92
- async function checkForChanges() {
93
- if (!window.SERVER_MODE) return;
94
-
95
- try {
96
- const response = await fetch(`/api/data?path=${encodeURIComponent(projectPath)}`);
97
- if (!response.ok) return;
98
-
99
- const newData = await response.json();
100
- const newHash = JSON.stringify({
101
- activeSessions: (newData.activeSessions || []).length,
102
- archivedSessions: (newData.archivedSessions || []).length,
103
- totalTasks: newData.statistics?.totalTasks || 0,
104
- completedTasks: newData.statistics?.completedTasks || 0,
105
- generatedAt: newData.generatedAt
106
- });
107
-
108
- if (newHash !== lastDataHash) {
109
- lastDataHash = newHash;
110
- // Silent refresh - no notification
111
- await refreshWorkspaceData(newData);
112
- }
113
- } catch (e) {
114
- console.error('[AutoRefresh] Check failed:', e);
115
- }
116
- }
117
-
118
- async function refreshIfNeeded() {
119
- if (!window.SERVER_MODE) return;
120
-
121
- try {
122
- const response = await fetch(`/api/data?path=${encodeURIComponent(projectPath)}`);
123
- if (!response.ok) return;
124
-
125
- const newData = await response.json();
126
- await refreshWorkspaceData(newData);
127
- } catch (e) {
128
- console.error('[Refresh] Failed:', e);
129
- }
130
- }
131
-
132
- async function refreshWorkspaceData(newData) {
133
- // Update global data
134
- window.workflowData = newData;
135
-
136
- // Clear and repopulate stores
137
- Object.keys(sessionDataStore).forEach(k => delete sessionDataStore[k]);
138
- Object.keys(liteTaskDataStore).forEach(k => delete liteTaskDataStore[k]);
139
-
140
- [...(newData.activeSessions || []), ...(newData.archivedSessions || [])].forEach(s => {
141
- const key = `session-${s.session_id}`.replace(/[^a-zA-Z0-9-]/g, '-');
142
- sessionDataStore[key] = s;
143
- });
144
-
145
- [...(newData.liteTasks?.litePlan || []), ...(newData.liteTasks?.liteFix || [])].forEach(s => {
146
- const key = `lite-${s.session_id}`.replace(/[^a-zA-Z0-9-]/g, '-');
147
- liteTaskDataStore[key] = s;
148
- });
149
-
150
- // Update UI silently
151
- updateStats();
152
- updateBadges();
153
- updateCarousel();
154
-
155
- // Re-render current view if needed
156
- if (currentView === 'sessions') {
157
- renderSessions();
158
- } else if (currentView === 'liteTasks') {
159
- renderLiteTasks();
160
- }
161
-
162
- lastDataHash = calculateDataHash();
163
- }
164
-
165
- // ========== Cleanup ==========
166
- function stopAutoRefresh() {
167
- if (autoRefreshInterval) {
168
- clearInterval(autoRefreshInterval);
169
- autoRefreshInterval = null;
170
- }
171
- }
172
-
173
- function closeWebSocket() {
174
- if (wsConnection) {
175
- wsConnection.close();
176
- wsConnection = null;
177
- }
178
- }
179
-
180
- // ========== Navigation Helper ==========
181
- function goToSession(sessionId) {
182
- // Find session in carousel and navigate
183
- const sessionKey = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
184
-
185
- // Jump to session in carousel if visible
186
- if (typeof carouselGoTo === 'function') {
187
- carouselGoTo(sessionId);
188
- }
189
-
190
- // Navigate to session detail
191
- if (sessionDataStore[sessionKey]) {
192
- showSessionDetailPage(sessionKey);
193
- }
194
- }
1
+ // ==========================================
2
+ // NOTIFICATIONS COMPONENT
3
+ // ==========================================
4
+ // Real-time silent refresh (no notification bubbles)
5
+
6
+ /**
7
+ * Format JSON object for display in notifications
8
+ * Parses JSON strings and formats objects into readable key-value pairs
9
+ * @param {Object|string} obj - Object or JSON string to format
10
+ * @param {number} maxLen - Max string length (unused, kept for compatibility)
11
+ * @returns {string} Formatted string with key: value pairs
12
+ */
13
+ function formatJsonDetails(obj, maxLen = 150) {
14
+ // Handle null/undefined
15
+ if (obj === null || obj === undefined) return '';
16
+
17
+ // If it is a string, try to parse as JSON
18
+ if (typeof obj === 'string') {
19
+ // Check if it looks like JSON
20
+ const trimmed = obj.trim();
21
+ if ((trimmed.startsWith('{') && trimmed.endsWith('}')) ||
22
+ (trimmed.startsWith('[') && trimmed.endsWith(']'))) {
23
+ try {
24
+ obj = JSON.parse(trimmed);
25
+ } catch (e) {
26
+ // Not valid JSON, return as-is
27
+ return obj;
28
+ }
29
+ } else {
30
+ // Plain string, return as-is
31
+ return obj;
32
+ }
33
+ }
34
+
35
+ // Handle non-objects (numbers, booleans, etc.)
36
+ if (typeof obj !== 'object') return String(obj);
37
+
38
+ // Handle arrays
39
+ if (Array.isArray(obj)) {
40
+ if (obj.length === 0) return '(empty array)';
41
+ return obj.slice(0, 5).map((item, i) => {
42
+ const itemStr = typeof item === 'object' ? JSON.stringify(item) : String(item);
43
+ return `[${i}] ${itemStr.length > 50 ? itemStr.substring(0, 47) + '...' : itemStr}`;
44
+ }).join('\n') + (obj.length > 5 ? `\n... +${obj.length - 5} more` : '');
45
+ }
46
+
47
+ // Handle objects - format as readable key: value pairs
48
+ try {
49
+ const entries = Object.entries(obj);
50
+ if (entries.length === 0) return '(empty object)';
51
+
52
+ // Format each entry with proper value display
53
+ const lines = entries.slice(0, 8).map(([key, val]) => {
54
+ let valStr;
55
+ if (val === null) {
56
+ valStr = 'null';
57
+ } else if (val === undefined) {
58
+ valStr = 'undefined';
59
+ } else if (typeof val === 'boolean') {
60
+ valStr = val ? 'true' : 'false';
61
+ } else if (typeof val === 'number') {
62
+ valStr = String(val);
63
+ } else if (typeof val === 'object') {
64
+ valStr = JSON.stringify(val);
65
+ if (valStr.length > 40) valStr = valStr.substring(0, 37) + '...';
66
+ } else {
67
+ valStr = String(val);
68
+ if (valStr.length > 50) valStr = valStr.substring(0, 47) + '...';
69
+ }
70
+ return `${key}: ${valStr}`;
71
+ });
72
+
73
+ if (entries.length > 8) {
74
+ lines.push(`... +${entries.length - 8} more fields`);
75
+ }
76
+
77
+ return lines.join('\n');
78
+ } catch (e) {
79
+ // Fallback to stringified version
80
+ const str = JSON.stringify(obj);
81
+ return str.length > 200 ? str.substring(0, 197) + '...' : str;
82
+ }
83
+ }
84
+
85
+ let wsConnection = null;
86
+ let autoRefreshInterval = null;
87
+ let lastDataHash = null;
88
+ const AUTO_REFRESH_INTERVAL_MS = 30000; // 30 seconds
89
+
90
+ // Custom event handlers registry for components to subscribe to specific events
91
+ const wsEventHandlers = {};
92
+
93
+ /**
94
+ * Register a custom handler for a specific WebSocket event type
95
+ * @param {string} eventType - The event type to listen for
96
+ * @param {Function} handler - The handler function
97
+ */
98
+ function registerWsEventHandler(eventType, handler) {
99
+ if (!wsEventHandlers[eventType]) {
100
+ wsEventHandlers[eventType] = [];
101
+ }
102
+ wsEventHandlers[eventType].push(handler);
103
+ }
104
+
105
+ /**
106
+ * Unregister a custom handler for a specific WebSocket event type
107
+ * @param {string} eventType - The event type
108
+ * @param {Function} handler - The handler function to remove
109
+ */
110
+ function unregisterWsEventHandler(eventType, handler) {
111
+ if (wsEventHandlers[eventType]) {
112
+ wsEventHandlers[eventType] = wsEventHandlers[eventType].filter(h => h !== handler);
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Dispatch event to registered handlers
118
+ * @param {string} eventType - The event type
119
+ * @param {Object} data - The full event data
120
+ */
121
+ function dispatchToEventHandlers(eventType, data) {
122
+ if (wsEventHandlers[eventType]) {
123
+ wsEventHandlers[eventType].forEach(handler => {
124
+ try {
125
+ handler(data);
126
+ } catch (e) {
127
+ console.error('[WS] Error in custom handler for', eventType, e);
128
+ }
129
+ });
130
+ }
131
+ }
132
+
133
+ // ========== WebSocket Connection ==========
134
+ function initWebSocket() {
135
+ const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
136
+ const wsUrl = `${protocol}//${window.location.host}/ws`;
137
+
138
+ try {
139
+ wsConnection = new WebSocket(wsUrl);
140
+
141
+ wsConnection.onopen = () => {
142
+ console.log('[WS] Connected');
143
+ };
144
+
145
+ wsConnection.onmessage = (event) => {
146
+ try {
147
+ const data = JSON.parse(event.data);
148
+ handleNotification(data);
149
+ } catch (e) {
150
+ console.error('[WS] Failed to parse message:', e);
151
+ }
152
+ };
153
+
154
+ wsConnection.onclose = () => {
155
+ console.log('[WS] Disconnected, reconnecting in 5s...');
156
+ setTimeout(initWebSocket, 5000);
157
+ };
158
+
159
+ wsConnection.onerror = (error) => {
160
+ console.error('[WS] Error:', error);
161
+ };
162
+ } catch (e) {
163
+ console.log('[WS] WebSocket not available, using polling');
164
+ }
165
+ }
166
+
167
+ // ========== Notification Handler ==========
168
+ function handleNotification(data) {
169
+ const { type, payload } = data;
170
+
171
+ // Silent refresh - no notification bubbles
172
+ switch (type) {
173
+ case 'session_updated':
174
+ case 'summary_written':
175
+ case 'task_completed':
176
+ case 'new_session':
177
+ // Just refresh data silently
178
+ refreshIfNeeded();
179
+ // Optionally highlight in carousel if it's the current session
180
+ if (payload.sessionId && typeof carouselGoTo === 'function') {
181
+ carouselGoTo(payload.sessionId);
182
+ }
183
+ break;
184
+
185
+ case 'SESSION_CREATED':
186
+ case 'SESSION_ARCHIVED':
187
+ case 'TASK_UPDATED':
188
+ case 'SESSION_UPDATED':
189
+ case 'TASK_CREATED':
190
+ case 'SUMMARY_WRITTEN':
191
+ case 'PLAN_UPDATED':
192
+ case 'REVIEW_UPDATED':
193
+ case 'CONTENT_WRITTEN':
194
+ case 'FILE_DELETED':
195
+ case 'DIRECTORY_CREATED':
196
+ // Route to state reducer for granular updates
197
+ if (typeof handleWorkflowEvent === 'function') {
198
+ handleWorkflowEvent({ type, ...payload });
199
+ } else {
200
+ // Fallback to full refresh if reducer not available
201
+ refreshIfNeeded();
202
+ }
203
+ break;
204
+
205
+ case 'tool_execution':
206
+ // Handle tool execution notifications from MCP tools
207
+ handleToolExecutionNotification(payload);
208
+ break;
209
+
210
+ case 'cli_execution':
211
+ // Handle CLI command notifications (ccw cli -p)
212
+ handleCliCommandNotification(payload);
213
+ break;
214
+
215
+ // CLI Tool Execution Events
216
+ case 'CLI_EXECUTION_STARTED':
217
+ if (typeof handleCliExecutionStarted === 'function') {
218
+ handleCliExecutionStarted(payload);
219
+ }
220
+ break;
221
+
222
+ case 'CLI_OUTPUT':
223
+ if (typeof handleCliOutput === 'function') {
224
+ handleCliOutput(payload);
225
+ }
226
+ break;
227
+
228
+ case 'CLI_EXECUTION_COMPLETED':
229
+ if (typeof handleCliExecutionCompleted === 'function') {
230
+ handleCliExecutionCompleted(payload);
231
+ }
232
+ break;
233
+
234
+ case 'CLI_EXECUTION_ERROR':
235
+ if (typeof handleCliExecutionError === 'function') {
236
+ handleCliExecutionError(payload);
237
+ }
238
+ break;
239
+
240
+ // CLI Review Events
241
+ case 'CLI_REVIEW_UPDATED':
242
+ if (typeof handleCliReviewUpdated === 'function') {
243
+ handleCliReviewUpdated(payload);
244
+ }
245
+ // Also refresh CLI history to show review status
246
+ if (typeof refreshCliHistory === 'function') {
247
+ refreshCliHistory();
248
+ }
249
+ break;
250
+
251
+ // System Notify Events (from CLI commands)
252
+ case 'REFRESH_REQUIRED':
253
+ handleRefreshRequired(payload);
254
+ break;
255
+
256
+ case 'MEMORY_UPDATED':
257
+ if (typeof handleMemoryUpdated === 'function') {
258
+ handleMemoryUpdated(payload);
259
+ }
260
+ // Force refresh of memory view
261
+ if (typeof loadMemoryStats === 'function') {
262
+ loadMemoryStats().then(function() {
263
+ if (typeof renderHotspotsColumn === 'function') renderHotspotsColumn();
264
+ }).catch(function(err) {
265
+ console.error('[Memory] Failed to refresh stats:', err);
266
+ });
267
+ }
268
+ break;
269
+
270
+ case 'HISTORY_UPDATED':
271
+ // Refresh CLI history when updated externally
272
+ if (typeof refreshCliHistory === 'function') {
273
+ refreshCliHistory();
274
+ }
275
+ break;
276
+
277
+ case 'INSIGHT_GENERATED':
278
+ // Refresh insights when new insight is generated
279
+ if (typeof loadInsightsHistory === 'function') {
280
+ loadInsightsHistory();
281
+ }
282
+ break;
283
+
284
+ case 'ACTIVE_MEMORY_SYNCED':
285
+ // Handle Active Memory sync completion
286
+ if (typeof addGlobalNotification === 'function') {
287
+ const { filesAnalyzed, tool, usedCli } = payload;
288
+ const method = usedCli ? `CLI (${tool})` : 'Basic';
289
+ addGlobalNotification(
290
+ 'success',
291
+ 'Active Memory synced',
292
+ {
293
+ 'Files Analyzed': filesAnalyzed,
294
+ 'Method': method,
295
+ 'Timestamp': new Date(payload.timestamp).toLocaleTimeString()
296
+ },
297
+ 'Memory'
298
+ );
299
+ }
300
+ // Refresh Active Memory status
301
+ if (typeof loadActiveMemoryStatus === 'function') {
302
+ loadActiveMemoryStatus().catch(function(err) {
303
+ console.error('[Active Memory] Failed to refresh status:', err);
304
+ });
305
+ }
306
+ console.log('[Active Memory] Sync completed:', payload);
307
+ break;
308
+
309
+ case 'CLAUDE_FILE_SYNCED':
310
+ // Handle CLAUDE.md file sync completion
311
+ if (typeof addGlobalNotification === 'function') {
312
+ const { path, level, tool, mode } = payload;
313
+ const fileName = path.split(/[/\\]/).pop();
314
+ addGlobalNotification(
315
+ 'success',
316
+ `${fileName} synced`,
317
+ {
318
+ 'Level': level,
319
+ 'Tool': tool,
320
+ 'Mode': mode,
321
+ 'Time': new Date(payload.timestamp).toLocaleTimeString()
322
+ },
323
+ 'CLAUDE.md'
324
+ );
325
+ }
326
+ // Refresh file list
327
+ if (typeof loadClaudeFiles === 'function') {
328
+ loadClaudeFiles().then(() => {
329
+ // Re-render the view to show updated content
330
+ if (typeof renderClaudeManager === 'function') {
331
+ renderClaudeManager();
332
+ }
333
+ }).catch(err => console.error('[CLAUDE.md] Failed to refresh files:', err));
334
+ }
335
+ console.log('[CLAUDE.md] Sync completed:', payload);
336
+ break;
337
+
338
+ case 'CLI_TOOL_INSTALLED':
339
+ // Handle CLI tool installation completion
340
+ if (typeof addGlobalNotification === 'function') {
341
+ const { tool } = payload;
342
+ addGlobalNotification(
343
+ 'success',
344
+ `${tool} installed successfully`,
345
+ {
346
+ 'Tool': tool,
347
+ 'Time': new Date(payload.timestamp).toLocaleTimeString()
348
+ },
349
+ 'CLI Tools'
350
+ );
351
+ }
352
+ // Refresh CLI manager
353
+ if (typeof loadCliToolStatus === 'function') {
354
+ loadCliToolStatus().then(() => {
355
+ if (typeof renderToolsSection === 'function') {
356
+ renderToolsSection();
357
+ }
358
+ }).catch(err => console.error('[CLI Tools] Failed to refresh status:', err));
359
+ }
360
+ console.log('[CLI Tools] Installation completed:', payload);
361
+ break;
362
+
363
+ case 'CLI_TOOL_UNINSTALLED':
364
+ // Handle CLI tool uninstallation completion
365
+ if (typeof addGlobalNotification === 'function') {
366
+ const { tool } = payload;
367
+ addGlobalNotification(
368
+ 'success',
369
+ `${tool} uninstalled successfully`,
370
+ {
371
+ 'Tool': tool,
372
+ 'Time': new Date(payload.timestamp).toLocaleTimeString()
373
+ },
374
+ 'CLI Tools'
375
+ );
376
+ }
377
+ // Refresh CLI manager
378
+ if (typeof loadCliToolStatus === 'function') {
379
+ loadCliToolStatus().then(() => {
380
+ if (typeof renderToolsSection === 'function') {
381
+ renderToolsSection();
382
+ }
383
+ }).catch(err => console.error('[CLI Tools] Failed to refresh status:', err));
384
+ }
385
+ console.log('[CLI Tools] Uninstallation completed:', payload);
386
+ break;
387
+
388
+ case 'CODEXLENS_INSTALLED':
389
+ // Handle CodexLens installation completion
390
+ if (typeof addGlobalNotification === 'function') {
391
+ const { version } = payload;
392
+ addGlobalNotification(
393
+ 'success',
394
+ `CodexLens installed successfully`,
395
+ {
396
+ 'Version': version || 'latest',
397
+ 'Time': new Date(payload.timestamp).toLocaleTimeString()
398
+ },
399
+ 'CodexLens'
400
+ );
401
+ }
402
+ // Refresh CLI status if active
403
+ if (typeof loadCodexLensStatus === 'function') {
404
+ loadCodexLensStatus().then(() => {
405
+ if (typeof renderCliStatus === 'function') {
406
+ renderCliStatus();
407
+ }
408
+ });
409
+ }
410
+ console.log('[CodexLens] Installation completed:', payload);
411
+ break;
412
+
413
+ case 'CODEXLENS_UNINSTALLED':
414
+ // Handle CodexLens uninstallation completion
415
+ if (typeof addGlobalNotification === 'function') {
416
+ addGlobalNotification(
417
+ 'success',
418
+ `CodexLens uninstalled successfully`,
419
+ {
420
+ 'Time': new Date(payload.timestamp).toLocaleTimeString()
421
+ },
422
+ 'CodexLens'
423
+ );
424
+ }
425
+ // Refresh CLI status if active
426
+ if (typeof loadCodexLensStatus === 'function') {
427
+ loadCodexLensStatus().then(() => {
428
+ if (typeof renderCliStatus === 'function') {
429
+ renderCliStatus();
430
+ }
431
+ });
432
+ }
433
+ console.log('[CodexLens] Uninstallation completed:', payload);
434
+ break;
435
+
436
+ case 'CODEXLENS_INDEX_PROGRESS':
437
+ // Handle CodexLens index progress updates
438
+ dispatchToEventHandlers('CODEXLENS_INDEX_PROGRESS', data);
439
+ console.log('[CodexLens] Index progress:', payload.stage, payload.percent + '%');
440
+ break;
441
+
442
+ default:
443
+ console.log('[WS] Unknown notification type:', type);
444
+ }
445
+ }
446
+
447
+ /**
448
+ * Handle tool execution notifications from MCP tools
449
+ * @param {Object} payload - Tool execution payload
450
+ */
451
+ function handleToolExecutionNotification(payload) {
452
+ const { toolName, status, params, result, error, timestamp } = payload;
453
+
454
+ // Determine notification type and message
455
+ let notifType = 'info';
456
+ let message = `Tool: ${toolName}`;
457
+ let details = null;
458
+
459
+ switch (status) {
460
+ case 'started':
461
+ notifType = 'info';
462
+ message = `Executing ${toolName}...`;
463
+ // Pass raw object for HTML formatting
464
+ if (params) {
465
+ details = params;
466
+ }
467
+ break;
468
+
469
+ case 'completed':
470
+ notifType = 'success';
471
+ message = `${toolName} completed`;
472
+ // Pass raw object for HTML formatting
473
+ if (result) {
474
+ if (result._truncated) {
475
+ details = result.preview;
476
+ } else {
477
+ details = result;
478
+ }
479
+ }
480
+ break;
481
+
482
+ case 'failed':
483
+ notifType = 'error';
484
+ message = `${toolName} failed`;
485
+ details = error || 'Unknown error';
486
+ break;
487
+
488
+ default:
489
+ notifType = 'info';
490
+ message = `${toolName}: ${status}`;
491
+ }
492
+
493
+ // Add to global notifications - pass objects directly for HTML formatting
494
+ if (typeof addGlobalNotification === 'function') {
495
+ addGlobalNotification(notifType, message, details, 'MCP');
496
+ }
497
+
498
+ // Log to console
499
+ console.log(`[MCP] ${status}: ${toolName}`, payload);
500
+ }
501
+
502
+ /**
503
+ * Handle CLI command notifications (ccw cli -p)
504
+ * @param {Object} payload - CLI execution payload
505
+ */
506
+ function handleCliCommandNotification(payload) {
507
+ const { event, tool, mode, prompt_preview, execution_id, success, duration_ms, status, error, turn_count, custom_id } = payload;
508
+
509
+ let notifType = 'info';
510
+ let message = '';
511
+ let details = null;
512
+
513
+ switch (event) {
514
+ case 'started':
515
+ notifType = 'info';
516
+ message = `CLI ${tool} started`;
517
+ // Pass structured object for rich display
518
+ details = {
519
+ mode: mode,
520
+ prompt: prompt_preview
521
+ };
522
+ if (custom_id) {
523
+ details.id = custom_id;
524
+ }
525
+ break;
526
+
527
+ case 'completed':
528
+ if (success) {
529
+ notifType = 'success';
530
+ const turnStr = turn_count > 1 ? ` (turn ${turn_count})` : '';
531
+ message = `CLI ${tool} completed${turnStr}`;
532
+ // Pass structured object for rich display
533
+ details = {
534
+ duration: duration_ms ? `${(duration_ms / 1000).toFixed(1)}s` : '-',
535
+ execution_id: execution_id
536
+ };
537
+ if (turn_count > 1) {
538
+ details.turns = turn_count;
539
+ }
540
+ } else {
541
+ notifType = 'error';
542
+ message = `CLI ${tool} failed`;
543
+ details = {
544
+ status: status || 'Unknown error',
545
+ execution_id: execution_id
546
+ };
547
+ }
548
+ break;
549
+
550
+ case 'error':
551
+ notifType = 'error';
552
+ message = `CLI ${tool} error`;
553
+ details = error || 'Unknown error';
554
+ break;
555
+
556
+ default:
557
+ notifType = 'info';
558
+ message = `CLI ${tool}: ${event}`;
559
+ }
560
+
561
+ // Add to global notifications - pass objects for HTML formatting
562
+ if (typeof addGlobalNotification === 'function') {
563
+ addGlobalNotification(notifType, message, details, 'CLI');
564
+ }
565
+
566
+ // Refresh CLI history if on history view
567
+ if (event === 'completed' && typeof currentView !== 'undefined' &&
568
+ (currentView === 'history' || currentView === 'cli-history')) {
569
+ if (typeof loadCliHistory === 'function' && typeof renderCliHistoryView === 'function') {
570
+ loadCliHistory().then(() => renderCliHistoryView());
571
+ }
572
+ }
573
+
574
+ // Log to console
575
+ console.log(`[CLI Command] ${event}: ${tool}`, payload);
576
+ }
577
+
578
+ // ========== Auto Refresh ==========
579
+ function initAutoRefresh() {
580
+ // Calculate initial hash
581
+ lastDataHash = calculateDataHash();
582
+
583
+ // Start polling interval
584
+ autoRefreshInterval = setInterval(checkForChanges, AUTO_REFRESH_INTERVAL_MS);
585
+ }
586
+
587
+ function calculateDataHash() {
588
+ if (!workflowData) return null;
589
+
590
+ // Simple hash based on key data points
591
+ const hashData = {
592
+ activeSessions: (workflowData.activeSessions || []).length,
593
+ archivedSessions: (workflowData.archivedSessions || []).length,
594
+ totalTasks: workflowData.statistics?.totalTasks || 0,
595
+ completedTasks: workflowData.statistics?.completedTasks || 0,
596
+ generatedAt: workflowData.generatedAt
597
+ };
598
+
599
+ return JSON.stringify(hashData);
600
+ }
601
+
602
+ async function checkForChanges() {
603
+ if (!window.SERVER_MODE) return;
604
+
605
+ try {
606
+ const response = await fetch(`/api/data?path=${encodeURIComponent(projectPath)}`);
607
+ if (!response.ok) return;
608
+
609
+ const newData = await response.json();
610
+ const newHash = JSON.stringify({
611
+ activeSessions: (newData.activeSessions || []).length,
612
+ archivedSessions: (newData.archivedSessions || []).length,
613
+ totalTasks: newData.statistics?.totalTasks || 0,
614
+ completedTasks: newData.statistics?.completedTasks || 0,
615
+ generatedAt: newData.generatedAt
616
+ });
617
+
618
+ if (newHash !== lastDataHash) {
619
+ lastDataHash = newHash;
620
+ // Silent refresh - no notification
621
+ await refreshWorkspaceData(newData);
622
+ }
623
+ } catch (e) {
624
+ console.error('[AutoRefresh] Check failed:', e);
625
+ }
626
+ }
627
+
628
+ async function refreshIfNeeded() {
629
+ if (!window.SERVER_MODE) return;
630
+
631
+ try {
632
+ const response = await fetch(`/api/data?path=${encodeURIComponent(projectPath)}`);
633
+ if (!response.ok) return;
634
+
635
+ const newData = await response.json();
636
+ await refreshWorkspaceData(newData);
637
+ } catch (e) {
638
+ console.error('[Refresh] Failed:', e);
639
+ }
640
+ }
641
+
642
+ async function refreshWorkspaceData(newData) {
643
+ // Update global data
644
+ window.workflowData = newData;
645
+
646
+ // Clear and repopulate stores
647
+ Object.keys(sessionDataStore).forEach(k => delete sessionDataStore[k]);
648
+ Object.keys(liteTaskDataStore).forEach(k => delete liteTaskDataStore[k]);
649
+
650
+ [...(newData.activeSessions || []), ...(newData.archivedSessions || [])].forEach(s => {
651
+ const key = `session-${s.session_id}`.replace(/[^a-zA-Z0-9-]/g, '-');
652
+ sessionDataStore[key] = s;
653
+ });
654
+
655
+ [...(newData.liteTasks?.litePlan || []), ...(newData.liteTasks?.liteFix || [])].forEach(s => {
656
+ const key = `lite-${s.session_id}`.replace(/[^a-zA-Z0-9-]/g, '-');
657
+ liteTaskDataStore[key] = s;
658
+ });
659
+
660
+ // Update UI silently
661
+ updateStats();
662
+ updateBadges();
663
+ updateCarousel();
664
+
665
+ // Re-render current view if needed
666
+ if (currentView === 'sessions') {
667
+ renderSessions();
668
+ } else if (currentView === 'liteTasks') {
669
+ renderLiteTasks();
670
+ }
671
+
672
+ lastDataHash = calculateDataHash();
673
+ }
674
+
675
+ /**
676
+ * Handle REFRESH_REQUIRED events from CLI commands
677
+ * @param {Object} payload - Contains scope (memory|history|insights|all)
678
+ */
679
+ function handleRefreshRequired(payload) {
680
+ const scope = payload?.scope || 'all';
681
+ console.log('[WS] Refresh required for scope:', scope);
682
+
683
+ switch (scope) {
684
+ case 'memory':
685
+ // Refresh memory stats and graph
686
+ if (typeof loadMemoryStats === 'function') {
687
+ loadMemoryStats().then(function() {
688
+ if (typeof renderHotspotsColumn === 'function') renderHotspotsColumn();
689
+ });
690
+ }
691
+ if (typeof loadMemoryGraph === 'function') {
692
+ loadMemoryGraph();
693
+ }
694
+ break;
695
+
696
+ case 'history':
697
+ // Refresh CLI history
698
+ if (typeof refreshCliHistory === 'function') {
699
+ refreshCliHistory();
700
+ }
701
+ break;
702
+
703
+ case 'insights':
704
+ // Refresh insights history
705
+ if (typeof loadInsightsHistory === 'function') {
706
+ loadInsightsHistory();
707
+ }
708
+ break;
709
+
710
+ case 'all':
711
+ default:
712
+ // Refresh everything
713
+ refreshIfNeeded();
714
+ if (typeof loadMemoryStats === 'function') {
715
+ loadMemoryStats().then(function() {
716
+ if (typeof renderHotspotsColumn === 'function') renderHotspotsColumn();
717
+ });
718
+ }
719
+ if (typeof refreshCliHistory === 'function') {
720
+ refreshCliHistory();
721
+ }
722
+ if (typeof loadInsightsHistory === 'function') {
723
+ loadInsightsHistory();
724
+ }
725
+ break;
726
+ }
727
+ }
728
+
729
+ // ========== Cleanup ==========
730
+ function stopAutoRefresh() {
731
+ if (autoRefreshInterval) {
732
+ clearInterval(autoRefreshInterval);
733
+ autoRefreshInterval = null;
734
+ }
735
+ }
736
+
737
+ function closeWebSocket() {
738
+ if (wsConnection) {
739
+ wsConnection.close();
740
+ wsConnection = null;
741
+ }
742
+ }
743
+
744
+ // ========== Navigation Helper ==========
745
+ function goToSession(sessionId) {
746
+ // Find session in carousel and navigate
747
+ const sessionKey = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
748
+
749
+ // Jump to session in carousel if visible
750
+ if (typeof carouselGoTo === 'function') {
751
+ carouselGoTo(sessionId);
752
+ }
753
+
754
+ // Navigate to session detail
755
+ if (sessionDataStore[sessionKey]) {
756
+ showSessionDetailPage(sessionKey);
757
+ }
758
+ }