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,584 @@
1
+ import { glob } from 'glob';
2
+ import { readFileSync, existsSync } from 'fs';
3
+ import { join, basename } from 'path';
4
+ import { scanLiteTasks } from './lite-scanner.js';
5
+ import { createDashboardCache } from './cache-manager.js';
6
+
7
+ interface SessionData {
8
+ session_id: string;
9
+ project: string;
10
+ status: string;
11
+ type: string;
12
+ workflow_type: string | null;
13
+ created_at: string | null;
14
+ archived_at: string | null;
15
+ path: string;
16
+ tasks: TaskData[];
17
+ taskCount: number;
18
+ hasReview: boolean;
19
+ reviewSummary: ReviewSummary | null;
20
+ reviewDimensions: DimensionData[];
21
+ }
22
+
23
+ interface TaskData {
24
+ task_id: string;
25
+ title: string;
26
+ status: string;
27
+ type: string;
28
+ meta?: Record<string, unknown>;
29
+ context?: Record<string, unknown>;
30
+ flow_control?: Record<string, unknown>;
31
+ }
32
+
33
+ interface ReviewSummary {
34
+ phase: string;
35
+ severityDistribution: Record<string, number>;
36
+ criticalFiles: string[];
37
+ status: string;
38
+ }
39
+
40
+ interface DimensionData {
41
+ name: string;
42
+ findings: Finding[];
43
+ summary: unknown | null;
44
+ status: string;
45
+ }
46
+
47
+ interface Finding {
48
+ severity?: string;
49
+ [key: string]: unknown;
50
+ }
51
+
52
+ interface SessionInput {
53
+ session_id?: string;
54
+ id?: string;
55
+ project?: string;
56
+ description?: string;
57
+ status?: string;
58
+ type?: string;
59
+ workflow_type?: string | null;
60
+ created_at?: string | null; // For backward compatibility
61
+ created?: string; // From SessionMetadata
62
+ updated?: string; // From SessionMetadata
63
+ archived_at?: string | null;
64
+ path: string;
65
+ }
66
+
67
+ interface ScanSessionsResult {
68
+ active: SessionInput[];
69
+ archived: SessionInput[];
70
+ hasReviewData: boolean;
71
+ }
72
+
73
+ interface DashboardData {
74
+ generatedAt: string;
75
+ activeSessions: SessionData[];
76
+ archivedSessions: SessionData[];
77
+ liteTasks: {
78
+ litePlan: unknown[];
79
+ liteFix: unknown[];
80
+ };
81
+ reviewData: ReviewData | null;
82
+ projectOverview: ProjectOverview | null;
83
+ statistics: {
84
+ totalSessions: number;
85
+ activeSessions: number;
86
+ totalTasks: number;
87
+ completedTasks: number;
88
+ reviewFindings: number;
89
+ litePlanCount: number;
90
+ liteFixCount: number;
91
+ };
92
+ }
93
+
94
+ interface ReviewData {
95
+ totalFindings: number;
96
+ severityDistribution: {
97
+ critical: number;
98
+ high: number;
99
+ medium: number;
100
+ low: number;
101
+ };
102
+ dimensionSummary: Record<string, { count: number; sessions: string[] }>;
103
+ sessions: SessionReviewData[];
104
+ }
105
+
106
+ interface SessionReviewData {
107
+ session_id: string;
108
+ progress: unknown | null;
109
+ dimensions: DimensionData[];
110
+ findings: Array<Finding & { dimension: string }>;
111
+ }
112
+
113
+ interface ProjectOverview {
114
+ projectName: string;
115
+ description: string;
116
+ initializedAt: string | null;
117
+ technologyStack: {
118
+ languages: string[];
119
+ frameworks: string[];
120
+ build_tools: string[];
121
+ test_frameworks: string[];
122
+ };
123
+ architecture: {
124
+ style: string;
125
+ layers: string[];
126
+ patterns: string[];
127
+ };
128
+ keyComponents: string[];
129
+ features: unknown[];
130
+ developmentIndex: {
131
+ feature: unknown[];
132
+ enhancement: unknown[];
133
+ bugfix: unknown[];
134
+ refactor: unknown[];
135
+ docs: unknown[];
136
+ };
137
+ statistics: {
138
+ total_features: number;
139
+ total_sessions: number;
140
+ last_updated: string | null;
141
+ };
142
+ metadata: {
143
+ initialized_by: string;
144
+ analysis_timestamp: string | null;
145
+ analysis_mode: string;
146
+ };
147
+ }
148
+
149
+ /**
150
+ * Aggregate all data for dashboard rendering (with caching)
151
+ * @param sessions - Scanned sessions from session-scanner
152
+ * @param workflowDir - Path to .workflow directory
153
+ * @returns Aggregated dashboard data
154
+ */
155
+ export async function aggregateData(sessions: ScanSessionsResult, workflowDir: string): Promise<DashboardData> {
156
+ // Initialize cache manager
157
+ const cache = createDashboardCache(workflowDir);
158
+
159
+ // Prepare paths to watch for changes
160
+ const watchPaths = [
161
+ join(workflowDir, 'active'),
162
+ join(workflowDir, 'archives'),
163
+ join(workflowDir, 'project.json'),
164
+ ...sessions.active.map(s => s.path),
165
+ ...sessions.archived.map(s => s.path)
166
+ ];
167
+
168
+ // Check cache first
169
+ const cachedData = cache.get(watchPaths);
170
+ if (cachedData !== null) {
171
+ console.log('Using cached dashboard data');
172
+ return cachedData;
173
+ }
174
+
175
+ console.log('Cache miss - regenerating dashboard data');
176
+
177
+ const data: DashboardData = {
178
+ generatedAt: new Date().toISOString(),
179
+ activeSessions: [],
180
+ archivedSessions: [],
181
+ liteTasks: {
182
+ litePlan: [],
183
+ liteFix: []
184
+ },
185
+ reviewData: null,
186
+ projectOverview: null,
187
+ statistics: {
188
+ totalSessions: 0,
189
+ activeSessions: 0,
190
+ totalTasks: 0,
191
+ completedTasks: 0,
192
+ reviewFindings: 0,
193
+ litePlanCount: 0,
194
+ liteFixCount: 0
195
+ }
196
+ };
197
+
198
+ // Process active sessions
199
+ for (const session of sessions.active) {
200
+ const sessionData = await processSession(session, true);
201
+ data.activeSessions.push(sessionData);
202
+ data.statistics.totalTasks += sessionData.tasks.length;
203
+ data.statistics.completedTasks += sessionData.tasks.filter(t => t.status === 'completed').length;
204
+ }
205
+
206
+ // Process archived sessions
207
+ for (const session of sessions.archived) {
208
+ const sessionData = await processSession(session, false);
209
+ data.archivedSessions.push(sessionData);
210
+ data.statistics.totalTasks += sessionData.taskCount || 0;
211
+ data.statistics.completedTasks += sessionData.taskCount || 0;
212
+ }
213
+
214
+ // Aggregate review data if present
215
+ if (sessions.hasReviewData) {
216
+ data.reviewData = await aggregateReviewData(sessions.active);
217
+ data.statistics.reviewFindings = data.reviewData.totalFindings;
218
+ }
219
+
220
+ data.statistics.totalSessions = sessions.active.length + sessions.archived.length;
221
+ data.statistics.activeSessions = sessions.active.length;
222
+
223
+ // Scan and include lite tasks
224
+ try {
225
+ const liteTasks = await scanLiteTasks(workflowDir);
226
+ data.liteTasks = liteTasks;
227
+ data.statistics.litePlanCount = liteTasks.litePlan.length;
228
+ data.statistics.liteFixCount = liteTasks.liteFix.length;
229
+ } catch (err) {
230
+ console.error('Error scanning lite tasks:', (err as Error).message);
231
+ }
232
+
233
+ // Load project overview from project.json
234
+ try {
235
+ data.projectOverview = loadProjectOverview(workflowDir);
236
+ } catch (err) {
237
+ console.error('Error loading project overview:', (err as Error).message);
238
+ }
239
+
240
+ // Store in cache before returning
241
+ cache.set(data, watchPaths);
242
+
243
+ return data;
244
+ }
245
+
246
+ /**
247
+ * Process a single session, loading tasks and review info
248
+ * @param session - Session object from scanner
249
+ * @param isActive - Whether session is active
250
+ * @returns Processed session data
251
+ */
252
+ async function processSession(session: SessionInput, isActive: boolean): Promise<SessionData> {
253
+ const result: SessionData = {
254
+ session_id: session.session_id || session.id || '',
255
+ project: session.project || session.description || session.session_id || session.id || '',
256
+ status: session.status || (isActive ? 'active' : 'archived'),
257
+ type: session.type || 'workflow', // Session type (workflow, review, test, docs)
258
+ workflow_type: session.workflow_type || null, // Original workflow_type for reference
259
+ created_at: session.created || session.created_at || null, // Prefer 'created' from SessionMetadata, fallback to 'created_at'
260
+ archived_at: session.archived_at || null, // Raw ISO string - let frontend format
261
+ path: session.path,
262
+ tasks: [],
263
+ taskCount: 0,
264
+ hasReview: false,
265
+ reviewSummary: null,
266
+ reviewDimensions: []
267
+ };
268
+
269
+ // Load tasks for active sessions (full details)
270
+ if (isActive) {
271
+ const taskDir = join(session.path, '.task');
272
+ if (existsSync(taskDir)) {
273
+ const taskFiles = await safeGlob('IMPL-*.json', taskDir);
274
+ for (const taskFile of taskFiles) {
275
+ try {
276
+ const taskData = JSON.parse(readFileSync(join(taskDir, taskFile), 'utf8')) as Record<string, unknown>;
277
+ result.tasks.push({
278
+ task_id: (taskData.id as string) || basename(taskFile, '.json'),
279
+ title: (taskData.title as string) || 'Untitled Task',
280
+ status: (taskData.status as string) || 'pending',
281
+ type: ((taskData.meta as Record<string, unknown>)?.type as string) || 'task',
282
+ meta: (taskData.meta as Record<string, unknown>) || {},
283
+ context: (taskData.context as Record<string, unknown>) || {},
284
+ flow_control: (taskData.flow_control as Record<string, unknown>) || {}
285
+ });
286
+ } catch {
287
+ // Skip invalid task files
288
+ }
289
+ }
290
+ // Sort tasks by ID
291
+ result.tasks.sort((a, b) => sortTaskIds(a.task_id, b.task_id));
292
+ }
293
+ result.taskCount = result.tasks.length;
294
+
295
+ // Check for review data
296
+ const reviewDir = join(session.path, '.review');
297
+ if (existsSync(reviewDir)) {
298
+ result.hasReview = true;
299
+ result.reviewSummary = loadReviewSummary(reviewDir);
300
+ // Load dimension data for review sessions
301
+ if (session.type === 'review') {
302
+ result.reviewDimensions = await loadDimensionData(reviewDir);
303
+ }
304
+ }
305
+ } else {
306
+ // For archived, also load tasks (same as active)
307
+ const taskDir = join(session.path, '.task');
308
+ if (existsSync(taskDir)) {
309
+ const taskFiles = await safeGlob('IMPL-*.json', taskDir);
310
+ for (const taskFile of taskFiles) {
311
+ try {
312
+ const taskData = JSON.parse(readFileSync(join(taskDir, taskFile), 'utf8')) as Record<string, unknown>;
313
+ result.tasks.push({
314
+ task_id: (taskData.id as string) || basename(taskFile, '.json'),
315
+ title: (taskData.title as string) || 'Untitled Task',
316
+ status: (taskData.status as string) || 'completed', // Archived tasks are usually completed
317
+ type: ((taskData.meta as Record<string, unknown>)?.type as string) || 'task'
318
+ });
319
+ } catch {
320
+ // Skip invalid task files
321
+ }
322
+ }
323
+ // Sort tasks by ID
324
+ result.tasks.sort((a, b) => sortTaskIds(a.task_id, b.task_id));
325
+ result.taskCount = result.tasks.length;
326
+ }
327
+
328
+ // Check for review data in archived sessions too
329
+ const reviewDir = join(session.path, '.review');
330
+ if (existsSync(reviewDir)) {
331
+ result.hasReview = true;
332
+ result.reviewSummary = loadReviewSummary(reviewDir);
333
+ // Load dimension data for review sessions
334
+ if (session.type === 'review') {
335
+ result.reviewDimensions = await loadDimensionData(reviewDir);
336
+ }
337
+ }
338
+ }
339
+
340
+ return result;
341
+ }
342
+
343
+ /**
344
+ * Aggregate review data from all active sessions with reviews
345
+ * @param activeSessions - Active session objects
346
+ * @returns Aggregated review data
347
+ */
348
+ async function aggregateReviewData(activeSessions: SessionInput[]): Promise<ReviewData> {
349
+ const reviewData: ReviewData = {
350
+ totalFindings: 0,
351
+ severityDistribution: { critical: 0, high: 0, medium: 0, low: 0 },
352
+ dimensionSummary: {},
353
+ sessions: []
354
+ };
355
+
356
+ for (const session of activeSessions) {
357
+ const reviewDir = join(session.path, '.review');
358
+ if (!existsSync(reviewDir)) continue;
359
+
360
+ const reviewProgress = loadReviewProgress(reviewDir);
361
+ const dimensionData = await loadDimensionData(reviewDir);
362
+
363
+ if (reviewProgress || dimensionData.length > 0) {
364
+ const sessionReview: SessionReviewData = {
365
+ session_id: session.session_id || session.id || '',
366
+ progress: reviewProgress,
367
+ dimensions: dimensionData,
368
+ findings: []
369
+ };
370
+
371
+ // Collect and count findings
372
+ for (const dim of dimensionData) {
373
+ if (dim.findings && Array.isArray(dim.findings)) {
374
+ for (const finding of dim.findings) {
375
+ const severity = (finding.severity || 'low').toLowerCase();
376
+ if (reviewData.severityDistribution.hasOwnProperty(severity)) {
377
+ reviewData.severityDistribution[severity as keyof typeof reviewData.severityDistribution]++;
378
+ }
379
+ reviewData.totalFindings++;
380
+ sessionReview.findings.push({
381
+ ...finding,
382
+ dimension: dim.name
383
+ });
384
+ }
385
+ }
386
+
387
+ // Track dimension summary
388
+ if (!reviewData.dimensionSummary[dim.name]) {
389
+ reviewData.dimensionSummary[dim.name] = { count: 0, sessions: [] };
390
+ }
391
+ reviewData.dimensionSummary[dim.name].count += dim.findings?.length || 0;
392
+ reviewData.dimensionSummary[dim.name].sessions.push(session.session_id || session.id || '');
393
+ }
394
+
395
+ reviewData.sessions.push(sessionReview);
396
+ }
397
+ }
398
+
399
+ return reviewData;
400
+ }
401
+
402
+ /**
403
+ * Load review progress from review-progress.json
404
+ * @param reviewDir - Path to .review directory
405
+ * @returns Review progress data or null
406
+ */
407
+ function loadReviewProgress(reviewDir: string): unknown | null {
408
+ const progressFile = join(reviewDir, 'review-progress.json');
409
+ if (!existsSync(progressFile)) return null;
410
+ try {
411
+ return JSON.parse(readFileSync(progressFile, 'utf8'));
412
+ } catch {
413
+ return null;
414
+ }
415
+ }
416
+
417
+ /**
418
+ * Load review summary from review-state.json
419
+ * @param reviewDir - Path to .review directory
420
+ * @returns Review summary or null
421
+ */
422
+ function loadReviewSummary(reviewDir: string): ReviewSummary | null {
423
+ const stateFile = join(reviewDir, 'review-state.json');
424
+ if (!existsSync(stateFile)) return null;
425
+ try {
426
+ const state = JSON.parse(readFileSync(stateFile, 'utf8')) as Record<string, unknown>;
427
+ return {
428
+ phase: (state.phase as string) || 'unknown',
429
+ severityDistribution: (state.severity_distribution as Record<string, number>) || {},
430
+ criticalFiles: ((state.critical_files as string[]) || []).slice(0, 3),
431
+ status: (state.status as string) || 'in_progress'
432
+ };
433
+ } catch {
434
+ return null;
435
+ }
436
+ }
437
+
438
+ /**
439
+ * Load dimension data from .review/dimensions/
440
+ * @param reviewDir - Path to .review directory
441
+ * @returns Array of dimension data
442
+ */
443
+ async function loadDimensionData(reviewDir: string): Promise<DimensionData[]> {
444
+ const dimensionsDir = join(reviewDir, 'dimensions');
445
+ if (!existsSync(dimensionsDir)) return [];
446
+
447
+ const dimensions: DimensionData[] = [];
448
+ const dimFiles = await safeGlob('*.json', dimensionsDir);
449
+
450
+ for (const file of dimFiles) {
451
+ try {
452
+ const data = JSON.parse(readFileSync(join(dimensionsDir, file), 'utf8'));
453
+ // Handle array structure: [ { findings: [...], summary: {...} } ]
454
+ let findings: Finding[] = [];
455
+ let summary: unknown | null = null;
456
+ let status = 'completed';
457
+
458
+ if (Array.isArray(data) && data.length > 0) {
459
+ const dimData = data[0] as Record<string, unknown>;
460
+ findings = (dimData.findings as Finding[]) || [];
461
+ summary = dimData.summary || null;
462
+ status = (dimData.status as string) || 'completed';
463
+ } else if ((data as Record<string, unknown>).findings) {
464
+ const dataObj = data as Record<string, unknown>;
465
+ findings = (dataObj.findings as Finding[]) || [];
466
+ summary = dataObj.summary || null;
467
+ status = (dataObj.status as string) || 'completed';
468
+ }
469
+
470
+ dimensions.push({
471
+ name: basename(file, '.json'),
472
+ findings: findings,
473
+ summary: summary,
474
+ status: status
475
+ });
476
+ } catch {
477
+ // Skip invalid dimension files
478
+ }
479
+ }
480
+
481
+ return dimensions;
482
+ }
483
+
484
+ /**
485
+ * Safe glob wrapper that returns empty array on error
486
+ * @param pattern - Glob pattern
487
+ * @param cwd - Current working directory
488
+ * @returns Array of matching file names
489
+ */
490
+ async function safeGlob(pattern: string, cwd: string): Promise<string[]> {
491
+ try {
492
+ return await glob(pattern, { cwd, absolute: false });
493
+ } catch {
494
+ return [];
495
+ }
496
+ }
497
+
498
+ // formatDate removed - dates are now passed as raw ISO strings
499
+ // Frontend (dashboard.js) handles all date formatting
500
+
501
+ /**
502
+ * Sort task IDs numerically (IMPL-1, IMPL-2, IMPL-1.1, etc.)
503
+ * @param a - First task ID
504
+ * @param b - Second task ID
505
+ * @returns Comparison result
506
+ */
507
+ function sortTaskIds(a: string, b: string): number {
508
+ const parseId = (id: string): [number, number] => {
509
+ const match = id.match(/IMPL-(\d+)(?:\.(\d+))?/);
510
+ if (!match) return [0, 0];
511
+ return [parseInt(match[1]), parseInt(match[2] || '0')];
512
+ };
513
+ const [a1, a2] = parseId(a);
514
+ const [b1, b2] = parseId(b);
515
+ return a1 - b1 || a2 - b2;
516
+ }
517
+
518
+ /**
519
+ * Load project overview from project.json
520
+ * @param workflowDir - Path to .workflow directory
521
+ * @returns Project overview data or null if not found
522
+ */
523
+ function loadProjectOverview(workflowDir: string): ProjectOverview | null {
524
+ const projectFile = join(workflowDir, 'project.json');
525
+
526
+ if (!existsSync(projectFile)) {
527
+ console.log(`Project file not found at: ${projectFile}`);
528
+ return null;
529
+ }
530
+
531
+ try {
532
+ const fileContent = readFileSync(projectFile, 'utf8');
533
+ const projectData = JSON.parse(fileContent) as Record<string, unknown>;
534
+
535
+ console.log(`Successfully loaded project overview: ${projectData.project_name || 'Unknown'}`);
536
+
537
+ const overview = projectData.overview as Record<string, unknown> | undefined;
538
+ const technologyStack = overview?.technology_stack as Record<string, unknown[]> | undefined;
539
+ const architecture = overview?.architecture as Record<string, unknown> | undefined;
540
+ const developmentIndex = projectData.development_index as Record<string, unknown[]> | undefined;
541
+ const statistics = projectData.statistics as Record<string, unknown> | undefined;
542
+ const metadata = projectData._metadata as Record<string, unknown> | undefined;
543
+
544
+ return {
545
+ projectName: (projectData.project_name as string) || 'Unknown',
546
+ description: (overview?.description as string) || '',
547
+ initializedAt: (projectData.initialized_at as string) || null,
548
+ technologyStack: {
549
+ languages: (technologyStack?.languages as string[]) || [],
550
+ frameworks: (technologyStack?.frameworks as string[]) || [],
551
+ build_tools: (technologyStack?.build_tools as string[]) || [],
552
+ test_frameworks: (technologyStack?.test_frameworks as string[]) || []
553
+ },
554
+ architecture: {
555
+ style: (architecture?.style as string) || 'Unknown',
556
+ layers: (architecture?.layers as string[]) || [],
557
+ patterns: (architecture?.patterns as string[]) || []
558
+ },
559
+ keyComponents: (overview?.key_components as string[]) || [],
560
+ features: (projectData.features as unknown[]) || [],
561
+ developmentIndex: {
562
+ feature: (developmentIndex?.feature as unknown[]) || [],
563
+ enhancement: (developmentIndex?.enhancement as unknown[]) || [],
564
+ bugfix: (developmentIndex?.bugfix as unknown[]) || [],
565
+ refactor: (developmentIndex?.refactor as unknown[]) || [],
566
+ docs: (developmentIndex?.docs as unknown[]) || []
567
+ },
568
+ statistics: {
569
+ total_features: (statistics?.total_features as number) || 0,
570
+ total_sessions: (statistics?.total_sessions as number) || 0,
571
+ last_updated: (statistics?.last_updated as string) || null
572
+ },
573
+ metadata: {
574
+ initialized_by: (metadata?.initialized_by as string) || 'unknown',
575
+ analysis_timestamp: (metadata?.analysis_timestamp as string) || null,
576
+ analysis_mode: (metadata?.analysis_mode as string) || 'unknown'
577
+ }
578
+ };
579
+ } catch (err) {
580
+ console.error(`Failed to parse project.json at ${projectFile}:`, (err as Error).message);
581
+ console.error('Error stack:', (err as Error).stack);
582
+ return null;
583
+ }
584
+ }