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,478 @@
1
+ // ==========================================
2
+ // STORAGE MANAGER COMPONENT
3
+ // ==========================================
4
+ // Manages CCW centralized storage (~/.ccw/)
5
+
6
+ // State
7
+ let storageData = null;
8
+ let storageLoading = false;
9
+
10
+ /**
11
+ * Initialize storage manager
12
+ */
13
+ async function initStorageManager() {
14
+ await loadStorageStats();
15
+ }
16
+
17
+ /**
18
+ * Load storage statistics from API
19
+ */
20
+ async function loadStorageStats() {
21
+ if (storageLoading) return;
22
+ storageLoading = true;
23
+
24
+ try {
25
+ const res = await fetch('/api/storage/stats');
26
+ if (!res.ok) throw new Error('Failed to load storage stats');
27
+ storageData = await res.json();
28
+ renderStorageCard();
29
+ } catch (err) {
30
+ console.error('Failed to load storage stats:', err);
31
+ renderStorageCardError(err.message);
32
+ } finally {
33
+ storageLoading = false;
34
+ }
35
+ }
36
+
37
+ /**
38
+ * Render storage card in the dashboard
39
+ */
40
+ function renderStorageCard() {
41
+ const container = document.getElementById('storageCard');
42
+ if (!container || !storageData) return;
43
+
44
+ const { location, totalSizeFormatted, projectCount, projects } = storageData;
45
+
46
+ // Format relative time
47
+ const formatTimeAgo = (isoString) => {
48
+ if (!isoString) return 'Never';
49
+ const date = new Date(isoString);
50
+ const now = new Date();
51
+ const diffMs = now - date;
52
+ const diffMins = Math.floor(diffMs / 60000);
53
+ const diffHours = Math.floor(diffMins / 60);
54
+ const diffDays = Math.floor(diffHours / 24);
55
+ if (diffMins < 1) return 'Just now';
56
+ if (diffMins < 60) return diffMins + 'm ago';
57
+ if (diffHours < 24) return diffHours + 'h ago';
58
+ if (diffDays < 30) return diffDays + 'd ago';
59
+ return date.toLocaleDateString();
60
+ };
61
+
62
+ // Build project tree (hierarchical view)
63
+ let projectRows = '';
64
+ if (projects && projects.length > 0) {
65
+ const tree = buildProjectTree(projects);
66
+ projectRows = renderProjectTree(tree, 0, formatTimeAgo);
67
+
68
+ // Initially hide all child rows (level > 0)
69
+ setTimeout(() => {
70
+ const allRows = document.querySelectorAll('.project-row');
71
+ allRows.forEach(row => {
72
+ const level = parseInt(row.getAttribute('data-level'));
73
+ if (level > 0) {
74
+ row.style.display = 'none';
75
+ }
76
+ });
77
+ }, 0);
78
+ } else {
79
+ projectRows = '\
80
+ <tr>\
81
+ <td colspan="5" class="py-4 text-center text-muted-foreground text-sm">No storage data yet</td>\
82
+ </tr>\
83
+ ';
84
+ }
85
+
86
+ container.innerHTML = '\
87
+ <div class="bg-card border border-border rounded-lg overflow-hidden">\
88
+ <div class="bg-muted/30 border-b border-border px-4 py-3 flex items-center justify-between">\
89
+ <div class="flex items-center gap-2">\
90
+ <i data-lucide="hard-drive" class="w-4 h-4 text-primary"></i>\
91
+ <span class="font-medium text-foreground">Storage Manager</span>\
92
+ <span class="text-xs px-2 py-0.5 bg-muted rounded-full text-muted-foreground">' + totalSizeFormatted + '</span>\
93
+ </div>\
94
+ <div class="flex items-center gap-2">\
95
+ <button onclick="loadStorageStats()" class="text-xs px-2 py-1 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors" title="Refresh">\
96
+ <i data-lucide="refresh-cw" class="w-3.5 h-3.5"></i>\
97
+ </button>\
98
+ <button onclick="showStorageConfig()" class="text-xs px-2 py-1 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors" title="Settings">\
99
+ <i data-lucide="settings" class="w-3.5 h-3.5"></i>\
100
+ </button>\
101
+ </div>\
102
+ </div>\
103
+ <div class="p-4">\
104
+ <div class="flex items-center gap-2 mb-3 text-xs text-muted-foreground">\
105
+ <i data-lucide="folder" class="w-3.5 h-3.5"></i>\
106
+ <span class="font-mono truncate" title="' + escapeHtml(location) + '">' + escapeHtml(location) + '</span>\
107
+ </div>\
108
+ <div class="grid grid-cols-3 gap-3 mb-4">\
109
+ <div class="bg-muted/30 rounded-lg p-3 text-center">\
110
+ <div class="text-lg font-semibold text-foreground">' + projectCount + '</div>\
111
+ <div class="text-xs text-muted-foreground">Projects</div>\
112
+ </div>\
113
+ <div class="bg-muted/30 rounded-lg p-3 text-center">\
114
+ <div class="text-lg font-semibold text-foreground">' + totalSizeFormatted + '</div>\
115
+ <div class="text-xs text-muted-foreground">Total Size</div>\
116
+ </div>\
117
+ <div class="bg-muted/30 rounded-lg p-3 text-center">\
118
+ <div class="text-lg font-semibold text-foreground">' + getTotalRecords() + '</div>\
119
+ <div class="text-xs text-muted-foreground">Records</div>\
120
+ </div>\
121
+ </div>\
122
+ <div class="border border-border rounded-lg overflow-hidden">\
123
+ <table class="w-full text-sm">\
124
+ <thead class="bg-muted/50">\
125
+ <tr class="text-xs text-muted-foreground">\
126
+ <th class="py-2 px-2 text-left font-medium">Project ID</th>\
127
+ <th class="py-2 px-2 text-right font-medium">Size</th>\
128
+ <th class="py-2 px-2 text-center font-medium">History</th>\
129
+ <th class="py-2 px-2 text-right font-medium">Last Used</th>\
130
+ <th class="py-2 px-1 w-8"></th>\
131
+ </tr>\
132
+ </thead>\
133
+ <tbody>\
134
+ ' + projectRows + '\
135
+ </tbody>\
136
+ </table>\
137
+ </div>\
138
+ <div class="mt-4 flex justify-end gap-2">\
139
+ <button onclick="cleanAllStorageConfirm()" \
140
+ class="text-xs px-3 py-1.5 bg-destructive/10 text-destructive hover:bg-destructive/20 rounded transition-colors flex items-center gap-1.5">\
141
+ <i data-lucide="trash" class="w-3.5 h-3.5"></i>\
142
+ Clean All\
143
+ </button>\
144
+ </div>\
145
+ </div>\
146
+ </div>\
147
+ ';
148
+
149
+ // Reinitialize Lucide icons
150
+ if (typeof lucide !== 'undefined') {
151
+ lucide.createIcons();
152
+ }
153
+ }
154
+
155
+ /**
156
+ * Get total records across all projects
157
+ */
158
+ function getTotalRecords() {
159
+ if (!storageData || !storageData.projects) return 0;
160
+ return storageData.projects.reduce((sum, p) => sum + (p.historyRecords || 0), 0);
161
+ }
162
+
163
+ /**
164
+ * Build project tree from flat list
165
+ * Converts flat project list to hierarchical tree structure
166
+ */
167
+ function buildProjectTree(projects) {
168
+ const tree = [];
169
+ const map = new Map();
170
+
171
+ // Sort by path depth (shallowest first)
172
+ const sorted = projects.slice().sort((a, b) => {
173
+ const depthA = (a.id.match(/\//g) || []).length;
174
+ const depthB = (b.id.match(/\//g) || []).length;
175
+ return depthA - depthB;
176
+ });
177
+
178
+ for (const project of sorted) {
179
+ const segments = project.id.split('/');
180
+
181
+ if (segments.length === 1) {
182
+ // Root level project
183
+ const node = {
184
+ ...project,
185
+ children: [],
186
+ isExpanded: false
187
+ };
188
+ tree.push(node);
189
+ map.set(project.id, node);
190
+ } else {
191
+ // Sub-project
192
+ const parentId = segments.slice(0, -1).join('/');
193
+ const parent = map.get(parentId);
194
+
195
+ if (parent) {
196
+ const node = {
197
+ ...project,
198
+ children: [],
199
+ isExpanded: false
200
+ };
201
+ parent.children.push(node);
202
+ map.set(project.id, node);
203
+ } else {
204
+ // Orphaned project (parent not found) - add to root
205
+ const node = {
206
+ ...project,
207
+ children: [],
208
+ isExpanded: false
209
+ };
210
+ tree.push(node);
211
+ map.set(project.id, node);
212
+ }
213
+ }
214
+ }
215
+
216
+ return tree;
217
+ }
218
+
219
+ /**
220
+ * Render project tree recursively
221
+ */
222
+ function renderProjectTree(tree, level = 0, formatTimeAgo) {
223
+ if (!tree || tree.length === 0) return '';
224
+
225
+ let html = '';
226
+
227
+ for (const node of tree) {
228
+ const hasChildren = node.children && node.children.length > 0;
229
+ const indent = level * 20;
230
+ const projectName = node.id.split('/').pop();
231
+
232
+ const historyBadge = node.historyRecords > 0
233
+ ? '<span class="text-xs px-1.5 py-0.5 bg-primary/10 text-primary rounded">' + node.historyRecords + '</span>'
234
+ : '<span class="text-xs text-muted-foreground">-</span>';
235
+
236
+ const toggleIcon = hasChildren
237
+ ? '<i data-lucide="chevron-right" class="w-3 h-3 transition-transform duration-200 toggle-icon"></i>'
238
+ : '<span class="w-3 h-3 inline-block"></span>';
239
+
240
+ html += '\
241
+ <tr class="border-b border-border/50 hover:bg-muted/30 project-row" data-project-id="' + escapeHtml(node.id) + '" data-level="' + level + '">\
242
+ <td class="py-2 px-2 font-mono text-xs text-muted-foreground">\
243
+ <div class="flex items-center gap-1" style="padding-left: ' + indent + 'px">\
244
+ ' + (hasChildren ? '<button class="toggle-btn hover:bg-muted/50 rounded p-0.5" onclick="toggleProjectNode(\'' + escapeHtml(node.id) + '\')">' + toggleIcon + '</button>' : '<span class="w-3 h-3 inline-block"></span>') + '\
245
+ <span class="truncate max-w-[150px]" title="' + escapeHtml(node.id) + '">' + escapeHtml(projectName) + '</span>\
246
+ </div>\
247
+ </td>\
248
+ <td class="py-2 px-2 text-sm text-right">' + escapeHtml(node.totalSizeFormatted) + '</td>\
249
+ <td class="py-2 px-2 text-center">' + historyBadge + '</td>\
250
+ <td class="py-2 px-2 text-xs text-muted-foreground text-right">' + formatTimeAgo(node.lastModified) + '</td>\
251
+ <td class="py-2 px-1 text-right">\
252
+ <button onclick="cleanProjectStorage(\'' + escapeHtml(node.id) + '\')" \
253
+ class="text-xs px-2 py-1 text-destructive hover:bg-destructive/10 rounded transition-colors" \
254
+ title="Clean this project storage">\
255
+ <i data-lucide="trash-2" class="w-3 h-3"></i>\
256
+ </button>\
257
+ </td>\
258
+ </tr>\
259
+ ';
260
+
261
+ // Render children (initially hidden)
262
+ if (hasChildren) {
263
+ html += renderProjectTree(node.children, level + 1, formatTimeAgo);
264
+ }
265
+ }
266
+
267
+ return html;
268
+ }
269
+
270
+ /**
271
+ * Toggle project node expansion
272
+ */
273
+ function toggleProjectNode(projectId) {
274
+ const row = document.querySelector('[data-project-id="' + projectId + '"]');
275
+ if (!row) return;
276
+
277
+ const icon = row.querySelector('.toggle-icon');
278
+ const level = parseInt(row.getAttribute('data-level'));
279
+
280
+ // Find all child rows
281
+ let nextRow = row.nextElementSibling;
282
+ const childRows = [];
283
+
284
+ while (nextRow && nextRow.classList.contains('project-row')) {
285
+ const nextLevel = parseInt(nextRow.getAttribute('data-level'));
286
+ if (nextLevel <= level) break;
287
+ childRows.push(nextRow);
288
+ nextRow = nextRow.nextElementSibling;
289
+ }
290
+
291
+ // Toggle visibility
292
+ const isExpanded = row.classList.contains('expanded');
293
+
294
+ if (isExpanded) {
295
+ // Collapse
296
+ row.classList.remove('expanded');
297
+ if (icon) icon.style.transform = 'rotate(0deg)';
298
+ childRows.forEach(child => {
299
+ child.style.display = 'none';
300
+ });
301
+ } else {
302
+ // Expand (only immediate children)
303
+ row.classList.add('expanded');
304
+ if (icon) icon.style.transform = 'rotate(90deg)';
305
+ childRows.forEach(child => {
306
+ const childLevel = parseInt(child.getAttribute('data-level'));
307
+ if (childLevel === level + 1) {
308
+ child.style.display = '';
309
+ }
310
+ });
311
+ }
312
+
313
+ // Reinitialize Lucide icons
314
+ if (typeof lucide !== 'undefined') {
315
+ lucide.createIcons();
316
+ }
317
+ }
318
+
319
+ /**
320
+ * Render error state for storage card
321
+ */
322
+ function renderStorageCardError(message) {
323
+ const container = document.getElementById('storageCard');
324
+ if (!container) return;
325
+
326
+ container.innerHTML = '\
327
+ <div class="bg-card border border-border rounded-lg overflow-hidden">\
328
+ <div class="bg-muted/30 border-b border-border px-4 py-3 flex items-center gap-2">\
329
+ <i data-lucide="hard-drive" class="w-4 h-4 text-primary"></i>\
330
+ <span class="font-medium text-foreground">Storage Manager</span>\
331
+ </div>\
332
+ <div class="p-4 text-center">\
333
+ <div class="text-destructive mb-2">\
334
+ <i data-lucide="alert-circle" class="w-8 h-8 mx-auto"></i>\
335
+ </div>\
336
+ <p class="text-sm text-muted-foreground mb-3">' + escapeHtml(message) + '</p>\
337
+ <button onclick="loadStorageStats()" class="text-xs px-3 py-1.5 bg-primary/10 text-primary hover:bg-primary/20 rounded transition-colors">\
338
+ Retry\
339
+ </button>\
340
+ </div>\
341
+ </div>\
342
+ ';
343
+
344
+ if (typeof lucide !== 'undefined') {
345
+ lucide.createIcons();
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Show storage configuration modal
351
+ */
352
+ function showStorageConfig() {
353
+ const content = '\
354
+ # Storage Configuration\n\
355
+ \n\
356
+ ## Current Location\n\
357
+ \n\
358
+ ```\n\
359
+ ' + (storageData?.location || '~/.ccw') + '\n\
360
+ ```\n\
361
+ \n\
362
+ ## Change Storage Location\n\
363
+ \n\
364
+ Set the `CCW_DATA_DIR` environment variable to change the storage location:\n\
365
+ \n\
366
+ ### Windows (PowerShell)\n\
367
+ ```powershell\n\
368
+ $env:CCW_DATA_DIR = "D:\\custom\\ccw-data"\n\
369
+ ```\n\
370
+ \n\
371
+ ### Windows (Command Prompt)\n\
372
+ ```cmd\n\
373
+ set CCW_DATA_DIR=D:\\custom\\ccw-data\n\
374
+ ```\n\
375
+ \n\
376
+ ### Linux/macOS\n\
377
+ ```bash\n\
378
+ export CCW_DATA_DIR="/custom/ccw-data"\n\
379
+ ```\n\
380
+ \n\
381
+ ### Permanent (add to shell profile)\n\
382
+ ```bash\n\
383
+ echo \'export CCW_DATA_DIR="/custom/ccw-data"\' >> ~/.bashrc\n\
384
+ ```\n\
385
+ \n\
386
+ > **Note:** Existing data will NOT be migrated automatically.\n\
387
+ > Manually copy the contents of the old directory to the new location.\n\
388
+ \n\
389
+ ## CLI Commands\n\
390
+ \n\
391
+ ```bash\n\
392
+ # Show storage info\n\
393
+ ccw cli storage\n\
394
+ \n\
395
+ # Clean all storage\n\
396
+ ccw cli storage clean --force\n\
397
+ \n\
398
+ # Clean specific project\n\
399
+ ccw cli storage clean --project . --force\n\
400
+ ```\n\
401
+ ';
402
+
403
+ openMarkdownModal('Storage Configuration', content, 'markdown');
404
+ }
405
+
406
+ /**
407
+ * Clean storage for a specific project
408
+ */
409
+ async function cleanProjectStorage(projectId) {
410
+ const project = storageData?.projects?.find(p => p.id === projectId);
411
+ const sizeInfo = project ? ' (' + project.totalSizeFormatted + ')' : '';
412
+
413
+ if (!confirm('Delete storage for project ' + projectId.substring(0, 8) + '...' + sizeInfo + '?\n\nThis will remove CLI history, memory, and cache for this project.')) {
414
+ return;
415
+ }
416
+
417
+ try {
418
+ const res = await fetch('/api/storage/clean', {
419
+ method: 'POST',
420
+ headers: { 'Content-Type': 'application/json' },
421
+ body: JSON.stringify({ projectId })
422
+ });
423
+
424
+ const result = await res.json();
425
+
426
+ if (result.success) {
427
+ addGlobalNotification('success', 'Storage Cleaned', 'Freed ' + result.freedFormatted, 'storage');
428
+ await loadStorageStats();
429
+ } else {
430
+ throw new Error(result.error || 'Failed to clean storage');
431
+ }
432
+ } catch (err) {
433
+ addGlobalNotification('error', 'Clean Failed', err.message, 'storage');
434
+ }
435
+ }
436
+
437
+ /**
438
+ * Confirm and clean all storage
439
+ */
440
+ async function cleanAllStorageConfirm() {
441
+ const totalSize = storageData?.totalSizeFormatted || 'unknown';
442
+ const projectCount = storageData?.projectCount || 0;
443
+
444
+ if (!confirm('Delete ALL CCW storage?\n\nThis will remove:\n- ' + projectCount + ' projects\n- ' + totalSize + ' of data\n\nThis action cannot be undone!')) {
445
+ return;
446
+ }
447
+
448
+ // Double confirm for safety
449
+ if (!confirm('Are you SURE? This will delete all CLI history, memory stores, and caches.')) {
450
+ return;
451
+ }
452
+
453
+ try {
454
+ const res = await fetch('/api/storage/clean', {
455
+ method: 'POST',
456
+ headers: { 'Content-Type': 'application/json' },
457
+ body: JSON.stringify({ all: true })
458
+ });
459
+
460
+ const result = await res.json();
461
+
462
+ if (result.success) {
463
+ addGlobalNotification('success', 'All Storage Cleaned', 'Cleaned ' + result.projectsCleaned + ' projects, freed ' + result.freedFormatted, 'storage');
464
+ await loadStorageStats();
465
+ } else {
466
+ throw new Error(result.error || 'Failed to clean storage');
467
+ }
468
+ } catch (err) {
469
+ addGlobalNotification('error', 'Clean Failed', err.message, 'storage');
470
+ }
471
+ }
472
+
473
+ /**
474
+ * Get storage data (for external use)
475
+ */
476
+ function getStorageData() {
477
+ return storageData;
478
+ }
@@ -96,7 +96,7 @@ function renderImplPlanContent(implPlan) {
96
96
  // Lite Context Tab Rendering
97
97
  // ==========================================
98
98
 
99
- function renderLiteContextContent(context, explorations, session) {
99
+ function renderLiteContextContent(context, explorations, session, diagnoses) {
100
100
  const plan = session.plan || {};
101
101
  let sections = [];
102
102
 
@@ -105,6 +105,11 @@ function renderLiteContextContent(context, explorations, session) {
105
105
  sections.push(renderExplorationContext(explorations));
106
106
  }
107
107
 
108
+ // Render diagnoses if available (from diagnosis-*.json files)
109
+ if (diagnoses && diagnoses.manifest) {
110
+ sections.push(renderDiagnosisContext(diagnoses));
111
+ }
112
+
108
113
  // If we have context from context-package.json
109
114
  if (context) {
110
115
  sections.push(`
@@ -153,7 +158,7 @@ function renderLiteContextContent(context, explorations, session) {
153
158
  <div class="tab-empty-state">
154
159
  <div class="empty-icon"><i data-lucide="package" class="w-12 h-12"></i></div>
155
160
  <div class="empty-title">No Context Data</div>
156
- <div class="empty-text">No context-package.json or exploration files found for this session.</div>
161
+ <div class="empty-text">No context-package.json, exploration files, or diagnosis files found for this session.</div>
157
162
  </div>
158
163
  `;
159
164
  }
@@ -185,15 +190,19 @@ function renderExplorationContext(explorations) {
185
190
  `);
186
191
 
187
192
  // Render each exploration angle as collapsible section
188
- const explorationOrder = ['architecture', 'dependencies', 'patterns', 'integration-points'];
193
+ const explorationOrder = ['architecture', 'dependencies', 'patterns', 'integration-points', 'testing'];
189
194
  const explorationTitles = {
190
195
  'architecture': '<i data-lucide="blocks" class="w-4 h-4 inline mr-1"></i>Architecture',
191
196
  'dependencies': '<i data-lucide="package" class="w-4 h-4 inline mr-1"></i>Dependencies',
192
197
  'patterns': '<i data-lucide="git-branch" class="w-4 h-4 inline mr-1"></i>Patterns',
193
- 'integration-points': '<i data-lucide="plug" class="w-4 h-4 inline mr-1"></i>Integration Points'
198
+ 'integration-points': '<i data-lucide="plug" class="w-4 h-4 inline mr-1"></i>Integration Points',
199
+ 'testing': '<i data-lucide="flask-conical" class="w-4 h-4 inline mr-1"></i>Testing'
194
200
  };
195
201
 
196
- for (const angle of explorationOrder) {
202
+ // Collect all angles from data (in case there are exploration angles not in our predefined list)
203
+ const allAngles = [...new Set([...explorationOrder, ...Object.keys(data)])];
204
+
205
+ for (const angle of allAngles) {
197
206
  const expData = data[angle];
198
207
  if (!expData) {
199
208
  continue;
@@ -205,7 +214,7 @@ function renderExplorationContext(explorations) {
205
214
  <div class="exploration-section collapsible-section">
206
215
  <div class="collapsible-header">
207
216
  <span class="collapse-icon">▶</span>
208
- <span class="section-label">${explorationTitles[angle] || angle}</span>
217
+ <span class="section-label">${explorationTitles[angle] || ('<i data-lucide="file-search" class="w-4 h-4 inline mr-1"></i>' + escapeHtml(angle.toUpperCase()))}</span>
209
218
  </div>
210
219
  <div class="collapsible-content collapsed">
211
220
  ${angleContent}
@@ -271,3 +280,145 @@ function renderExplorationAngle(angle, data) {
271
280
 
272
281
  return content.join('') || '<p>No data available</p>';
273
282
  }
283
+
284
+ // ==========================================
285
+ // Diagnosis Context Rendering
286
+ // ==========================================
287
+
288
+ function renderDiagnosisContext(diagnoses) {
289
+ if (!diagnoses || !diagnoses.manifest) {
290
+ return '';
291
+ }
292
+
293
+ const manifest = diagnoses.manifest;
294
+ const data = diagnoses.data || {};
295
+
296
+ let sections = [];
297
+
298
+ // Header with manifest info
299
+ sections.push(`
300
+ <div class="diagnosis-header">
301
+ <h4><i data-lucide="stethoscope" class="w-4 h-4 inline mr-1"></i> ${escapeHtml(manifest.task_description || 'Diagnosis Context')}</h4>
302
+ <div class="diagnosis-meta">
303
+ <span class="meta-item">Diagnoses: <strong>${manifest.diagnosis_count || 0}</strong></span>
304
+ </div>
305
+ </div>
306
+ `);
307
+
308
+ // Render each diagnosis angle as collapsible section
309
+ const diagnosisOrder = ['root-cause', 'api-contracts', 'dataflow', 'performance', 'security', 'error-handling'];
310
+ const diagnosisTitles = {
311
+ 'root-cause': '<i data-lucide="search" class="w-4 h-4 inline mr-1"></i>Root Cause',
312
+ 'api-contracts': '<i data-lucide="plug" class="w-4 h-4 inline mr-1"></i>API Contracts',
313
+ 'dataflow': '<i data-lucide="git-merge" class="w-4 h-4 inline mr-1"></i>Data Flow',
314
+ 'performance': '<i data-lucide="zap" class="w-4 h-4 inline mr-1"></i>Performance',
315
+ 'security': '<i data-lucide="shield" class="w-4 h-4 inline mr-1"></i>Security',
316
+ 'error-handling': '<i data-lucide="alert-circle" class="w-4 h-4 inline mr-1"></i>Error Handling'
317
+ };
318
+
319
+ // Collect all angles from data (in case there are diagnosis angles not in our predefined list)
320
+ const allAngles = [...new Set([...diagnosisOrder, ...Object.keys(data)])];
321
+
322
+ for (const angle of allAngles) {
323
+ const diagData = data[angle];
324
+ if (!diagData) {
325
+ continue;
326
+ }
327
+
328
+ const angleContent = renderDiagnosisAngle(angle, diagData);
329
+
330
+ sections.push(`
331
+ <div class="diagnosis-section collapsible-section">
332
+ <div class="collapsible-header">
333
+ <span class="collapse-icon">▶</span>
334
+ <span class="section-label">${diagnosisTitles[angle] || ('<i data-lucide="file-search" class="w-4 h-4 inline mr-1"></i>' + angle)}</span>
335
+ </div>
336
+ <div class="collapsible-content collapsed">
337
+ ${angleContent}
338
+ </div>
339
+ </div>
340
+ `);
341
+ }
342
+
343
+ return `<div class="diagnosis-context">${sections.join('')}</div>`;
344
+ }
345
+
346
+ function renderDiagnosisAngle(angle, data) {
347
+ let content = [];
348
+
349
+ // Summary/Overview
350
+ if (data.summary || data.overview) {
351
+ content.push(renderExpField('Summary', data.summary || data.overview));
352
+ }
353
+
354
+ // Root cause analysis
355
+ if (data.root_cause || data.root_cause_analysis) {
356
+ content.push(renderExpField('Root Cause', data.root_cause || data.root_cause_analysis));
357
+ }
358
+
359
+ // Issues/Findings
360
+ if (data.issues && Array.isArray(data.issues)) {
361
+ content.push(`
362
+ <div class="exp-field">
363
+ <label>Issues Found (${data.issues.length})</label>
364
+ <div class="issues-list">
365
+ ${data.issues.map(issue => {
366
+ if (typeof issue === 'string') {
367
+ return `<div class="issue-item">${escapeHtml(issue)}</div>`;
368
+ } else {
369
+ return `
370
+ <div class="issue-item">
371
+ <div class="issue-title">${escapeHtml(issue.title || issue.description || 'Unknown')}</div>
372
+ ${issue.location ? `<div class="issue-location"><code>${escapeHtml(issue.location)}</code></div>` : ''}
373
+ ${issue.severity ? `<span class="severity-badge ${escapeHtml(issue.severity)}">${escapeHtml(issue.severity)}</span>` : ''}
374
+ </div>
375
+ `;
376
+ }
377
+ }).join('')}
378
+ </div>
379
+ </div>
380
+ `);
381
+ }
382
+
383
+ // Affected files
384
+ if (data.affected_files && Array.isArray(data.affected_files)) {
385
+ content.push(`
386
+ <div class="exp-field">
387
+ <label>Affected Files (${data.affected_files.length})</label>
388
+ <div class="path-tags">
389
+ ${data.affected_files.map(f => {
390
+ const filePath = typeof f === 'string' ? f : (f.path || f.file || '');
391
+ return `<span class="path-tag">${escapeHtml(filePath)}</span>`;
392
+ }).join('')}
393
+ </div>
394
+ </div>
395
+ `);
396
+ }
397
+
398
+ // Recommendations
399
+ if (data.recommendations && Array.isArray(data.recommendations)) {
400
+ content.push(`
401
+ <div class="exp-field">
402
+ <label>Recommendations</label>
403
+ <ol class="recommendations-list">
404
+ ${data.recommendations.map(rec => {
405
+ const recText = typeof rec === 'string' ? rec : (rec.description || rec.action || '');
406
+ return `<li>${escapeHtml(recText)}</li>`;
407
+ }).join('')}
408
+ </ol>
409
+ </div>
410
+ `);
411
+ }
412
+
413
+ // API Contracts (specific to api-contracts diagnosis)
414
+ if (data.contracts && Array.isArray(data.contracts)) {
415
+ content.push(renderExpField('API Contracts', data.contracts));
416
+ }
417
+
418
+ // Data flow (specific to dataflow diagnosis)
419
+ if (data.dataflow || data.data_flow) {
420
+ content.push(renderExpField('Data Flow', data.dataflow || data.data_flow));
421
+ }
422
+
423
+ return content.join('') || '<p>No diagnosis data available</p>';
424
+ }