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
@@ -5,6 +5,9 @@ document.addEventListener('DOMContentLoaded', async () => {
5
5
  // Initialize Lucide icons (must be first to render SVG icons)
6
6
  try { lucide.createIcons(); } catch (e) { console.error('Lucide icons init failed:', e); }
7
7
 
8
+ // Initialize i18n (must be early to translate static content)
9
+ try { initI18n(); } catch (e) { console.error('I18n init failed:', e); }
10
+
8
11
  // Initialize components with error handling to prevent cascading failures
9
12
  try { initTheme(); } catch (e) { console.error('Theme init failed:', e); }
10
13
  try { initSidebar(); } catch (e) { console.error('Sidebar init failed:', e); }
@@ -15,7 +18,9 @@ document.addEventListener('DOMContentLoaded', async () => {
15
18
  try { initCarousel(); } catch (e) { console.error('Carousel init failed:', e); }
16
19
  try { initMcpManager(); } catch (e) { console.error('MCP Manager init failed:', e); }
17
20
  try { initHookManager(); } catch (e) { console.error('Hook Manager init failed:', e); }
21
+ try { initCliStatus(); } catch (e) { console.error('CLI Status init failed:', e); }
18
22
  try { initGlobalNotifications(); } catch (e) { console.error('Global notifications init failed:', e); }
23
+ try { initTaskQueueSidebar(); } catch (e) { console.error('Task queue sidebar init failed:', e); }
19
24
  try { initVersionCheck(); } catch (e) { console.error('Version check init failed:', e); }
20
25
 
21
26
  // Initialize real-time features (WebSocket + auto-refresh)
@@ -67,6 +72,16 @@ document.addEventListener('DOMContentLoaded', async () => {
67
72
  if (typeof closeHookCreateModal === 'function') {
68
73
  closeHookCreateModal();
69
74
  }
75
+
76
+ // Close notification sidebar if open
77
+ if (isNotificationPanelVisible && typeof toggleNotifSidebar === 'function') {
78
+ toggleNotifSidebar();
79
+ }
80
+
81
+ // Close task queue sidebar if open
82
+ if (isTaskQueueSidebarVisible && typeof toggleTaskQueueSidebar === 'function') {
83
+ toggleTaskQueueSidebar();
84
+ }
70
85
  }
71
86
  });
72
87
  });
@@ -1,42 +1,243 @@
1
- // ========================================
2
- // State Management
3
- // ========================================
4
- // Global state variables and template placeholders
5
- // This module must be loaded first as other modules depend on these variables
6
-
7
- // ========== Data Placeholders ==========
8
- // These placeholders are replaced by the dashboard generator at build time
9
- let workflowData = {{WORKFLOW_DATA}};
10
- let projectPath = '{{PROJECT_PATH}}';
11
- let recentPaths = {{RECENT_PATHS}};
12
-
13
- // ========== Application State ==========
14
- // Current filter for session list view ('all', 'active', 'archived')
15
- let currentFilter = 'all';
16
-
17
- // Current lite task type ('lite-plan', 'lite-fix', or null)
18
- let currentLiteType = null;
19
-
20
- // Current view mode ('sessions', 'liteTasks', 'project-overview', 'sessionDetail', 'liteTaskDetail')
21
- let currentView = 'sessions';
22
-
23
- // Current session detail key (null when not in detail view)
24
- let currentSessionDetailKey = null;
25
-
26
- // ========== Data Stores ==========
27
- // Store session data for modal/detail access
28
- // Key: session key, Value: session data object
29
- const sessionDataStore = {};
30
-
31
- // Store lite task session data for detail page access
32
- // Key: session key, Value: lite session data object
33
- const liteTaskDataStore = {};
34
-
35
- // Store task JSON data in a global map instead of inline script tags
36
- // Key: unique task ID, Value: raw task JSON data
37
- const taskJsonStore = {};
38
-
39
- // ========== Global Notification Queue ==========
40
- // Notification queue visible from any view
41
- let globalNotificationQueue = [];
42
- let isNotificationPanelVisible = false;
1
+ // ========================================
2
+ // State Management
3
+ // ========================================
4
+ // Global state variables and template placeholders
5
+ // This module must be loaded first as other modules depend on these variables
6
+
7
+ // ========== Data Placeholders ==========
8
+ // These placeholders are replaced by the dashboard generator at build time
9
+ let workflowData = {{WORKFLOW_DATA}};
10
+ let projectPath = '{{PROJECT_PATH}}';
11
+ let recentPaths = {{RECENT_PATHS}};
12
+
13
+ // Platform detection for cross-platform MCP command generation
14
+ // 'win32' for Windows, 'darwin' for macOS, 'linux' for Linux
15
+ const serverPlatform = '{{SERVER_PLATFORM}}';
16
+ const isWindowsPlatform = serverPlatform === 'win32';
17
+
18
+ // ========== Application State ==========
19
+ // Current filter for session list view ('all', 'active', 'archived')
20
+ let currentFilter = 'all';
21
+
22
+ // Current lite task type ('lite-plan', 'lite-fix', or null)
23
+ let currentLiteType = null;
24
+
25
+ // Current view mode ('sessions', 'liteTasks', 'project-overview', 'sessionDetail', 'liteTaskDetail')
26
+ let currentView = 'sessions';
27
+
28
+ // Current session detail key (null when not in detail view)
29
+ let currentSessionDetailKey = null;
30
+
31
+ // ========== Data Stores ==========
32
+ // Store session data for modal/detail access
33
+ // Key: session key, Value: session data object
34
+ const sessionDataStore = {};
35
+
36
+ // Store lite task session data for detail page access
37
+ // Key: session key, Value: lite session data object
38
+ const liteTaskDataStore = {};
39
+
40
+ // Store task JSON data in a global map instead of inline script tags
41
+ // Key: unique task ID, Value: raw task JSON data
42
+ const taskJsonStore = {};
43
+
44
+ // ========== Global Notification Queue ==========
45
+ // Notification queue visible from any view (persisted to localStorage)
46
+ const NOTIFICATION_STORAGE_KEY = 'ccw_notifications';
47
+ const NOTIFICATION_MAX_STORED = 100;
48
+
49
+ // Load notifications from localStorage on init
50
+ let globalNotificationQueue = loadNotificationsFromStorage();
51
+ let isNotificationPanelVisible = false;
52
+
53
+ /**
54
+ * Load notifications from localStorage
55
+ * @returns {Array} Notification array
56
+ */
57
+ function loadNotificationsFromStorage() {
58
+ try {
59
+ const stored = localStorage.getItem(NOTIFICATION_STORAGE_KEY);
60
+ if (stored) {
61
+ const parsed = JSON.parse(stored);
62
+ // Filter out notifications older than 7 days
63
+ const sevenDaysAgo = Date.now() - (7 * 24 * 60 * 60 * 1000);
64
+ return parsed.filter(n => new Date(n.timestamp).getTime() > sevenDaysAgo);
65
+ }
66
+ } catch (e) {
67
+ console.error('[Notifications] Failed to load from storage:', e);
68
+ }
69
+ return [];
70
+ }
71
+
72
+ /**
73
+ * Save notifications to localStorage
74
+ */
75
+ function saveNotificationsToStorage() {
76
+ try {
77
+ // Keep only the last N notifications
78
+ const toSave = globalNotificationQueue.slice(0, NOTIFICATION_MAX_STORED);
79
+ localStorage.setItem(NOTIFICATION_STORAGE_KEY, JSON.stringify(toSave));
80
+ } catch (e) {
81
+ console.error('[Notifications] Failed to save to storage:', e);
82
+ }
83
+ }
84
+ // ========== Event Handler ==========
85
+ /**
86
+ * Handle granular workflow events from CLI
87
+ * @param {Object} event - Event object with type, sessionId, payload
88
+ */
89
+ function handleWorkflowEvent(event) {
90
+ const { type, payload, sessionId, entityId } = event;
91
+
92
+ switch(type) {
93
+ case 'SESSION_CREATED':
94
+ // Add to activeSessions array
95
+ if (payload) {
96
+ const sessionData = {
97
+ session_id: sessionId,
98
+ ...(payload.metadata || { status: 'planning', created_at: new Date().toISOString() }),
99
+ location: 'active'
100
+ };
101
+
102
+ // Add to store
103
+ const key = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
104
+ sessionDataStore[key] = sessionData;
105
+
106
+ // Add to workflowData
107
+ if (!workflowData.activeSessions) workflowData.activeSessions = [];
108
+ workflowData.activeSessions.push(sessionData);
109
+ }
110
+ break;
111
+
112
+ case 'SESSION_ARCHIVED':
113
+ // Move from active to archived
114
+ if (!workflowData.activeSessions) workflowData.activeSessions = [];
115
+ if (!workflowData.archivedSessions) workflowData.archivedSessions = [];
116
+
117
+ const activeIndex = workflowData.activeSessions.findIndex(s => s.session_id === sessionId);
118
+ if (activeIndex !== -1) {
119
+ const session = workflowData.activeSessions.splice(activeIndex, 1)[0];
120
+ session.location = 'archived';
121
+ if (payload && payload.metadata) {
122
+ Object.assign(session, payload.metadata);
123
+ }
124
+ workflowData.archivedSessions.push(session);
125
+
126
+ // Update store
127
+ const key = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
128
+ sessionDataStore[key] = session;
129
+ }
130
+ break;
131
+
132
+ case 'TASK_UPDATED':
133
+ // Find task in session and merge payload
134
+ const taskSessionKey = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
135
+ const taskSession = sessionDataStore[taskSessionKey];
136
+ if (taskSession && taskSession.tasks) {
137
+ const task = taskSession.tasks.find(t => t.task_id === entityId);
138
+ if (task && payload) {
139
+ Object.assign(task, payload);
140
+ }
141
+ }
142
+ break;
143
+
144
+ case 'SESSION_UPDATED':
145
+ // Update session metadata
146
+ const sessionKey = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
147
+ const session = sessionDataStore[sessionKey];
148
+ if (session && payload) {
149
+ Object.assign(session, payload);
150
+
151
+ // Update in workflowData arrays
152
+ const activeSession = workflowData.activeSessions?.find(s => s.session_id === sessionId);
153
+ const archivedSession = workflowData.archivedSessions?.find(s => s.session_id === sessionId);
154
+ if (activeSession) Object.assign(activeSession, payload);
155
+ if (archivedSession) Object.assign(archivedSession, payload);
156
+ }
157
+ break;
158
+
159
+ case 'TASK_CREATED':
160
+ // Add new task to session
161
+ const tcSessionKey = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
162
+ const tcSession = sessionDataStore[tcSessionKey];
163
+ if (tcSession) {
164
+ if (!tcSession.tasks) tcSession.tasks = [];
165
+ // Check if task already exists (by entityId or task_id in payload)
166
+ const taskId = entityId || (payload && payload.task_id);
167
+ const existingTask = tcSession.tasks.find(t => t.task_id === taskId);
168
+ if (!existingTask && payload) {
169
+ tcSession.tasks.push(payload);
170
+ }
171
+ }
172
+ break;
173
+
174
+ case 'SUMMARY_WRITTEN':
175
+ // Update session summary count or mark task as having summary
176
+ const swSessionKey = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
177
+ const swSession = sessionDataStore[swSessionKey];
178
+ if (swSession) {
179
+ if (!swSession.summaries) swSession.summaries = [];
180
+ swSession.summaries.push({ task_id: entityId, content: payload });
181
+ // Update task status if found
182
+ if (swSession.tasks && entityId) {
183
+ const task = swSession.tasks.find(t => t.task_id === entityId);
184
+ if (task) task.has_summary = true;
185
+ }
186
+ }
187
+ break;
188
+
189
+ case 'PLAN_UPDATED':
190
+ // Update session plan reference
191
+ const puSessionKey = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
192
+ const puSession = sessionDataStore[puSessionKey];
193
+ if (puSession) {
194
+ puSession.has_plan = true;
195
+ puSession.plan_updated_at = new Date().toISOString();
196
+ }
197
+ break;
198
+
199
+ case 'REVIEW_UPDATED':
200
+ // Update session review data
201
+ const ruSessionKey = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
202
+ const ruSession = sessionDataStore[ruSessionKey];
203
+ if (ruSession) {
204
+ if (!ruSession.review) ruSession.review = { dimensions: [], iterations: [], fixes: [] };
205
+ // Track review updates by type based on entityId pattern (prevent duplicates)
206
+ if (event.contentType === 'review-dim') {
207
+ if (!ruSession.review.dimensions.includes(entityId)) ruSession.review.dimensions.push(entityId);
208
+ } else if (event.contentType === 'review-iter') {
209
+ if (!ruSession.review.iterations.includes(entityId)) ruSession.review.iterations.push(entityId);
210
+ } else if (event.contentType === 'review-fix') {
211
+ if (!ruSession.review.fixes.includes(entityId)) ruSession.review.fixes.push(entityId);
212
+ }
213
+ ruSession.has_review = true;
214
+ }
215
+ break;
216
+
217
+ case 'CONTENT_WRITTEN':
218
+ // Generic content write - just log for debugging
219
+ console.log(`[State] Content written: ${event.contentType} for ${sessionId}`);
220
+ break;
221
+
222
+ case 'FILE_DELETED':
223
+ // File deleted from session - log and trigger refresh
224
+ console.log(`[State] File deleted: ${payload?.file_path || payload?.deleted} from ${sessionId}`);
225
+ break;
226
+
227
+ case 'DIRECTORY_CREATED':
228
+ // Directory created in session - log and trigger refresh
229
+ console.log(`[State] Directory created: ${payload?.directories?.join(', ') || 'unknown'} in ${sessionId}`);
230
+ break;
231
+ }
232
+
233
+ // Trigger UI updates
234
+ if (typeof updateStats === 'function') updateStats();
235
+ if (typeof updateBadges === 'function') updateBadges();
236
+ if (typeof updateCarousel === 'function') updateCarousel();
237
+ if (typeof refreshTaskQueue === 'function') refreshTaskQueue();
238
+
239
+ // Re-render current view if needed
240
+ if (currentView === 'sessions' && typeof renderSessions === 'function') {
241
+ renderSessions();
242
+ }
243
+ }
@@ -5,6 +5,37 @@
5
5
 
6
6
  // ========== HTML/Text Processing ==========
7
7
 
8
+ /**
9
+ * Encode JSON config data to Base64 for safe HTML attribute storage
10
+ * @param {Object} config - Configuration object to encode
11
+ * @returns {string} Base64 encoded JSON string
12
+ */
13
+ function encodeConfigData(config) {
14
+ try {
15
+ const jsonStr = JSON.stringify(config);
16
+ return btoa(encodeURIComponent(jsonStr));
17
+ } catch (err) {
18
+ console.error('[Utils] Error encoding config data:', err);
19
+ return '';
20
+ }
21
+ }
22
+
23
+ /**
24
+ * Decode Base64 config data back to JSON object
25
+ * @param {string} encoded - Base64 encoded string
26
+ * @returns {Object|null} Decoded configuration object or null on error
27
+ */
28
+ function decodeConfigData(encoded) {
29
+ try {
30
+ if (!encoded) return null;
31
+ const jsonStr = decodeURIComponent(atob(encoded));
32
+ return JSON.parse(jsonStr);
33
+ } catch (err) {
34
+ console.error('[Utils] Error decoding config data:', err);
35
+ return null;
36
+ }
37
+ }
38
+
8
39
  /**
9
40
  * Escape HTML special characters to prevent XSS attacks
10
41
  * @param {string} str - String to escape
@@ -20,6 +51,21 @@ function escapeHtml(str) {
20
51
  .replace(/'/g, ''');
21
52
  }
22
53
 
54
+ /**
55
+ * Unescape HTML entities back to original characters
56
+ * @param {string} str - String with HTML entities
57
+ * @returns {string} String with entities decoded
58
+ */
59
+ function unescapeHtml(str) {
60
+ if (typeof str !== 'string') return str;
61
+ return str
62
+ .replace(/"/g, '"')
63
+ .replace(/'/g, "'")
64
+ .replace(/&lt;/g, '<')
65
+ .replace(/&gt;/g, '>')
66
+ .replace(/&amp;/g, '&');
67
+ }
68
+
23
69
  /**
24
70
  * Truncate text to specified maximum length
25
71
  * @param {string} text - Text to truncate
@@ -140,7 +186,7 @@ function toggleSection(header) {
140
186
  function initCollapsibleSections(container) {
141
187
  setTimeout(() => {
142
188
  const headers = container.querySelectorAll('.collapsible-header');
143
- headers.forEach(header => {
189
+ headers.forEach((header) => {
144
190
  if (!header._clickBound) {
145
191
  header._clickBound = true;
146
192
  header.addEventListener('click', function(e) {