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
@@ -0,0 +1,716 @@
1
+ // ==========================================
2
+ // TASK QUEUE SIDEBAR - Right Sidebar
3
+ // ==========================================
4
+ // Right-side slide-out toolbar for task queue and CLI execution management
5
+
6
+ let isTaskQueueSidebarVisible = false;
7
+ let taskQueueData = [];
8
+ let cliQueueData = [];
9
+ let currentQueueTab = 'tasks'; // 'tasks' | 'cli'
10
+ let cliCategoryFilter = 'all'; // 'all' | 'user' | 'internal' | 'insight'
11
+
12
+ // Update task queue data (for CLAUDE.md updates from explorer)
13
+ let sidebarUpdateTasks = [];
14
+ let isSidebarTaskRunning = {}; // Track running tasks by id
15
+
16
+ /**
17
+ * Initialize task queue sidebar
18
+ */
19
+ function initTaskQueueSidebar() {
20
+ // Create sidebar if not exists - check for container to handle partial creation
21
+ var existingContainer = document.getElementById('taskQueueContainer');
22
+ if (existingContainer) {
23
+ existingContainer.remove();
24
+ }
25
+ if (!document.getElementById('taskQueueSidebar')) {
26
+ const sidebarHtml = `
27
+ <div class="task-queue-sidebar" id="taskQueueSidebar">
28
+ <div class="task-queue-header">
29
+ <div class="task-queue-title">
30
+ <span class="task-queue-title-icon">📋</span>
31
+ <span>Execution Queue</span>
32
+ <span class="task-queue-count-badge" id="taskQueueCountBadge">0</span>
33
+ </div>
34
+ <button class="task-queue-close" onclick="toggleTaskQueueSidebar()" title="Close">
35
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
36
+ <path d="M18 6L6 18M6 6l12 12"/>
37
+ </svg>
38
+ </button>
39
+ </div>
40
+
41
+ <div class="task-queue-tabs">
42
+ <button class="task-queue-tab active" data-tab="tasks" onclick="switchQueueTab('tasks')">
43
+ 📋 Tasks <span class="tab-badge" id="tasksTabBadge">0</span>
44
+ </button>
45
+ <button class="task-queue-tab" data-tab="cli" onclick="switchQueueTab('cli')">
46
+ ⚡ CLI <span class="tab-badge" id="cliTabBadge">0</span>
47
+ </button>
48
+ </div>
49
+
50
+ <div class="task-queue-filters" id="taskQueueFilters">
51
+ <button class="task-filter-btn active" data-filter="all" onclick="filterTaskQueue('all')">All</button>
52
+ <button class="task-filter-btn" data-filter="in_progress" onclick="filterTaskQueue('in_progress')">In Progress</button>
53
+ <button class="task-filter-btn" data-filter="pending" onclick="filterTaskQueue('pending')">Pending</button>
54
+ </div>
55
+
56
+ <div class="task-queue-filters" id="cliQueueFilters" style="display: none;">
57
+ <button class="cli-filter-btn active" data-filter="all" onclick="filterCliQueue('all')">All</button>
58
+ <button class="cli-filter-btn" data-filter="user" onclick="filterCliQueue('user')">🔵 User</button>
59
+ <button class="cli-filter-btn" data-filter="insight" onclick="filterCliQueue('insight')">🟣 Insight</button>
60
+ <button class="cli-filter-btn" data-filter="internal" onclick="filterCliQueue('internal')">🟢 Internal</button>
61
+ </div>
62
+
63
+ <div class="task-queue-content" id="taskQueueContent">
64
+ <div class="task-queue-empty-state">
65
+ <div class="task-queue-empty-icon">📋</div>
66
+ <div class="task-queue-empty-text">No tasks in queue</div>
67
+ <div class="task-queue-empty-hint">Active workflow tasks will appear here</div>
68
+ </div>
69
+ </div>
70
+
71
+ <div class="task-queue-content" id="cliQueueContent" style="display: none;">
72
+ <!-- Update Tasks Section -->
73
+ <div class="update-tasks-section" id="updateTasksSection">
74
+ <div class="update-tasks-header">
75
+ <span class="update-tasks-title">📝 ${t('taskQueue.title')}</span>
76
+ <button class="update-tasks-clear-btn" onclick="clearCompletedUpdateTasks()" title="${t('taskQueue.clearCompleted')}">
77
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
78
+ <path d="M3 6h18M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"/>
79
+ </svg>
80
+ </button>
81
+ </div>
82
+ <div class="update-tasks-list" id="updateTasksList">
83
+ <div class="update-tasks-empty">
84
+ <span>${t('taskQueue.noTasks')}</span>
85
+ <p>${t('taskQueue.noTasksHint')}</p>
86
+ </div>
87
+ </div>
88
+ </div>
89
+
90
+ <!-- CLI History Section -->
91
+ <div class="cli-history-section" id="cliHistorySection">
92
+ <div class="cli-history-header">
93
+ <span class="cli-history-title">⚡ ${t('title.cliHistory')}</span>
94
+ </div>
95
+ <div class="cli-history-list" id="cliHistoryList">
96
+ <div class="task-queue-empty-state">
97
+ <div class="task-queue-empty-icon">⚡</div>
98
+ <div class="task-queue-empty-text">No internal executions</div>
99
+ <div class="task-queue-empty-hint">CLI tool executions will appear here</div>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ </div>
104
+ </div>
105
+
106
+ <div class="task-queue-toggle" id="taskQueueToggle" onclick="toggleTaskQueueSidebar()" title="Execution Queue">
107
+ <span class="toggle-icon">📋</span>
108
+ <span class="toggle-badge" id="taskQueueToggleBadge"></span>
109
+ </div>
110
+
111
+ <div class="task-queue-overlay" id="taskQueueOverlay" onclick="toggleTaskQueueSidebar()"></div>
112
+ `;
113
+
114
+ const container = document.createElement('div');
115
+ container.id = 'taskQueueContainer';
116
+ container.innerHTML = sidebarHtml;
117
+ document.body.appendChild(container);
118
+ }
119
+
120
+ updateTaskQueueData();
121
+ updateCliQueueData();
122
+ renderTaskQueueSidebar();
123
+ renderCliQueue();
124
+ updateTaskQueueBadge();
125
+ }
126
+
127
+ /**
128
+ * Toggle task queue sidebar visibility
129
+ */
130
+ function toggleTaskQueueSidebar() {
131
+ isTaskQueueSidebarVisible = !isTaskQueueSidebarVisible;
132
+ const sidebar = document.getElementById('taskQueueSidebar');
133
+ const overlay = document.getElementById('taskQueueOverlay');
134
+ const toggle = document.getElementById('taskQueueToggle');
135
+
136
+ if (sidebar && overlay && toggle) {
137
+ if (isTaskQueueSidebarVisible) {
138
+ // Close notification sidebar if open
139
+ if (isNotificationPanelVisible && typeof toggleNotifSidebar === 'function') {
140
+ toggleNotifSidebar();
141
+ }
142
+ sidebar.classList.add('open');
143
+ overlay.classList.add('show');
144
+ toggle.classList.add('hidden');
145
+ // Refresh data when opened
146
+ updateTaskQueueData();
147
+ renderTaskQueueSidebar();
148
+ } else {
149
+ sidebar.classList.remove('open');
150
+ overlay.classList.remove('show');
151
+ toggle.classList.remove('hidden');
152
+ }
153
+ }
154
+ }
155
+
156
+ /**
157
+ * Update task queue data from workflow data
158
+ */
159
+ function updateTaskQueueData() {
160
+ taskQueueData = [];
161
+
162
+ // Safety check for global state
163
+ if (typeof workflowData === 'undefined' || !workflowData) {
164
+ console.warn('[TaskQueue] workflowData not initialized');
165
+ return;
166
+ }
167
+
168
+ // Collect tasks from active sessions
169
+ var activeSessions = workflowData.activeSessions || [];
170
+
171
+ activeSessions.forEach(session => {
172
+ const sessionKey = `session-${session.session_id}`.replace(/[^a-zA-Z0-9-]/g, '-');
173
+ const sessionData = sessionDataStore[sessionKey] || session;
174
+ const tasks = sessionData.tasks || [];
175
+
176
+ tasks.forEach(task => {
177
+ taskQueueData.push({
178
+ ...task,
179
+ session_id: session.session_id,
180
+ session_type: session.type || 'workflow',
181
+ session_description: session.description || session.session_id
182
+ });
183
+ });
184
+ });
185
+
186
+ // Also check lite task sessions
187
+ if (typeof liteTaskDataStore === 'undefined' || !liteTaskDataStore) {
188
+ return;
189
+ }
190
+ Object.keys(liteTaskDataStore).forEach(function(key) {
191
+ const liteSession = liteTaskDataStore[key];
192
+ if (liteSession && liteSession.tasks) {
193
+ liteSession.tasks.forEach(task => {
194
+ taskQueueData.push({
195
+ ...task,
196
+ session_id: liteSession.session_id || key,
197
+ session_type: liteSession.type || 'lite',
198
+ session_description: liteSession.description || key
199
+ });
200
+ });
201
+ }
202
+ });
203
+
204
+ // Sort: in_progress first, then pending, then by timestamp
205
+ taskQueueData.sort((a, b) => {
206
+ const statusOrder = { 'in_progress': 0, 'pending': 1, 'completed': 2, 'skipped': 3 };
207
+ const aOrder = statusOrder[a.status] ?? 99;
208
+ const bOrder = statusOrder[b.status] ?? 99;
209
+ if (aOrder !== bOrder) return aOrder - bOrder;
210
+ return 0;
211
+ });
212
+ }
213
+
214
+ /**
215
+ * Render task queue list in sidebar
216
+ * Note: Named renderTaskQueueSidebar to avoid conflict with explorer.js renderTaskQueue
217
+ */
218
+ function renderTaskQueueSidebar(filter) {
219
+ filter = filter || 'all';
220
+ var contentEl = document.getElementById('taskQueueContent');
221
+ if (!contentEl) {
222
+ console.warn('[TaskQueue] taskQueueContent element not found');
223
+ return;
224
+ }
225
+
226
+ let filteredTasks = taskQueueData;
227
+ if (filter !== 'all') {
228
+ filteredTasks = taskQueueData.filter(t => t.status === filter);
229
+ }
230
+
231
+ if (filteredTasks.length === 0) {
232
+ contentEl.innerHTML = `
233
+ <div class="task-queue-empty-state">
234
+ <div class="task-queue-empty-icon">📋</div>
235
+ <div class="task-queue-empty-text">${filter === 'all' ? 'No tasks in queue' : `No ${filter.replace('_', ' ')} tasks`}</div>
236
+ <div class="task-queue-empty-hint">Active workflow tasks will appear here</div>
237
+ </div>
238
+ `;
239
+ return;
240
+ }
241
+
242
+ contentEl.innerHTML = filteredTasks.map(task => {
243
+ const statusIcon = {
244
+ 'in_progress': '🔄',
245
+ 'pending': '⏳',
246
+ 'completed': '✅',
247
+ 'skipped': '⏭️'
248
+ }[task.status] || '📋';
249
+
250
+ const statusClass = task.status || 'pending';
251
+ const taskId = task.task_id || task.id || 'N/A';
252
+ const title = task.title || task.description || taskId;
253
+
254
+ return `
255
+ <div class="task-queue-item status-${statusClass}" data-task-id="${escapeHtml(taskId)}" onclick="openTaskFromQueue('${escapeHtml(task.session_id)}', '${escapeHtml(taskId)}')">
256
+ <div class="task-queue-item-header">
257
+ <span class="task-queue-status-icon">${statusIcon}</span>
258
+ <div class="task-queue-item-info">
259
+ <span class="task-queue-item-title">${escapeHtml(title)}</span>
260
+ <span class="task-queue-item-id">${escapeHtml(taskId)}</span>
261
+ </div>
262
+ </div>
263
+ <div class="task-queue-item-meta">
264
+ <span class="task-queue-session-tag" title="${escapeHtml(task.session_description)}">
265
+ ${escapeHtml(task.session_id)}
266
+ </span>
267
+ <span class="task-queue-type-badge type-${task.session_type}">${escapeHtml(task.session_type)}</span>
268
+ </div>
269
+ ${task.scope ? `<div class="task-queue-item-scope"><code>${escapeHtml(task.scope)}</code></div>` : ''}
270
+ </div>
271
+ `;
272
+ }).join('');
273
+ }
274
+
275
+ /**
276
+ * Filter task queue
277
+ */
278
+ function filterTaskQueue(filter) {
279
+ // Update active filter button
280
+ document.querySelectorAll('.task-filter-btn').forEach(btn => {
281
+ btn.classList.toggle('active', btn.dataset.filter === filter);
282
+ });
283
+ renderTaskQueueSidebar(filter);
284
+ }
285
+
286
+ /**
287
+ * Open task from queue (navigate to task detail)
288
+ */
289
+ function openTaskFromQueue(sessionId, taskId) {
290
+ // Close sidebar
291
+ toggleTaskQueueSidebar();
292
+
293
+ // Try to find and open the task
294
+ const sessionKey = `session-${sessionId}`.replace(/[^a-zA-Z0-9-]/g, '-');
295
+
296
+ // Check if it's a lite task session
297
+ if (liteTaskDataStore[sessionKey]) {
298
+ if (typeof openTaskDrawerForLite === 'function') {
299
+ currentSessionDetailKey = sessionKey;
300
+ openTaskDrawerForLite(sessionId, taskId);
301
+ }
302
+ } else {
303
+ // Regular workflow task
304
+ if (typeof openTaskDrawer === 'function') {
305
+ currentDrawerTasks = sessionDataStore[sessionKey]?.tasks || [];
306
+ openTaskDrawer(taskId);
307
+ }
308
+ }
309
+ }
310
+
311
+ /**
312
+ * Update task queue badge counts
313
+ */
314
+ function updateTaskQueueBadge() {
315
+ const inProgressCount = taskQueueData.filter(t => t.status === 'in_progress').length;
316
+ const pendingCount = taskQueueData.filter(t => t.status === 'pending').length;
317
+ const activeCount = inProgressCount + pendingCount;
318
+
319
+ const countBadge = document.getElementById('taskQueueCountBadge');
320
+ const toggleBadge = document.getElementById('taskQueueToggleBadge');
321
+
322
+ if (countBadge) {
323
+ countBadge.textContent = taskQueueData.length;
324
+ countBadge.style.display = taskQueueData.length > 0 ? 'inline-flex' : 'none';
325
+ }
326
+
327
+ if (toggleBadge) {
328
+ toggleBadge.textContent = activeCount;
329
+ toggleBadge.style.display = activeCount > 0 ? 'flex' : 'none';
330
+ // Highlight if there are in-progress tasks
331
+ toggleBadge.classList.toggle('has-active', inProgressCount > 0);
332
+ }
333
+ }
334
+
335
+ /**
336
+ * Refresh task queue (called from external updates)
337
+ */
338
+ function refreshTaskQueue() {
339
+ updateTaskQueueData();
340
+ updateCliQueueData();
341
+ renderTaskQueueSidebar();
342
+ renderCliQueue();
343
+ updateTaskQueueBadge();
344
+ }
345
+
346
+ /**
347
+ * Switch between Tasks and CLI tabs
348
+ */
349
+ function switchQueueTab(tab) {
350
+ currentQueueTab = tab;
351
+
352
+ // Update tab button states
353
+ document.querySelectorAll('.task-queue-tab').forEach(btn => {
354
+ btn.classList.toggle('active', btn.dataset.tab === tab);
355
+ });
356
+
357
+ // Show/hide filters and content
358
+ const taskFilters = document.getElementById('taskQueueFilters');
359
+ const cliFilters = document.getElementById('cliQueueFilters');
360
+ const taskContent = document.getElementById('taskQueueContent');
361
+ const cliContent = document.getElementById('cliQueueContent');
362
+
363
+ if (tab === 'tasks') {
364
+ if (taskFilters) taskFilters.style.display = 'flex';
365
+ if (cliFilters) cliFilters.style.display = 'none';
366
+ if (taskContent) taskContent.style.display = 'block';
367
+ if (cliContent) cliContent.style.display = 'none';
368
+ } else {
369
+ if (taskFilters) taskFilters.style.display = 'none';
370
+ if (cliFilters) cliFilters.style.display = 'flex';
371
+ if (taskContent) taskContent.style.display = 'none';
372
+ if (cliContent) cliContent.style.display = 'block';
373
+ // Refresh CLI data when switching to CLI tab
374
+ updateCliQueueData();
375
+ renderCliQueue();
376
+ }
377
+ }
378
+
379
+ /**
380
+ * Update CLI queue data from API
381
+ */
382
+ async function updateCliQueueData() {
383
+ try {
384
+ // Fetch recent CLI executions with category info
385
+ const response = await fetch(`/api/cli/history-native?path=${encodeURIComponent(projectPath)}&limit=20`);
386
+ if (!response.ok) return;
387
+ const data = await response.json();
388
+ cliQueueData = data.executions || [];
389
+ } catch (err) {
390
+ console.warn('[TaskQueue] Failed to load CLI queue:', err);
391
+ cliQueueData = [];
392
+ }
393
+ }
394
+
395
+ /**
396
+ * Render CLI queue list
397
+ */
398
+ function renderCliQueue() {
399
+ const contentEl = document.getElementById('cliHistoryList');
400
+ if (!contentEl) return;
401
+
402
+ // Filter by category
403
+ let filtered = cliQueueData;
404
+ if (cliCategoryFilter !== 'all') {
405
+ filtered = cliQueueData.filter(exec => (exec.category || 'user') === cliCategoryFilter);
406
+ }
407
+
408
+ // Update tab badge
409
+ const cliTabBadge = document.getElementById('cliTabBadge');
410
+ if (cliTabBadge) {
411
+ cliTabBadge.textContent = cliQueueData.length;
412
+ cliTabBadge.style.display = cliQueueData.length > 0 ? 'inline' : 'none';
413
+ }
414
+
415
+ if (filtered.length === 0) {
416
+ const emptyText = cliCategoryFilter === 'all'
417
+ ? 'No CLI executions'
418
+ : `No ${cliCategoryFilter} executions`;
419
+ contentEl.innerHTML = `
420
+ <div class="task-queue-empty-state">
421
+ <div class="task-queue-empty-icon">⚡</div>
422
+ <div class="task-queue-empty-text">${emptyText}</div>
423
+ <div class="task-queue-empty-hint">CLI tool executions will appear here</div>
424
+ </div>
425
+ `;
426
+ return;
427
+ }
428
+
429
+ contentEl.innerHTML = filtered.map(exec => {
430
+ const category = exec.category || 'user';
431
+ const categoryIcon = { user: '🔵', internal: '🟢', insight: '🟣' }[category] || '⚪';
432
+ const statusIcon = exec.status === 'success' ? '✅' : exec.status === 'timeout' ? '⏰' : '❌';
433
+ const timeAgo = getCliTimeAgo(new Date(exec.updated_at || exec.timestamp));
434
+ const promptPreview = (exec.prompt_preview || '').substring(0, 60);
435
+
436
+ return `
437
+ <div class="cli-queue-item category-${category}" onclick="showCliExecutionFromQueue('${escapeHtml(exec.id)}')">
438
+ <div class="cli-queue-item-header">
439
+ <span class="cli-queue-category-icon">${categoryIcon}</span>
440
+ <span class="cli-queue-tool-tag cli-tool-${exec.tool}">${exec.tool.toUpperCase()}</span>
441
+ <span class="cli-queue-status">${statusIcon}</span>
442
+ <span class="cli-queue-time">${timeAgo}</span>
443
+ </div>
444
+ <div class="cli-queue-prompt">${escapeHtml(promptPreview)}${promptPreview.length >= 60 ? '...' : ''}</div>
445
+ <div class="cli-queue-meta">
446
+ <span class="cli-queue-id">#${exec.id.split('-')[0]}</span>
447
+ ${exec.turn_count > 1 ? `<span class="cli-queue-turns">${exec.turn_count} turns</span>` : ''}
448
+ ${exec.hasNativeSession ? '<span class="cli-queue-native">📎</span>' : ''}
449
+ </div>
450
+ </div>
451
+ `;
452
+ }).join('');
453
+ }
454
+
455
+ /**
456
+ * Filter CLI queue by category
457
+ */
458
+ function filterCliQueue(category) {
459
+ cliCategoryFilter = category;
460
+
461
+ // Update filter button states
462
+ document.querySelectorAll('.cli-filter-btn').forEach(btn => {
463
+ btn.classList.toggle('active', btn.dataset.filter === category);
464
+ });
465
+
466
+ renderCliQueue();
467
+ }
468
+
469
+ /**
470
+ * Show CLI execution detail from queue
471
+ */
472
+ function showCliExecutionFromQueue(executionId) {
473
+ toggleTaskQueueSidebar();
474
+
475
+ // Use the showExecutionDetail function from cli-history.js if available
476
+ if (typeof showExecutionDetail === 'function') {
477
+ showExecutionDetail(executionId);
478
+ } else {
479
+ console.warn('[TaskQueue] showExecutionDetail not available');
480
+ }
481
+ }
482
+
483
+ /**
484
+ * Helper to format time ago
485
+ */
486
+ function getCliTimeAgo(date) {
487
+ const seconds = Math.floor((new Date() - date) / 1000);
488
+ if (seconds < 60) return 'now';
489
+ if (seconds < 3600) return `${Math.floor(seconds / 60)}m`;
490
+ if (seconds < 86400) return `${Math.floor(seconds / 3600)}h`;
491
+ return `${Math.floor(seconds / 86400)}d`;
492
+ }
493
+
494
+ // ==========================================
495
+ // UPDATE TASK QUEUE - For CLAUDE.md Updates
496
+ // ==========================================
497
+
498
+ /**
499
+ * Add update task to sidebar queue (called from explorer)
500
+ */
501
+ function addUpdateTaskToSidebar(path, tool = 'gemini', strategy = 'single-layer') {
502
+ const task = {
503
+ id: Date.now(),
504
+ path,
505
+ tool,
506
+ strategy,
507
+ status: 'pending', // pending, running, completed, failed
508
+ message: '',
509
+ addedAt: new Date().toISOString()
510
+ };
511
+
512
+ sidebarUpdateTasks.push(task);
513
+ renderSidebarUpdateTasks();
514
+ updateCliTabBadge();
515
+
516
+ // Open sidebar and switch to CLI tab if not visible
517
+ if (!isTaskQueueSidebarVisible) {
518
+ toggleTaskQueueSidebar();
519
+ }
520
+ switchQueueTab('cli');
521
+ }
522
+
523
+ /**
524
+ * Remove update task from queue
525
+ */
526
+ function removeUpdateTask(taskId) {
527
+ sidebarUpdateTasks = sidebarUpdateTasks.filter(t => t.id !== taskId);
528
+ renderSidebarUpdateTasks();
529
+ updateCliTabBadge();
530
+ }
531
+
532
+ /**
533
+ * Clear completed/failed update tasks
534
+ */
535
+ function clearCompletedUpdateTasks() {
536
+ sidebarUpdateTasks = sidebarUpdateTasks.filter(t => t.status === 'pending' || t.status === 'running');
537
+ renderSidebarUpdateTasks();
538
+ updateCliTabBadge();
539
+ }
540
+
541
+ /**
542
+ * Update CLI tool for a specific task
543
+ */
544
+ function updateSidebarTaskCliTool(taskId, tool) {
545
+ const task = sidebarUpdateTasks.find(t => t.id === taskId);
546
+ if (task && task.status === 'pending') {
547
+ task.tool = tool;
548
+ }
549
+ }
550
+
551
+ /**
552
+ * Execute a single update task
553
+ */
554
+ async function executeSidebarUpdateTask(taskId) {
555
+ const task = sidebarUpdateTasks.find(t => t.id === taskId);
556
+ if (!task || task.status !== 'pending') return;
557
+
558
+ const folderName = task.path.split('/').pop() || task.path;
559
+
560
+ // Update status to running
561
+ task.status = 'running';
562
+ task.message = t('taskQueue.processing');
563
+ isSidebarTaskRunning[taskId] = true;
564
+ renderSidebarUpdateTasks();
565
+
566
+ if (typeof addGlobalNotification === 'function') {
567
+ addGlobalNotification('info', `Processing: ${folderName}`, `Strategy: ${task.strategy}, Tool: ${task.tool}`, 'Explorer');
568
+ }
569
+
570
+ try {
571
+ const response = await fetch('/api/update-claude-md', {
572
+ method: 'POST',
573
+ headers: { 'Content-Type': 'application/json' },
574
+ body: JSON.stringify({
575
+ path: task.path,
576
+ tool: task.tool,
577
+ strategy: task.strategy
578
+ })
579
+ });
580
+
581
+ const result = await response.json();
582
+
583
+ if (result.success) {
584
+ task.status = 'completed';
585
+ task.message = t('taskQueue.updated');
586
+ if (typeof addGlobalNotification === 'function') {
587
+ addGlobalNotification('success', `Completed: ${folderName}`, result.message, 'Explorer');
588
+ }
589
+ } else {
590
+ task.status = 'failed';
591
+ task.message = result.error || t('taskQueue.failed');
592
+ if (typeof addGlobalNotification === 'function') {
593
+ addGlobalNotification('error', `Failed: ${folderName}`, result.error || 'Unknown error', 'Explorer');
594
+ }
595
+ }
596
+ } catch (error) {
597
+ task.status = 'failed';
598
+ task.message = error.message;
599
+ if (typeof addGlobalNotification === 'function') {
600
+ addGlobalNotification('error', `Error: ${folderName}`, error.message, 'Explorer');
601
+ }
602
+ } finally {
603
+ delete isSidebarTaskRunning[taskId];
604
+ renderSidebarUpdateTasks();
605
+ updateCliTabBadge();
606
+
607
+ // Refresh tree to show updated CLAUDE.md files
608
+ if (typeof loadExplorerTree === 'function' && typeof explorerCurrentPath !== 'undefined') {
609
+ loadExplorerTree(explorerCurrentPath);
610
+ }
611
+ }
612
+ }
613
+
614
+ /**
615
+ * Stop/cancel a running update task (if possible)
616
+ */
617
+ function stopSidebarUpdateTask(taskId) {
618
+ // Currently just removes the task - actual cancellation would need AbortController
619
+ const task = sidebarUpdateTasks.find(t => t.id === taskId);
620
+ if (task && task.status === 'running') {
621
+ task.status = 'failed';
622
+ task.message = 'Cancelled';
623
+ delete isSidebarTaskRunning[taskId];
624
+ renderSidebarUpdateTasks();
625
+ updateCliTabBadge();
626
+ }
627
+ }
628
+
629
+ /**
630
+ * Render update task queue list
631
+ */
632
+ function renderSidebarUpdateTasks() {
633
+ const listEl = document.getElementById('updateTasksList');
634
+ if (!listEl) return;
635
+
636
+ if (sidebarUpdateTasks.length === 0) {
637
+ listEl.innerHTML = `
638
+ <div class="update-tasks-empty">
639
+ <span>${t('taskQueue.noTasks')}</span>
640
+ <p>${t('taskQueue.noTasksHint')}</p>
641
+ </div>
642
+ `;
643
+ return;
644
+ }
645
+
646
+ listEl.innerHTML = sidebarUpdateTasks.map(task => {
647
+ const folderName = task.path.split('/').pop() || task.path;
648
+ const strategyIcon = task.strategy === 'multi-layer' ? '📂' : '📄';
649
+ const strategyLabel = task.strategy === 'multi-layer'
650
+ ? t('taskQueue.withSubdirs')
651
+ : t('taskQueue.currentOnly');
652
+
653
+ const statusIcon = {
654
+ 'pending': '⏳',
655
+ 'running': '🔄',
656
+ 'completed': '✅',
657
+ 'failed': '❌'
658
+ }[task.status];
659
+
660
+ const isPending = task.status === 'pending';
661
+ const isRunning = task.status === 'running';
662
+
663
+ return `
664
+ <div class="update-task-item status-${task.status}" data-task-id="${task.id}">
665
+ <div class="update-task-header">
666
+ <span class="update-task-status">${statusIcon}</span>
667
+ <span class="update-task-name" title="${escapeHtml(task.path)}">${escapeHtml(folderName)}</span>
668
+ <span class="update-task-strategy" title="${strategyLabel}">${strategyIcon}</span>
669
+ </div>
670
+ <div class="update-task-controls">
671
+ <select class="update-task-cli-select"
672
+ onchange="updateSidebarTaskCliTool(${task.id}, this.value)"
673
+ ${!isPending ? 'disabled' : ''}>
674
+ <option value="gemini" ${task.tool === 'gemini' ? 'selected' : ''}>Gemini</option>
675
+ <option value="qwen" ${task.tool === 'qwen' ? 'selected' : ''}>Qwen</option>
676
+ <option value="codex" ${task.tool === 'codex' ? 'selected' : ''}>Codex</option>
677
+ <option value="claude" ${task.tool === 'claude' ? 'selected' : ''}>Claude</option>
678
+ </select>
679
+ ${isPending ? `
680
+ <button class="update-task-btn update-task-start" onclick="executeSidebarUpdateTask(${task.id})" title="${t('taskQueue.startAll')}">
681
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
682
+ <polygon points="5 3 19 12 5 21 5 3"/>
683
+ </svg>
684
+ </button>
685
+ <button class="update-task-btn update-task-remove" onclick="removeUpdateTask(${task.id})" title="Remove">
686
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
687
+ <path d="M18 6L6 18M6 6l12 12"/>
688
+ </svg>
689
+ </button>
690
+ ` : ''}
691
+ ${isRunning ? `
692
+ <button class="update-task-btn update-task-stop" onclick="stopSidebarUpdateTask(${task.id})" title="Stop">
693
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
694
+ <rect x="6" y="6" width="12" height="12"/>
695
+ </svg>
696
+ </button>
697
+ ` : ''}
698
+ </div>
699
+ ${task.message ? `<div class="update-task-message">${escapeHtml(task.message)}</div>` : ''}
700
+ </div>
701
+ `;
702
+ }).join('');
703
+ }
704
+
705
+ /**
706
+ * Update CLI tab badge with pending update tasks count
707
+ */
708
+ function updateCliTabBadge() {
709
+ const pendingCount = sidebarUpdateTasks.filter(t => t.status === 'pending' || t.status === 'running').length;
710
+ const cliTabBadge = document.getElementById('cliTabBadge');
711
+ if (cliTabBadge) {
712
+ const totalCount = pendingCount + cliQueueData.length;
713
+ cliTabBadge.textContent = totalCount;
714
+ cliTabBadge.style.display = totalCount > 0 ? 'inline' : 'none';
715
+ }
716
+ }