claude-code-workflow 6.3.18 → 6.3.19

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 (822) hide show
  1. package/.claude/CLAUDE.md +8 -5
  2. package/.claude/agents/action-planning-agent.md +26 -2
  3. package/.claude/agents/code-developer.md +132 -43
  4. package/.claude/agents/debug-explore-agent.md +434 -0
  5. package/.claude/agents/test-fix-agent.md +14 -0
  6. package/.claude/commands/issue/discover.md +41 -0
  7. package/.claude/commands/issue/execute.md +200 -19
  8. package/.claude/commands/issue/new.md +1 -1
  9. package/.claude/commands/issue/plan.md +6 -1
  10. package/.claude/commands/issue/queue.md +94 -39
  11. package/.claude/commands/memory/swagger-docs.md +773 -0
  12. package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
  13. package/.claude/commands/workflow/execute.md +54 -34
  14. package/.claude/commands/workflow/lite-execute.md +48 -164
  15. package/.claude/commands/workflow/lite-fix.md +4 -4
  16. package/.claude/commands/workflow/lite-plan.md +5 -5
  17. package/.claude/commands/workflow/plan.md +27 -27
  18. package/.claude/commands/workflow/review.md +42 -17
  19. package/.claude/commands/workflow/tdd-plan.md +25 -25
  20. package/.claude/commands/workflow/test-fix-gen.md +10 -10
  21. package/.claude/commands/workflow/test-gen.md +14 -14
  22. package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
  23. package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
  24. package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
  25. package/.claude/skills/ccw/SKILL.md +462 -0
  26. package/.claude/skills/ccw/index/command-capabilities.json +127 -0
  27. package/.claude/skills/ccw/index/intent-rules.json +136 -0
  28. package/.claude/skills/ccw/index/workflow-chains.json +451 -0
  29. package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
  30. package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
  31. package/.claude/skills/ccw/phases/actions/docs.md +93 -0
  32. package/.claude/skills/ccw/phases/actions/full.md +154 -0
  33. package/.claude/skills/ccw/phases/actions/issue.md +201 -0
  34. package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
  35. package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
  36. package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
  37. package/.claude/skills/ccw/phases/actions/ui.md +79 -0
  38. package/.claude/skills/ccw/phases/orchestrator.md +435 -0
  39. package/.claude/skills/ccw/specs/intent-classification.md +336 -0
  40. package/.claude/skills/ccw-help/SKILL.md +177 -0
  41. package/.claude/skills/ccw-help/index/all-agents.json +82 -0
  42. package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
  43. package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
  44. package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
  45. package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
  46. package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
  47. package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
  48. package/.claude/skills/code-reviewer/README.md +340 -0
  49. package/.claude/skills/code-reviewer/SKILL.md +308 -0
  50. package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
  51. package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
  52. package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
  53. package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
  54. package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
  55. package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
  56. package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
  57. package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
  58. package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
  59. package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
  60. package/.claude/skills/skill-generator/SKILL.md +187 -0
  61. package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
  62. package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
  63. package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
  64. package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
  65. package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
  66. package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
  67. package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
  68. package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
  69. package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
  70. package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
  71. package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
  72. package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
  73. package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
  74. package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
  75. package/.claude/skills/skill-generator/templates/script-python.md +198 -0
  76. package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
  77. package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
  78. package/.claude/workflows/chinese-response.md +15 -28
  79. package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
  80. package/.claude/workflows/cli-tools-usage.md +221 -177
  81. package/.claude/workflows/windows-platform.md +13 -10
  82. package/.codex/prompts/issue-execute.md +305 -82
  83. package/.codex/prompts/issue-queue.md +22 -0
  84. package/.codex/prompts/lite-execute.md +36 -11
  85. package/README.md +309 -305
  86. package/ccw/README.md +10 -4
  87. package/ccw/dist/cli.d.ts.map +1 -1
  88. package/ccw/dist/cli.js +4 -1
  89. package/ccw/dist/cli.js.map +1 -1
  90. package/ccw/dist/commands/cli.d.ts.map +1 -1
  91. package/ccw/dist/commands/cli.js +131 -34
  92. package/ccw/dist/commands/cli.js.map +1 -1
  93. package/ccw/dist/commands/issue.d.ts +152 -0
  94. package/ccw/dist/commands/issue.d.ts.map +1 -1
  95. package/ccw/dist/commands/issue.js +550 -85
  96. package/ccw/dist/commands/issue.js.map +1 -1
  97. package/ccw/dist/commands/serve.d.ts +1 -0
  98. package/ccw/dist/commands/serve.d.ts.map +1 -1
  99. package/ccw/dist/commands/serve.js +12 -5
  100. package/ccw/dist/commands/serve.js.map +1 -1
  101. package/ccw/dist/commands/stop.d.ts.map +1 -1
  102. package/ccw/dist/commands/stop.js +29 -5
  103. package/ccw/dist/commands/stop.js.map +1 -1
  104. package/ccw/dist/commands/tool.d.ts.map +1 -1
  105. package/ccw/dist/commands/tool.js +19 -2
  106. package/ccw/dist/commands/tool.js.map +1 -1
  107. package/ccw/dist/commands/view.d.ts +1 -0
  108. package/ccw/dist/commands/view.d.ts.map +1 -1
  109. package/ccw/dist/commands/view.js +10 -3
  110. package/ccw/dist/commands/view.js.map +1 -1
  111. package/ccw/dist/config/cli-settings-manager.d.ts +86 -0
  112. package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -0
  113. package/ccw/dist/config/cli-settings-manager.js +392 -0
  114. package/ccw/dist/config/cli-settings-manager.js.map +1 -0
  115. package/ccw/dist/config/litellm-api-config-manager.d.ts +71 -5
  116. package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
  117. package/ccw/dist/config/litellm-api-config-manager.js +290 -20
  118. package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
  119. package/ccw/dist/core/auth/csrf-manager.d.ts +18 -0
  120. package/ccw/dist/core/auth/csrf-manager.d.ts.map +1 -0
  121. package/ccw/dist/core/auth/csrf-manager.js +80 -0
  122. package/ccw/dist/core/auth/csrf-manager.js.map +1 -0
  123. package/ccw/dist/core/auth/csrf-middleware.d.ts +8 -0
  124. package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -0
  125. package/ccw/dist/core/auth/csrf-middleware.js +141 -0
  126. package/ccw/dist/core/auth/csrf-middleware.js.map +1 -0
  127. package/ccw/dist/core/auth/middleware.d.ts +15 -0
  128. package/ccw/dist/core/auth/middleware.d.ts.map +1 -0
  129. package/ccw/dist/core/auth/middleware.js +76 -0
  130. package/ccw/dist/core/auth/middleware.js.map +1 -0
  131. package/ccw/dist/core/auth/token-manager.d.ts +41 -0
  132. package/ccw/dist/core/auth/token-manager.d.ts.map +1 -0
  133. package/ccw/dist/core/auth/token-manager.js +171 -0
  134. package/ccw/dist/core/auth/token-manager.js.map +1 -0
  135. package/ccw/dist/core/cache-manager.d.ts +6 -6
  136. package/ccw/dist/core/cache-manager.d.ts.map +1 -1
  137. package/ccw/dist/core/cache-manager.js +70 -48
  138. package/ccw/dist/core/cache-manager.js.map +1 -1
  139. package/ccw/dist/core/claude-freshness.d.ts.map +1 -1
  140. package/ccw/dist/core/claude-freshness.js +23 -3
  141. package/ccw/dist/core/claude-freshness.js.map +1 -1
  142. package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
  143. package/ccw/dist/core/core-memory-store.js +2 -1
  144. package/ccw/dist/core/core-memory-store.js.map +1 -1
  145. package/ccw/dist/core/cors.d.ts +3 -0
  146. package/ccw/dist/core/cors.d.ts.map +1 -0
  147. package/ccw/dist/core/cors.js +10 -0
  148. package/ccw/dist/core/cors.js.map +1 -0
  149. package/ccw/dist/core/dashboard-generator-patch.js +0 -1
  150. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
  151. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
  152. package/ccw/dist/core/dashboard-generator.js +417 -416
  153. package/ccw/dist/core/dashboard-generator.js.map +1 -1
  154. package/ccw/dist/core/data-aggregator.js +2 -2
  155. package/ccw/dist/core/data-aggregator.js.map +1 -1
  156. package/ccw/dist/core/lite-scanner.d.ts +1 -1
  157. package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
  158. package/ccw/dist/core/lite-scanner.js +130 -127
  159. package/ccw/dist/core/lite-scanner.js.map +1 -1
  160. package/ccw/dist/core/routes/auth-routes.d.ts +12 -0
  161. package/ccw/dist/core/routes/auth-routes.d.ts.map +1 -0
  162. package/ccw/dist/core/routes/auth-routes.js +80 -0
  163. package/ccw/dist/core/routes/auth-routes.js.map +1 -0
  164. package/ccw/dist/core/routes/ccw-routes.d.ts +1 -14
  165. package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
  166. package/ccw/dist/core/routes/ccw-routes.js +9 -4
  167. package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
  168. package/ccw/dist/core/routes/claude-routes.d.ts +1 -14
  169. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
  170. package/ccw/dist/core/routes/claude-routes.js +98 -39
  171. package/ccw/dist/core/routes/claude-routes.js.map +1 -1
  172. package/ccw/dist/core/routes/cli-routes.d.ts +14 -12
  173. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
  174. package/ccw/dist/core/routes/cli-routes.js +122 -43
  175. package/ccw/dist/core/routes/cli-routes.js.map +1 -1
  176. package/ccw/dist/core/routes/cli-settings-routes.d.ts +11 -0
  177. package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -0
  178. package/ccw/dist/core/routes/cli-settings-routes.js +204 -0
  179. package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -0
  180. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts +6 -0
  181. package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -0
  182. package/ccw/dist/core/routes/codexlens/config-handlers.js +1195 -0
  183. package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -0
  184. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts +10 -0
  185. package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -0
  186. package/ccw/dist/core/routes/codexlens/index-handlers.js +322 -0
  187. package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -0
  188. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts +6 -0
  189. package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -0
  190. package/ccw/dist/core/routes/codexlens/semantic-handlers.js +865 -0
  191. package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -0
  192. package/ccw/dist/core/routes/codexlens/utils.d.ts +23 -0
  193. package/ccw/dist/core/routes/codexlens/utils.d.ts.map +1 -0
  194. package/ccw/dist/core/routes/codexlens/utils.js +85 -0
  195. package/ccw/dist/core/routes/codexlens/utils.js.map +1 -0
  196. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts +13 -0
  197. package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts.map +1 -0
  198. package/ccw/dist/core/routes/codexlens/watcher-handlers.js +235 -0
  199. package/ccw/dist/core/routes/codexlens/watcher-handlers.js.map +1 -0
  200. package/ccw/dist/core/routes/codexlens-routes.d.ts +2 -11
  201. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
  202. package/ccw/dist/core/routes/codexlens-routes.js +10 -981
  203. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
  204. package/ccw/dist/core/routes/discovery-routes.d.ts +1 -35
  205. package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -1
  206. package/ccw/dist/core/routes/discovery-routes.js +25 -0
  207. package/ccw/dist/core/routes/discovery-routes.js.map +1 -1
  208. package/ccw/dist/core/routes/files-routes.d.ts +1 -14
  209. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
  210. package/ccw/dist/core/routes/files-routes.js +57 -14
  211. package/ccw/dist/core/routes/files-routes.js.map +1 -1
  212. package/ccw/dist/core/routes/graph-routes.d.ts +1 -14
  213. package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
  214. package/ccw/dist/core/routes/graph-routes.js +36 -37
  215. package/ccw/dist/core/routes/graph-routes.js.map +1 -1
  216. package/ccw/dist/core/routes/help-routes.d.ts +1 -14
  217. package/ccw/dist/core/routes/help-routes.d.ts.map +1 -1
  218. package/ccw/dist/core/routes/help-routes.js +5 -0
  219. package/ccw/dist/core/routes/help-routes.js.map +1 -1
  220. package/ccw/dist/core/routes/hooks-routes.d.ts +4 -14
  221. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
  222. package/ccw/dist/core/routes/hooks-routes.js +43 -21
  223. package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
  224. package/ccw/dist/core/routes/issue-routes.d.ts +1 -34
  225. package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
  226. package/ccw/dist/core/routes/issue-routes.js +24 -0
  227. package/ccw/dist/core/routes/issue-routes.js.map +1 -1
  228. package/ccw/dist/core/routes/litellm-api-routes.d.ts +1 -14
  229. package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
  230. package/ccw/dist/core/routes/litellm-api-routes.js +505 -48
  231. package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
  232. package/ccw/dist/core/routes/litellm-routes.d.ts +1 -14
  233. package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -1
  234. package/ccw/dist/core/routes/litellm-routes.js +28 -11
  235. package/ccw/dist/core/routes/litellm-routes.js.map +1 -1
  236. package/ccw/dist/core/routes/mcp-routes.d.ts +1 -14
  237. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
  238. package/ccw/dist/core/routes/mcp-routes.js +99 -30
  239. package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
  240. package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
  241. package/ccw/dist/core/routes/mcp-templates-db.js +30 -31
  242. package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
  243. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
  244. package/ccw/dist/core/routes/memory-routes.js +74 -24
  245. package/ccw/dist/core/routes/memory-routes.js.map +1 -1
  246. package/ccw/dist/core/routes/nav-status-routes.d.ts +3 -0
  247. package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -0
  248. package/ccw/dist/core/routes/nav-status-routes.js +217 -0
  249. package/ccw/dist/core/routes/nav-status-routes.js.map +1 -0
  250. package/ccw/dist/core/routes/rules-routes.d.ts +1 -14
  251. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
  252. package/ccw/dist/core/routes/rules-routes.js +481 -58
  253. package/ccw/dist/core/routes/rules-routes.js.map +1 -1
  254. package/ccw/dist/core/routes/session-routes.d.ts +1 -14
  255. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
  256. package/ccw/dist/core/routes/session-routes.js +15 -3
  257. package/ccw/dist/core/routes/session-routes.js.map +1 -1
  258. package/ccw/dist/core/routes/skills-routes.d.ts +1 -14
  259. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
  260. package/ccw/dist/core/routes/skills-routes.js +394 -112
  261. package/ccw/dist/core/routes/skills-routes.js.map +1 -1
  262. package/ccw/dist/core/routes/status-routes.d.ts +1 -14
  263. package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
  264. package/ccw/dist/core/routes/status-routes.js +4 -0
  265. package/ccw/dist/core/routes/status-routes.js.map +1 -1
  266. package/ccw/dist/core/routes/system-routes.d.ts +4 -10
  267. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
  268. package/ccw/dist/core/routes/system-routes.js +6 -4
  269. package/ccw/dist/core/routes/system-routes.js.map +1 -1
  270. package/ccw/dist/core/routes/types.d.ts +19 -0
  271. package/ccw/dist/core/routes/types.d.ts.map +1 -0
  272. package/ccw/dist/core/routes/types.js +2 -0
  273. package/ccw/dist/core/routes/types.js.map +1 -0
  274. package/ccw/dist/core/server.d.ts.map +1 -1
  275. package/ccw/dist/core/server.js +201 -29
  276. package/ccw/dist/core/server.js.map +1 -1
  277. package/ccw/dist/core/services/api-key-tester.d.ts +31 -0
  278. package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
  279. package/ccw/dist/core/services/api-key-tester.js +106 -0
  280. package/ccw/dist/core/services/api-key-tester.js.map +1 -0
  281. package/ccw/dist/core/services/health-check-service.d.ts +82 -0
  282. package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
  283. package/ccw/dist/core/services/health-check-service.js +271 -0
  284. package/ccw/dist/core/services/health-check-service.js.map +1 -0
  285. package/ccw/dist/core/websocket.d.ts +9 -7
  286. package/ccw/dist/core/websocket.d.ts.map +1 -1
  287. package/ccw/dist/core/websocket.js +9 -4
  288. package/ccw/dist/core/websocket.js.map +1 -1
  289. package/ccw/dist/tools/claude-cli-tools.d.ts +152 -28
  290. package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
  291. package/ccw/dist/tools/claude-cli-tools.js +490 -100
  292. package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
  293. package/ccw/dist/tools/cli-config-manager.d.ts +24 -8
  294. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
  295. package/ccw/dist/tools/cli-config-manager.js +76 -156
  296. package/ccw/dist/tools/cli-config-manager.js.map +1 -1
  297. package/ccw/dist/tools/cli-executor-core.d.ts +85 -0
  298. package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -0
  299. package/ccw/dist/tools/cli-executor-core.js +1310 -0
  300. package/ccw/dist/tools/cli-executor-core.js.map +1 -0
  301. package/ccw/dist/tools/cli-executor-state.d.ts +241 -0
  302. package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -0
  303. package/ccw/dist/tools/cli-executor-state.js +392 -0
  304. package/ccw/dist/tools/cli-executor-state.js.map +1 -0
  305. package/ccw/dist/tools/cli-executor-utils.d.ts +36 -0
  306. package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -0
  307. package/ccw/dist/tools/cli-executor-utils.js +298 -0
  308. package/ccw/dist/tools/cli-executor-utils.js.map +1 -0
  309. package/ccw/dist/tools/cli-executor.d.ts +3 -377
  310. package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
  311. package/ccw/dist/tools/cli-executor.js +3 -1884
  312. package/ccw/dist/tools/cli-executor.js.map +1 -1
  313. package/ccw/dist/tools/cli-history-store.d.ts +2 -0
  314. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
  315. package/ccw/dist/tools/cli-history-store.js.map +1 -1
  316. package/ccw/dist/tools/cli-output-converter.d.ts +192 -0
  317. package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -0
  318. package/ccw/dist/tools/cli-output-converter.js +1047 -0
  319. package/ccw/dist/tools/cli-output-converter.js.map +1 -0
  320. package/ccw/dist/tools/cli-prompt-builder.d.ts +113 -0
  321. package/ccw/dist/tools/cli-prompt-builder.d.ts.map +1 -0
  322. package/ccw/dist/tools/cli-prompt-builder.js +363 -0
  323. package/ccw/dist/tools/cli-prompt-builder.js.map +1 -0
  324. package/ccw/dist/tools/codex-lens.d.ts +15 -1
  325. package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
  326. package/ccw/dist/tools/codex-lens.js +289 -55
  327. package/ccw/dist/tools/codex-lens.js.map +1 -1
  328. package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -1
  329. package/ccw/dist/tools/detect-changed-modules.js +22 -4
  330. package/ccw/dist/tools/detect-changed-modules.js.map +1 -1
  331. package/ccw/dist/tools/index.d.ts.map +1 -1
  332. package/ccw/dist/tools/index.js +2 -0
  333. package/ccw/dist/tools/index.js.map +1 -1
  334. package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
  335. package/ccw/dist/tools/litellm-client.js +10 -4
  336. package/ccw/dist/tools/litellm-client.js.map +1 -1
  337. package/ccw/dist/tools/litellm-executor.d.ts +2 -4
  338. package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
  339. package/ccw/dist/tools/litellm-executor.js +39 -8
  340. package/ccw/dist/tools/litellm-executor.js.map +1 -1
  341. package/ccw/dist/tools/native-session-discovery.d.ts +2 -0
  342. package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
  343. package/ccw/dist/tools/native-session-discovery.js +197 -1
  344. package/ccw/dist/tools/native-session-discovery.js.map +1 -1
  345. package/ccw/dist/tools/session-manager.d.ts.map +1 -1
  346. package/ccw/dist/tools/session-manager.js +79 -0
  347. package/ccw/dist/tools/session-manager.js.map +1 -1
  348. package/ccw/dist/tools/skill-context-loader.d.ts +15 -0
  349. package/ccw/dist/tools/skill-context-loader.d.ts.map +1 -0
  350. package/ccw/dist/tools/skill-context-loader.js +198 -0
  351. package/ccw/dist/tools/skill-context-loader.js.map +1 -0
  352. package/ccw/dist/tools/smart-search.d.ts +8 -3
  353. package/ccw/dist/tools/smart-search.d.ts.map +1 -1
  354. package/ccw/dist/tools/smart-search.js +378 -75
  355. package/ccw/dist/tools/smart-search.js.map +1 -1
  356. package/ccw/dist/types/cli-settings.d.ts +86 -0
  357. package/ccw/dist/types/cli-settings.d.ts.map +1 -0
  358. package/ccw/dist/types/cli-settings.js +54 -0
  359. package/ccw/dist/types/cli-settings.js.map +1 -0
  360. package/ccw/dist/types/litellm-api-config.d.ts +40 -1
  361. package/ccw/dist/types/litellm-api-config.d.ts.map +1 -1
  362. package/ccw/dist/utils/exec-constants.d.ts +25 -0
  363. package/ccw/dist/utils/exec-constants.d.ts.map +1 -0
  364. package/ccw/dist/utils/exec-constants.js +25 -0
  365. package/ccw/dist/utils/exec-constants.js.map +1 -0
  366. package/ccw/dist/utils/path-resolver.d.ts +1 -0
  367. package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
  368. package/ccw/dist/utils/path-resolver.js +48 -3
  369. package/ccw/dist/utils/path-resolver.js.map +1 -1
  370. package/ccw/dist/utils/path-validator.d.ts.map +1 -1
  371. package/ccw/dist/utils/path-validator.js +25 -6
  372. package/ccw/dist/utils/path-validator.js.map +1 -1
  373. package/ccw/dist/utils/python-utils.d.ts.map +1 -1
  374. package/ccw/dist/utils/python-utils.js +27 -7
  375. package/ccw/dist/utils/python-utils.js.map +1 -1
  376. package/ccw/dist/utils/shell-escape.d.ts +8 -0
  377. package/ccw/dist/utils/shell-escape.d.ts.map +1 -0
  378. package/ccw/dist/utils/shell-escape.js +24 -0
  379. package/ccw/dist/utils/shell-escape.js.map +1 -0
  380. package/ccw/dist/utils/uv-manager.d.ts +167 -0
  381. package/ccw/dist/utils/uv-manager.d.ts.map +1 -0
  382. package/ccw/dist/utils/uv-manager.js +644 -0
  383. package/ccw/dist/utils/uv-manager.js.map +1 -0
  384. package/ccw/src/cli.ts +4 -1
  385. package/ccw/src/commands/cli.ts +132 -34
  386. package/ccw/src/commands/issue.ts +605 -91
  387. package/ccw/src/commands/serve.ts +15 -5
  388. package/ccw/src/commands/stop.ts +32 -5
  389. package/ccw/src/commands/tool.ts +17 -2
  390. package/ccw/src/commands/view.ts +13 -3
  391. package/ccw/src/config/cli-settings-manager.ts +460 -0
  392. package/ccw/src/config/litellm-api-config-manager.ts +392 -57
  393. package/ccw/src/core/auth/csrf-manager.ts +104 -0
  394. package/ccw/src/core/auth/csrf-middleware.ts +159 -0
  395. package/ccw/src/core/auth/middleware.ts +94 -0
  396. package/ccw/src/core/auth/token-manager.ts +219 -0
  397. package/ccw/src/core/cache-manager.ts +64 -52
  398. package/ccw/src/core/claude-freshness.ts +26 -6
  399. package/ccw/src/core/core-memory-store.ts +2 -1
  400. package/ccw/src/core/cors.ts +10 -0
  401. package/ccw/src/core/dashboard-generator-patch.ts +47 -48
  402. package/ccw/src/core/dashboard-generator.ts +797 -744
  403. package/ccw/src/core/data-aggregator.ts +667 -667
  404. package/ccw/src/core/lite-scanner.ts +156 -140
  405. package/ccw/src/core/routes/auth-routes.ts +98 -0
  406. package/ccw/src/core/routes/ccw-routes.ts +10 -20
  407. package/ccw/src/core/routes/claude-routes.ts +101 -51
  408. package/ccw/src/core/routes/cli-routes.ts +152 -55
  409. package/ccw/src/core/routes/cli-settings-routes.ts +232 -0
  410. package/ccw/src/core/routes/codexlens/README.md +37 -0
  411. package/ccw/src/core/routes/codexlens/config-handlers.ts +1269 -0
  412. package/ccw/src/core/routes/codexlens/index-handlers.ts +354 -0
  413. package/ccw/src/core/routes/codexlens/semantic-handlers.ts +931 -0
  414. package/ccw/src/core/routes/codexlens/utils.ts +96 -0
  415. package/ccw/src/core/routes/codexlens/watcher-handlers.ts +265 -0
  416. package/ccw/src/core/routes/codexlens-routes.ts +11 -1044
  417. package/ccw/src/core/routes/discovery-routes.ts +1 -12
  418. package/ccw/src/core/routes/files-routes.ts +112 -40
  419. package/ccw/src/core/routes/graph-routes.ts +39 -46
  420. package/ccw/src/core/routes/help-routes.ts +2 -12
  421. package/ccw/src/core/routes/hooks-routes.ts +83 -44
  422. package/ccw/src/core/routes/issue-routes.ts +1 -12
  423. package/ccw/src/core/routes/litellm-api-routes.ts +566 -60
  424. package/ccw/src/core/routes/litellm-routes.ts +35 -27
  425. package/ccw/src/core/routes/mcp-routes.ts +157 -60
  426. package/ccw/src/core/routes/mcp-routes.ts.backup +549 -550
  427. package/ccw/src/core/routes/mcp-templates-db.ts +267 -268
  428. package/ccw/src/core/routes/memory-routes.ts +76 -22
  429. package/ccw/src/core/routes/nav-status-routes.ts +231 -0
  430. package/ccw/src/core/routes/rules-routes.ts +600 -81
  431. package/ccw/src/core/routes/session-routes.ts +28 -22
  432. package/ccw/src/core/routes/skills-routes.ts +452 -132
  433. package/ccw/src/core/routes/status-routes.ts +1 -12
  434. package/ccw/src/core/routes/system-routes.ts +15 -22
  435. package/ccw/src/core/routes/types.ts +25 -0
  436. package/ccw/src/core/server.ts +651 -468
  437. package/ccw/src/core/services/api-key-tester.ts +137 -0
  438. package/ccw/src/core/services/health-check-service.ts +340 -0
  439. package/ccw/src/core/websocket.ts +20 -12
  440. package/ccw/src/templates/dashboard-css/01-base.css +109 -0
  441. package/ccw/src/templates/dashboard-css/10-cli-status.css +202 -0
  442. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +308 -0
  443. package/ccw/src/templates/dashboard-css/30-core-memory.css +20 -0
  444. package/ccw/src/templates/dashboard-css/31-api-settings.css +751 -14
  445. package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +230 -2
  446. package/ccw/src/templates/dashboard-js/api.js +5 -0
  447. package/ccw/src/templates/dashboard-js/components/cli-status.js +279 -107
  448. package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +262 -20
  449. package/ccw/src/templates/dashboard-js/components/hook-manager.js +105 -5
  450. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +317 -0
  451. package/ccw/src/templates/dashboard-js/components/navigation.js +45 -0
  452. package/ccw/src/templates/dashboard-js/components/notifications.js +128 -0
  453. package/ccw/src/templates/dashboard-js/i18n.js +4438 -3983
  454. package/ccw/src/templates/dashboard-js/main.js +71 -0
  455. package/ccw/src/templates/dashboard-js/services.js +289 -0
  456. package/ccw/src/templates/dashboard-js/views/api-settings.js +5613 -3361
  457. package/ccw/src/templates/dashboard-js/views/claude-manager.js +1 -7
  458. package/ccw/src/templates/dashboard-js/views/cli-manager.js +581 -87
  459. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +6091 -1965
  460. package/ccw/src/templates/dashboard-js/views/core-memory.js +129 -20
  461. package/ccw/src/templates/dashboard-js/views/hook-manager.js +17 -3
  462. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +63 -0
  463. package/ccw/src/templates/dashboard-js/views/project-overview.js +182 -37
  464. package/ccw/src/templates/dashboard-js/views/rules-manager.js +26 -3
  465. package/ccw/src/templates/dashboard-js/views/skills-manager.js +2 -42
  466. package/ccw/src/templates/dashboard.html +6 -0
  467. package/ccw/src/tools/README.md +29 -0
  468. package/ccw/src/tools/claude-cli-tools.ts +640 -125
  469. package/ccw/src/tools/cli-config-manager.ts +102 -172
  470. package/ccw/src/tools/cli-executor-core.ts +1533 -0
  471. package/ccw/src/tools/cli-executor-state.ts +560 -0
  472. package/ccw/src/tools/cli-executor-utils.ts +349 -0
  473. package/ccw/src/tools/cli-executor.ts +3 -2309
  474. package/ccw/src/tools/cli-history-store.ts +2 -0
  475. package/ccw/src/tools/cli-output-converter.ts +1237 -0
  476. package/ccw/src/tools/cli-prompt-builder.ts +487 -0
  477. package/ccw/src/tools/codex-lens.ts +324 -59
  478. package/ccw/src/tools/detect-changed-modules.ts +24 -6
  479. package/ccw/src/tools/index.ts +2 -0
  480. package/ccw/src/tools/litellm-client.ts +10 -4
  481. package/ccw/src/tools/litellm-executor.ts +146 -114
  482. package/ccw/src/tools/native-session-discovery.ts +209 -1
  483. package/ccw/src/tools/session-manager.ts +88 -0
  484. package/ccw/src/tools/skill-context-loader.ts +213 -0
  485. package/ccw/src/tools/smart-search.ts +427 -76
  486. package/ccw/src/types/cli-settings.ts +137 -0
  487. package/ccw/src/types/litellm-api-config.ts +55 -1
  488. package/ccw/src/utils/exec-constants.ts +24 -0
  489. package/ccw/src/utils/path-resolver.ts +49 -3
  490. package/ccw/src/utils/path-validator.ts +28 -6
  491. package/ccw/src/utils/python-utils.ts +140 -121
  492. package/ccw/src/utils/shell-escape.ts +30 -0
  493. package/ccw/src/utils/uv-manager.ts +796 -0
  494. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
  495. package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
  496. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
  497. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
  498. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  499. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  500. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  501. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
  502. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
  503. package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
  504. package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +270 -251
  505. package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +33 -0
  506. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
  507. package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
  508. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
  509. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
  510. package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
  511. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
  512. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
  513. package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
  514. package/ccw-litellm/src/ccw_litellm/config/loader.py +343 -316
  515. package/ccw-litellm/src/ccw_litellm/config/models.py +162 -130
  516. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
  517. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
  518. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
  519. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
  520. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
  521. package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
  522. package/codex-lens/pyproject.toml +43 -0
  523. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
  524. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
  525. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
  526. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
  527. package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
  528. package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
  529. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  530. package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
  531. package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
  532. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  533. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
  534. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
  535. package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
  536. package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
  537. package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
  538. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
  539. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  540. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
  541. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.pyc +0 -0
  542. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  543. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-310.pyc +0 -0
  544. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.pyc +0 -0
  545. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  546. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-310.pyc +0 -0
  547. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.pyc +0 -0
  548. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  549. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-310.pyc +0 -0
  550. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
  551. package/codex-lens/src/codexlens/cli/commands.py +4416 -2295
  552. package/codex-lens/src/codexlens/cli/embedding_manager.py +767 -14
  553. package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
  554. package/codex-lens/src/codexlens/config.py +321 -12
  555. package/codex-lens/src/codexlens/entities.py +4 -1
  556. package/codex-lens/src/codexlens/env_config.py +298 -0
  557. package/codex-lens/src/codexlens/indexing/__init__.py +23 -1
  558. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  559. package/codex-lens/src/codexlens/indexing/__pycache__/embedding.cpython-313.pyc +0 -0
  560. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  561. package/codex-lens/src/codexlens/indexing/embedding.py +582 -0
  562. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +62 -28
  563. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
  564. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
  565. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
  566. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.pyc +0 -0
  567. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  568. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-310.pyc +0 -0
  569. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
  570. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
  571. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
  572. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  573. package/codex-lens/src/codexlens/parsers/factory.py +139 -10
  574. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +487 -13
  575. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
  576. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
  577. package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
  578. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
  579. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.pyc +0 -0
  580. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  581. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  582. package/codex-lens/src/codexlens/search/__pycache__/graph_expander.cpython-313.pyc +0 -0
  583. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
  584. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
  585. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  586. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
  587. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
  588. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  589. package/codex-lens/src/codexlens/search/binary_searcher.py +277 -0
  590. package/codex-lens/src/codexlens/search/chain_search.py +1642 -8
  591. package/codex-lens/src/codexlens/search/enrichment.py +21 -0
  592. package/codex-lens/src/codexlens/search/graph_expander.py +264 -0
  593. package/codex-lens/src/codexlens/search/hybrid_search.py +772 -37
  594. package/codex-lens/src/codexlens/search/ranking.py +347 -8
  595. package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +225 -0
  596. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
  597. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
  598. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
  599. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
  600. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  601. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
  602. package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
  603. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
  604. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
  605. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
  606. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
  607. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
  608. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
  609. package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
  610. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
  611. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
  612. package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
  613. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
  614. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
  615. package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
  616. package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
  617. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
  618. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
  619. package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
  620. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
  621. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.pyc +0 -0
  622. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  623. package/codex-lens/src/codexlens/semantic/ann_index.py +654 -0
  624. package/codex-lens/src/codexlens/semantic/factory.py +63 -3
  625. package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
  626. package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
  627. package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
  628. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
  629. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
  630. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
  631. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
  632. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
  633. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
  634. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
  635. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
  636. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
  637. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
  638. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
  639. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
  640. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
  641. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
  642. package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
  643. package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
  644. package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
  645. package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
  646. package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
  647. package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
  648. package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
  649. package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
  650. package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
  651. package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
  652. package/codex-lens/src/codexlens/storage/__init__.py +3 -0
  653. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
  654. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
  655. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  656. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
  657. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
  658. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  659. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
  660. package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
  661. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
  662. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
  663. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  664. package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
  665. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
  666. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
  667. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
  668. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
  669. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
  670. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
  671. package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
  672. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
  673. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.pyc +0 -0
  674. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  675. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-310.pyc +0 -0
  676. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
  677. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
  678. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
  679. package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
  680. package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
  681. package/codex-lens/src/codexlens/storage/index_tree.py +194 -23
  682. package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
  683. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
  684. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
  685. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
  686. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
  687. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
  688. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
  689. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
  690. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
  691. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
  692. package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
  693. package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
  694. package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
  695. package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
  696. package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
  697. package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
  698. package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
  699. package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
  700. package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
  701. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
  702. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
  703. package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
  704. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
  705. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
  706. package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
  707. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
  708. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
  709. package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
  710. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
  711. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
  712. package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
  713. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
  714. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
  715. package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
  716. package/codex-lens/src/codexlens/watcher/events.py +82 -0
  717. package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
  718. package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
  719. package/codex-lens/src/codexlens/watcher/manager.py +255 -0
  720. package/package.json +4 -1
  721. package/.claude/commands/workflow/docs/analyze.md +0 -1467
  722. package/.claude/commands/workflow/docs/copyright.md +0 -1265
  723. package/.claude/skills/command-guide/SKILL.md +0 -388
  724. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
  725. package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
  726. package/.claude/skills/command-guide/guides/examples.md +0 -537
  727. package/.claude/skills/command-guide/guides/getting-started.md +0 -242
  728. package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
  729. package/.claude/skills/command-guide/guides/index-structure.md +0 -326
  730. package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
  731. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
  732. package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
  733. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
  734. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
  735. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
  736. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
  737. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
  738. package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
  739. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
  740. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
  741. package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
  742. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
  743. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
  744. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
  745. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
  746. package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
  747. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
  748. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
  749. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
  750. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
  751. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
  752. package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
  753. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
  754. package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
  755. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
  756. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
  757. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
  758. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
  759. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
  760. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
  761. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
  762. package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
  763. package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
  764. package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
  765. package/.claude/skills/command-guide/reference/commands/version.md +0 -254
  766. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
  767. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
  768. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
  769. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
  770. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
  771. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
  772. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
  773. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
  774. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  775. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
  776. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
  777. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
  778. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
  779. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
  780. package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
  781. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
  782. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
  783. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
  784. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
  785. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
  786. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
  787. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
  788. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
  789. package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
  790. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
  791. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
  792. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
  793. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
  794. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
  795. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
  796. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
  797. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
  798. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
  799. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
  800. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
  801. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
  802. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
  803. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  804. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
  805. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
  806. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
  807. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
  808. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
  809. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
  810. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
  811. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
  812. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
  813. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
  814. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
  815. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
  816. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
  817. package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
  818. package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
  819. package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
  820. package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
  821. package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
  822. package/.claude/skills/command-guide/templates/issue-question.md +0 -141
@@ -1,667 +1,667 @@
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 ProjectGuidelines {
114
- conventions: {
115
- coding_style: string[];
116
- naming_patterns: string[];
117
- file_structure: string[];
118
- documentation: string[];
119
- };
120
- constraints: {
121
- architecture: string[];
122
- tech_stack: string[];
123
- performance: string[];
124
- security: string[];
125
- };
126
- quality_rules: Array<{ rule: string; scope: string; enforced_by?: string }>;
127
- learnings: Array<{
128
- date: string;
129
- session_id?: string;
130
- insight: string;
131
- context?: string;
132
- category?: string;
133
- }>;
134
- _metadata?: {
135
- created_at: string;
136
- updated_at?: string;
137
- version: string;
138
- };
139
- }
140
-
141
- interface ProjectOverview {
142
- projectName: string;
143
- description: string;
144
- initializedAt: string | null;
145
- technologyStack: {
146
- languages: string[];
147
- frameworks: string[];
148
- build_tools: string[];
149
- test_frameworks: string[];
150
- };
151
- architecture: {
152
- style: string;
153
- layers: string[];
154
- patterns: string[];
155
- };
156
- keyComponents: string[];
157
- features: unknown[];
158
- developmentIndex: {
159
- feature: unknown[];
160
- enhancement: unknown[];
161
- bugfix: unknown[];
162
- refactor: unknown[];
163
- docs: unknown[];
164
- };
165
- statistics: {
166
- total_features: number;
167
- total_sessions: number;
168
- last_updated: string | null;
169
- };
170
- metadata: {
171
- initialized_by: string;
172
- analysis_timestamp: string | null;
173
- analysis_mode: string;
174
- };
175
- guidelines: ProjectGuidelines | null;
176
- }
177
-
178
- /**
179
- * Aggregate all data for dashboard rendering (with caching)
180
- * @param sessions - Scanned sessions from session-scanner
181
- * @param workflowDir - Path to .workflow directory
182
- * @returns Aggregated dashboard data
183
- */
184
- export async function aggregateData(sessions: ScanSessionsResult, workflowDir: string): Promise<DashboardData> {
185
- // Initialize cache manager
186
- const cache = createDashboardCache(workflowDir);
187
-
188
- // Prepare paths to watch for changes (includes both new dual files and legacy)
189
- const watchPaths = [
190
- join(workflowDir, 'active'),
191
- join(workflowDir, 'archives'),
192
- join(workflowDir, 'project-tech.json'),
193
- join(workflowDir, 'project-guidelines.json'),
194
- join(workflowDir, 'project.json'), // Legacy support
195
- ...sessions.active.map(s => s.path),
196
- ...sessions.archived.map(s => s.path)
197
- ];
198
-
199
- // Check cache first
200
- const cachedData = cache.get(watchPaths);
201
- if (cachedData !== null) {
202
- console.log('Using cached dashboard data');
203
- return cachedData;
204
- }
205
-
206
- console.log('Cache miss - regenerating dashboard data');
207
-
208
- const data: DashboardData = {
209
- generatedAt: new Date().toISOString(),
210
- activeSessions: [],
211
- archivedSessions: [],
212
- liteTasks: {
213
- litePlan: [],
214
- liteFix: []
215
- },
216
- reviewData: null,
217
- projectOverview: null,
218
- statistics: {
219
- totalSessions: 0,
220
- activeSessions: 0,
221
- totalTasks: 0,
222
- completedTasks: 0,
223
- reviewFindings: 0,
224
- litePlanCount: 0,
225
- liteFixCount: 0
226
- }
227
- };
228
-
229
- // Process active sessions
230
- for (const session of sessions.active) {
231
- const sessionData = await processSession(session, true);
232
- data.activeSessions.push(sessionData);
233
- data.statistics.totalTasks += sessionData.tasks.length;
234
- data.statistics.completedTasks += sessionData.tasks.filter(t => t.status === 'completed').length;
235
- }
236
-
237
- // Process archived sessions
238
- for (const session of sessions.archived) {
239
- const sessionData = await processSession(session, false);
240
- data.archivedSessions.push(sessionData);
241
- data.statistics.totalTasks += sessionData.taskCount || 0;
242
- data.statistics.completedTasks += sessionData.taskCount || 0;
243
- }
244
-
245
- // Aggregate review data if present
246
- if (sessions.hasReviewData) {
247
- data.reviewData = await aggregateReviewData(sessions.active);
248
- data.statistics.reviewFindings = data.reviewData.totalFindings;
249
- }
250
-
251
- data.statistics.totalSessions = sessions.active.length + sessions.archived.length;
252
- data.statistics.activeSessions = sessions.active.length;
253
-
254
- // Scan and include lite tasks
255
- try {
256
- const liteTasks = await scanLiteTasks(workflowDir);
257
- data.liteTasks = liteTasks;
258
- data.statistics.litePlanCount = liteTasks.litePlan.length;
259
- data.statistics.liteFixCount = liteTasks.liteFix.length;
260
- } catch (err) {
261
- console.error('Error scanning lite tasks:', (err as Error).message);
262
- }
263
-
264
- // Load project overview from project.json
265
- try {
266
- data.projectOverview = loadProjectOverview(workflowDir);
267
- } catch (err) {
268
- console.error('Error loading project overview:', (err as Error).message);
269
- }
270
-
271
- // Store in cache before returning
272
- cache.set(data, watchPaths);
273
-
274
- return data;
275
- }
276
-
277
- /**
278
- * Process a single session, loading tasks and review info
279
- * @param session - Session object from scanner
280
- * @param isActive - Whether session is active
281
- * @returns Processed session data
282
- */
283
- async function processSession(session: SessionInput, isActive: boolean): Promise<SessionData> {
284
- const result: SessionData = {
285
- session_id: session.session_id || session.id || '',
286
- project: session.project || session.description || session.session_id || session.id || '',
287
- status: session.status || (isActive ? 'active' : 'archived'),
288
- type: session.type || 'workflow', // Session type (workflow, review, test, docs)
289
- workflow_type: session.workflow_type || null, // Original workflow_type for reference
290
- created_at: session.created || session.created_at || null, // Prefer 'created' from SessionMetadata, fallback to 'created_at'
291
- archived_at: session.archived_at || null, // Raw ISO string - let frontend format
292
- path: session.path,
293
- tasks: [],
294
- taskCount: 0,
295
- hasReview: false,
296
- reviewSummary: null,
297
- reviewDimensions: []
298
- };
299
-
300
- // Load tasks for active sessions (full details)
301
- if (isActive) {
302
- const taskDir = join(session.path, '.task');
303
- if (existsSync(taskDir)) {
304
- const taskFiles = await safeGlob('IMPL-*.json', taskDir);
305
- for (const taskFile of taskFiles) {
306
- try {
307
- const taskData = JSON.parse(readFileSync(join(taskDir, taskFile), 'utf8')) as Record<string, unknown>;
308
- result.tasks.push({
309
- task_id: (taskData.id as string) || basename(taskFile, '.json'),
310
- title: (taskData.title as string) || 'Untitled Task',
311
- status: (taskData.status as string) || 'pending',
312
- type: ((taskData.meta as Record<string, unknown>)?.type as string) || 'task',
313
- meta: (taskData.meta as Record<string, unknown>) || {},
314
- context: (taskData.context as Record<string, unknown>) || {},
315
- flow_control: (taskData.flow_control as Record<string, unknown>) || {}
316
- });
317
- } catch {
318
- // Skip invalid task files
319
- }
320
- }
321
- // Sort tasks by ID
322
- result.tasks.sort((a, b) => sortTaskIds(a.task_id, b.task_id));
323
- }
324
- result.taskCount = result.tasks.length;
325
-
326
- // Check for review data
327
- const reviewDir = join(session.path, '.review');
328
- if (existsSync(reviewDir)) {
329
- result.hasReview = true;
330
- result.reviewSummary = loadReviewSummary(reviewDir);
331
- // Load dimension data for review sessions
332
- if (session.type === 'review') {
333
- result.reviewDimensions = await loadDimensionData(reviewDir);
334
- }
335
- }
336
- } else {
337
- // For archived, also load tasks (same as active)
338
- const taskDir = join(session.path, '.task');
339
- if (existsSync(taskDir)) {
340
- const taskFiles = await safeGlob('IMPL-*.json', taskDir);
341
- for (const taskFile of taskFiles) {
342
- try {
343
- const taskData = JSON.parse(readFileSync(join(taskDir, taskFile), 'utf8')) as Record<string, unknown>;
344
- result.tasks.push({
345
- task_id: (taskData.id as string) || basename(taskFile, '.json'),
346
- title: (taskData.title as string) || 'Untitled Task',
347
- status: (taskData.status as string) || 'completed', // Archived tasks are usually completed
348
- type: ((taskData.meta as Record<string, unknown>)?.type as string) || 'task'
349
- });
350
- } catch {
351
- // Skip invalid task files
352
- }
353
- }
354
- // Sort tasks by ID
355
- result.tasks.sort((a, b) => sortTaskIds(a.task_id, b.task_id));
356
- result.taskCount = result.tasks.length;
357
- }
358
-
359
- // Check for review data in archived sessions too
360
- const reviewDir = join(session.path, '.review');
361
- if (existsSync(reviewDir)) {
362
- result.hasReview = true;
363
- result.reviewSummary = loadReviewSummary(reviewDir);
364
- // Load dimension data for review sessions
365
- if (session.type === 'review') {
366
- result.reviewDimensions = await loadDimensionData(reviewDir);
367
- }
368
- }
369
- }
370
-
371
- return result;
372
- }
373
-
374
- /**
375
- * Aggregate review data from all active sessions with reviews
376
- * @param activeSessions - Active session objects
377
- * @returns Aggregated review data
378
- */
379
- async function aggregateReviewData(activeSessions: SessionInput[]): Promise<ReviewData> {
380
- const reviewData: ReviewData = {
381
- totalFindings: 0,
382
- severityDistribution: { critical: 0, high: 0, medium: 0, low: 0 },
383
- dimensionSummary: {},
384
- sessions: []
385
- };
386
-
387
- for (const session of activeSessions) {
388
- const reviewDir = join(session.path, '.review');
389
- if (!existsSync(reviewDir)) continue;
390
-
391
- const reviewProgress = loadReviewProgress(reviewDir);
392
- const dimensionData = await loadDimensionData(reviewDir);
393
-
394
- if (reviewProgress || dimensionData.length > 0) {
395
- const sessionReview: SessionReviewData = {
396
- session_id: session.session_id || session.id || '',
397
- progress: reviewProgress,
398
- dimensions: dimensionData,
399
- findings: []
400
- };
401
-
402
- // Collect and count findings
403
- for (const dim of dimensionData) {
404
- if (dim.findings && Array.isArray(dim.findings)) {
405
- for (const finding of dim.findings) {
406
- const severity = (finding.severity || 'low').toLowerCase();
407
- if (reviewData.severityDistribution.hasOwnProperty(severity)) {
408
- reviewData.severityDistribution[severity as keyof typeof reviewData.severityDistribution]++;
409
- }
410
- reviewData.totalFindings++;
411
- sessionReview.findings.push({
412
- ...finding,
413
- dimension: dim.name
414
- });
415
- }
416
- }
417
-
418
- // Track dimension summary
419
- if (!reviewData.dimensionSummary[dim.name]) {
420
- reviewData.dimensionSummary[dim.name] = { count: 0, sessions: [] };
421
- }
422
- reviewData.dimensionSummary[dim.name].count += dim.findings?.length || 0;
423
- reviewData.dimensionSummary[dim.name].sessions.push(session.session_id || session.id || '');
424
- }
425
-
426
- reviewData.sessions.push(sessionReview);
427
- }
428
- }
429
-
430
- return reviewData;
431
- }
432
-
433
- /**
434
- * Load review progress from review-progress.json
435
- * @param reviewDir - Path to .review directory
436
- * @returns Review progress data or null
437
- */
438
- function loadReviewProgress(reviewDir: string): unknown | null {
439
- const progressFile = join(reviewDir, 'review-progress.json');
440
- if (!existsSync(progressFile)) return null;
441
- try {
442
- return JSON.parse(readFileSync(progressFile, 'utf8'));
443
- } catch {
444
- return null;
445
- }
446
- }
447
-
448
- /**
449
- * Load review summary from review-state.json
450
- * @param reviewDir - Path to .review directory
451
- * @returns Review summary or null
452
- */
453
- function loadReviewSummary(reviewDir: string): ReviewSummary | null {
454
- const stateFile = join(reviewDir, 'review-state.json');
455
- if (!existsSync(stateFile)) return null;
456
- try {
457
- const state = JSON.parse(readFileSync(stateFile, 'utf8')) as Record<string, unknown>;
458
- return {
459
- phase: (state.phase as string) || 'unknown',
460
- severityDistribution: (state.severity_distribution as Record<string, number>) || {},
461
- criticalFiles: ((state.critical_files as string[]) || []).slice(0, 3),
462
- status: (state.status as string) || 'in_progress'
463
- };
464
- } catch {
465
- return null;
466
- }
467
- }
468
-
469
- /**
470
- * Load dimension data from .review/dimensions/
471
- * @param reviewDir - Path to .review directory
472
- * @returns Array of dimension data
473
- */
474
- async function loadDimensionData(reviewDir: string): Promise<DimensionData[]> {
475
- const dimensionsDir = join(reviewDir, 'dimensions');
476
- if (!existsSync(dimensionsDir)) return [];
477
-
478
- const dimensions: DimensionData[] = [];
479
- const dimFiles = await safeGlob('*.json', dimensionsDir);
480
-
481
- for (const file of dimFiles) {
482
- try {
483
- const data = JSON.parse(readFileSync(join(dimensionsDir, file), 'utf8'));
484
- // Handle array structure: [ { findings: [...], summary: {...} } ]
485
- let findings: Finding[] = [];
486
- let summary: unknown | null = null;
487
- let status = 'completed';
488
-
489
- if (Array.isArray(data) && data.length > 0) {
490
- const dimData = data[0] as Record<string, unknown>;
491
- findings = (dimData.findings as Finding[]) || [];
492
- summary = dimData.summary || null;
493
- status = (dimData.status as string) || 'completed';
494
- } else if ((data as Record<string, unknown>).findings) {
495
- const dataObj = data as Record<string, unknown>;
496
- findings = (dataObj.findings as Finding[]) || [];
497
- summary = dataObj.summary || null;
498
- status = (dataObj.status as string) || 'completed';
499
- }
500
-
501
- dimensions.push({
502
- name: basename(file, '.json'),
503
- findings: findings,
504
- summary: summary,
505
- status: status
506
- });
507
- } catch {
508
- // Skip invalid dimension files
509
- }
510
- }
511
-
512
- return dimensions;
513
- }
514
-
515
- /**
516
- * Safe glob wrapper that returns empty array on error
517
- * @param pattern - Glob pattern
518
- * @param cwd - Current working directory
519
- * @returns Array of matching file names
520
- */
521
- async function safeGlob(pattern: string, cwd: string): Promise<string[]> {
522
- try {
523
- return await glob(pattern, { cwd, absolute: false });
524
- } catch {
525
- return [];
526
- }
527
- }
528
-
529
- // formatDate removed - dates are now passed as raw ISO strings
530
- // Frontend (dashboard.js) handles all date formatting
531
-
532
- /**
533
- * Sort task IDs numerically (IMPL-1, IMPL-2, IMPL-1.1, etc.)
534
- * @param a - First task ID
535
- * @param b - Second task ID
536
- * @returns Comparison result
537
- */
538
- function sortTaskIds(a: string, b: string): number {
539
- const parseId = (id: string): [number, number] => {
540
- const match = id.match(/IMPL-(\d+)(?:\.(\d+))?/);
541
- if (!match) return [0, 0];
542
- return [parseInt(match[1]), parseInt(match[2] || '0')];
543
- };
544
- const [a1, a2] = parseId(a);
545
- const [b1, b2] = parseId(b);
546
- return a1 - b1 || a2 - b2;
547
- }
548
-
549
- /**
550
- * Load project overview from project-tech.json and project-guidelines.json
551
- * Supports dual file structure with backward compatibility for legacy project.json
552
- * @param workflowDir - Path to .workflow directory
553
- * @returns Project overview data or null if not found
554
- */
555
- function loadProjectOverview(workflowDir: string): ProjectOverview | null {
556
- const techFile = join(workflowDir, 'project-tech.json');
557
- const guidelinesFile = join(workflowDir, 'project-guidelines.json');
558
- const legacyFile = join(workflowDir, 'project.json');
559
-
560
- // Check for new dual file structure first, fallback to legacy
561
- const useLegacy = !existsSync(techFile) && existsSync(legacyFile);
562
- const projectFile = useLegacy ? legacyFile : techFile;
563
-
564
- if (!existsSync(projectFile)) {
565
- console.log(`Project file not found at: ${projectFile}`);
566
- return null;
567
- }
568
-
569
- try {
570
- const fileContent = readFileSync(projectFile, 'utf8');
571
- const projectData = JSON.parse(fileContent) as Record<string, unknown>;
572
-
573
- console.log(`Successfully loaded project overview: ${projectData.project_name || 'Unknown'} (${useLegacy ? 'legacy' : 'tech'})`);
574
-
575
- // Parse tech data (compatible with both legacy and new structure)
576
- const overview = projectData.overview as Record<string, unknown> | undefined;
577
- const technologyAnalysis = projectData.technology_analysis as Record<string, unknown> | undefined;
578
- const developmentStatus = projectData.development_status as Record<string, unknown> | undefined;
579
-
580
- // Support both old and new schema field names
581
- const technologyStack = (overview?.technology_stack || technologyAnalysis?.technology_stack) as Record<string, unknown[]> | undefined;
582
- const architecture = (overview?.architecture || technologyAnalysis?.architecture) as Record<string, unknown> | undefined;
583
- const developmentIndex = (projectData.development_index || developmentStatus?.development_index) as Record<string, unknown[]> | undefined;
584
- const statistics = (projectData.statistics || developmentStatus?.statistics) as Record<string, unknown> | undefined;
585
- const metadata = projectData._metadata as Record<string, unknown> | undefined;
586
-
587
- // Load guidelines from separate file if exists
588
- let guidelines: ProjectGuidelines | null = null;
589
- if (existsSync(guidelinesFile)) {
590
- try {
591
- const guidelinesContent = readFileSync(guidelinesFile, 'utf8');
592
- const guidelinesData = JSON.parse(guidelinesContent) as Record<string, unknown>;
593
-
594
- const conventions = guidelinesData.conventions as Record<string, string[]> | undefined;
595
- const constraints = guidelinesData.constraints as Record<string, string[]> | undefined;
596
-
597
- guidelines = {
598
- conventions: {
599
- coding_style: conventions?.coding_style || [],
600
- naming_patterns: conventions?.naming_patterns || [],
601
- file_structure: conventions?.file_structure || [],
602
- documentation: conventions?.documentation || []
603
- },
604
- constraints: {
605
- architecture: constraints?.architecture || [],
606
- tech_stack: constraints?.tech_stack || [],
607
- performance: constraints?.performance || [],
608
- security: constraints?.security || []
609
- },
610
- quality_rules: (guidelinesData.quality_rules as Array<{ rule: string; scope: string; enforced_by?: string }>) || [],
611
- learnings: (guidelinesData.learnings as Array<{
612
- date: string;
613
- session_id?: string;
614
- insight: string;
615
- context?: string;
616
- category?: string;
617
- }>) || [],
618
- _metadata: guidelinesData._metadata as ProjectGuidelines['_metadata'] | undefined
619
- };
620
- console.log(`Successfully loaded project guidelines`);
621
- } catch (guidelinesErr) {
622
- console.error(`Failed to parse project-guidelines.json:`, (guidelinesErr as Error).message);
623
- }
624
- }
625
-
626
- return {
627
- projectName: (projectData.project_name as string) || 'Unknown',
628
- description: (overview?.description as string) || '',
629
- initializedAt: (projectData.initialized_at as string) || null,
630
- technologyStack: {
631
- languages: (technologyStack?.languages as string[]) || [],
632
- frameworks: (technologyStack?.frameworks as string[]) || [],
633
- build_tools: (technologyStack?.build_tools as string[]) || [],
634
- test_frameworks: (technologyStack?.test_frameworks as string[]) || []
635
- },
636
- architecture: {
637
- style: (architecture?.style as string) || 'Unknown',
638
- layers: (architecture?.layers as string[]) || [],
639
- patterns: (architecture?.patterns as string[]) || []
640
- },
641
- keyComponents: (overview?.key_components as string[]) || [],
642
- features: (projectData.features as unknown[]) || [],
643
- developmentIndex: {
644
- feature: (developmentIndex?.feature as unknown[]) || [],
645
- enhancement: (developmentIndex?.enhancement as unknown[]) || [],
646
- bugfix: (developmentIndex?.bugfix as unknown[]) || [],
647
- refactor: (developmentIndex?.refactor as unknown[]) || [],
648
- docs: (developmentIndex?.docs as unknown[]) || []
649
- },
650
- statistics: {
651
- total_features: (statistics?.total_features as number) || 0,
652
- total_sessions: (statistics?.total_sessions as number) || 0,
653
- last_updated: (statistics?.last_updated as string) || null
654
- },
655
- metadata: {
656
- initialized_by: (metadata?.initialized_by as string) || 'unknown',
657
- analysis_timestamp: (metadata?.analysis_timestamp as string) || null,
658
- analysis_mode: (metadata?.analysis_mode as string) || 'unknown'
659
- },
660
- guidelines
661
- };
662
- } catch (err) {
663
- console.error(`Failed to parse project file at ${projectFile}:`, (err as Error).message);
664
- console.error('Error stack:', (err as Error).stack);
665
- return null;
666
- }
667
- }
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 ProjectGuidelines {
114
+ conventions: {
115
+ coding_style: string[];
116
+ naming_patterns: string[];
117
+ file_structure: string[];
118
+ documentation: string[];
119
+ };
120
+ constraints: {
121
+ architecture: string[];
122
+ tech_stack: string[];
123
+ performance: string[];
124
+ security: string[];
125
+ };
126
+ quality_rules: Array<{ rule: string; scope: string; enforced_by?: string }>;
127
+ learnings: Array<{
128
+ date: string;
129
+ session_id?: string;
130
+ insight: string;
131
+ context?: string;
132
+ category?: string;
133
+ }>;
134
+ _metadata?: {
135
+ created_at: string;
136
+ updated_at?: string;
137
+ version: string;
138
+ };
139
+ }
140
+
141
+ interface ProjectOverview {
142
+ projectName: string;
143
+ description: string;
144
+ initializedAt: string | null;
145
+ technologyStack: {
146
+ languages: string[];
147
+ frameworks: string[];
148
+ build_tools: string[];
149
+ test_frameworks: string[];
150
+ };
151
+ architecture: {
152
+ style: string;
153
+ layers: string[];
154
+ patterns: string[];
155
+ };
156
+ keyComponents: string[];
157
+ features: unknown[];
158
+ developmentIndex: {
159
+ feature: unknown[];
160
+ enhancement: unknown[];
161
+ bugfix: unknown[];
162
+ refactor: unknown[];
163
+ docs: unknown[];
164
+ };
165
+ statistics: {
166
+ total_features: number;
167
+ total_sessions: number;
168
+ last_updated: string | null;
169
+ };
170
+ metadata: {
171
+ initialized_by: string;
172
+ analysis_timestamp: string | null;
173
+ analysis_mode: string;
174
+ };
175
+ guidelines: ProjectGuidelines | null;
176
+ }
177
+
178
+ /**
179
+ * Aggregate all data for dashboard rendering (with caching)
180
+ * @param sessions - Scanned sessions from session-scanner
181
+ * @param workflowDir - Path to .workflow directory
182
+ * @returns Aggregated dashboard data
183
+ */
184
+ export async function aggregateData(sessions: ScanSessionsResult, workflowDir: string): Promise<DashboardData> {
185
+ // Initialize cache manager
186
+ const cache = createDashboardCache(workflowDir);
187
+
188
+ // Prepare paths to watch for changes (includes both new dual files and legacy)
189
+ const watchPaths = [
190
+ join(workflowDir, 'active'),
191
+ join(workflowDir, 'archives'),
192
+ join(workflowDir, 'project-tech.json'),
193
+ join(workflowDir, 'project-guidelines.json'),
194
+ join(workflowDir, 'project.json'), // Legacy support
195
+ ...sessions.active.map(s => s.path),
196
+ ...sessions.archived.map(s => s.path)
197
+ ];
198
+
199
+ // Check cache first
200
+ const cachedData = await cache.get(watchPaths);
201
+ if (cachedData !== null) {
202
+ console.log('Using cached dashboard data');
203
+ return cachedData;
204
+ }
205
+
206
+ console.log('Cache miss - regenerating dashboard data');
207
+
208
+ const data: DashboardData = {
209
+ generatedAt: new Date().toISOString(),
210
+ activeSessions: [],
211
+ archivedSessions: [],
212
+ liteTasks: {
213
+ litePlan: [],
214
+ liteFix: []
215
+ },
216
+ reviewData: null,
217
+ projectOverview: null,
218
+ statistics: {
219
+ totalSessions: 0,
220
+ activeSessions: 0,
221
+ totalTasks: 0,
222
+ completedTasks: 0,
223
+ reviewFindings: 0,
224
+ litePlanCount: 0,
225
+ liteFixCount: 0
226
+ }
227
+ };
228
+
229
+ // Process active sessions
230
+ for (const session of sessions.active) {
231
+ const sessionData = await processSession(session, true);
232
+ data.activeSessions.push(sessionData);
233
+ data.statistics.totalTasks += sessionData.tasks.length;
234
+ data.statistics.completedTasks += sessionData.tasks.filter(t => t.status === 'completed').length;
235
+ }
236
+
237
+ // Process archived sessions
238
+ for (const session of sessions.archived) {
239
+ const sessionData = await processSession(session, false);
240
+ data.archivedSessions.push(sessionData);
241
+ data.statistics.totalTasks += sessionData.taskCount || 0;
242
+ data.statistics.completedTasks += sessionData.taskCount || 0;
243
+ }
244
+
245
+ // Aggregate review data if present
246
+ if (sessions.hasReviewData) {
247
+ data.reviewData = await aggregateReviewData(sessions.active);
248
+ data.statistics.reviewFindings = data.reviewData.totalFindings;
249
+ }
250
+
251
+ data.statistics.totalSessions = sessions.active.length + sessions.archived.length;
252
+ data.statistics.activeSessions = sessions.active.length;
253
+
254
+ // Scan and include lite tasks
255
+ try {
256
+ const liteTasks = await scanLiteTasks(workflowDir);
257
+ data.liteTasks = liteTasks;
258
+ data.statistics.litePlanCount = liteTasks.litePlan.length;
259
+ data.statistics.liteFixCount = liteTasks.liteFix.length;
260
+ } catch (err) {
261
+ console.error('Error scanning lite tasks:', (err as Error).message);
262
+ }
263
+
264
+ // Load project overview from project.json
265
+ try {
266
+ data.projectOverview = loadProjectOverview(workflowDir);
267
+ } catch (err) {
268
+ console.error('Error loading project overview:', (err as Error).message);
269
+ }
270
+
271
+ // Store in cache before returning
272
+ await cache.set(data, watchPaths);
273
+
274
+ return data;
275
+ }
276
+
277
+ /**
278
+ * Process a single session, loading tasks and review info
279
+ * @param session - Session object from scanner
280
+ * @param isActive - Whether session is active
281
+ * @returns Processed session data
282
+ */
283
+ async function processSession(session: SessionInput, isActive: boolean): Promise<SessionData> {
284
+ const result: SessionData = {
285
+ session_id: session.session_id || session.id || '',
286
+ project: session.project || session.description || session.session_id || session.id || '',
287
+ status: session.status || (isActive ? 'active' : 'archived'),
288
+ type: session.type || 'workflow', // Session type (workflow, review, test, docs)
289
+ workflow_type: session.workflow_type || null, // Original workflow_type for reference
290
+ created_at: session.created || session.created_at || null, // Prefer 'created' from SessionMetadata, fallback to 'created_at'
291
+ archived_at: session.archived_at || null, // Raw ISO string - let frontend format
292
+ path: session.path,
293
+ tasks: [],
294
+ taskCount: 0,
295
+ hasReview: false,
296
+ reviewSummary: null,
297
+ reviewDimensions: []
298
+ };
299
+
300
+ // Load tasks for active sessions (full details)
301
+ if (isActive) {
302
+ const taskDir = join(session.path, '.task');
303
+ if (existsSync(taskDir)) {
304
+ const taskFiles = await safeGlob('IMPL-*.json', taskDir);
305
+ for (const taskFile of taskFiles) {
306
+ try {
307
+ const taskData = JSON.parse(readFileSync(join(taskDir, taskFile), 'utf8')) as Record<string, unknown>;
308
+ result.tasks.push({
309
+ task_id: (taskData.id as string) || basename(taskFile, '.json'),
310
+ title: (taskData.title as string) || 'Untitled Task',
311
+ status: (taskData.status as string) || 'pending',
312
+ type: ((taskData.meta as Record<string, unknown>)?.type as string) || 'task',
313
+ meta: (taskData.meta as Record<string, unknown>) || {},
314
+ context: (taskData.context as Record<string, unknown>) || {},
315
+ flow_control: (taskData.flow_control as Record<string, unknown>) || {}
316
+ });
317
+ } catch {
318
+ // Skip invalid task files
319
+ }
320
+ }
321
+ // Sort tasks by ID
322
+ result.tasks.sort((a, b) => sortTaskIds(a.task_id, b.task_id));
323
+ }
324
+ result.taskCount = result.tasks.length;
325
+
326
+ // Check for review data
327
+ const reviewDir = join(session.path, '.review');
328
+ if (existsSync(reviewDir)) {
329
+ result.hasReview = true;
330
+ result.reviewSummary = loadReviewSummary(reviewDir);
331
+ // Load dimension data for review sessions
332
+ if (session.type === 'review') {
333
+ result.reviewDimensions = await loadDimensionData(reviewDir);
334
+ }
335
+ }
336
+ } else {
337
+ // For archived, also load tasks (same as active)
338
+ const taskDir = join(session.path, '.task');
339
+ if (existsSync(taskDir)) {
340
+ const taskFiles = await safeGlob('IMPL-*.json', taskDir);
341
+ for (const taskFile of taskFiles) {
342
+ try {
343
+ const taskData = JSON.parse(readFileSync(join(taskDir, taskFile), 'utf8')) as Record<string, unknown>;
344
+ result.tasks.push({
345
+ task_id: (taskData.id as string) || basename(taskFile, '.json'),
346
+ title: (taskData.title as string) || 'Untitled Task',
347
+ status: (taskData.status as string) || 'completed', // Archived tasks are usually completed
348
+ type: ((taskData.meta as Record<string, unknown>)?.type as string) || 'task'
349
+ });
350
+ } catch {
351
+ // Skip invalid task files
352
+ }
353
+ }
354
+ // Sort tasks by ID
355
+ result.tasks.sort((a, b) => sortTaskIds(a.task_id, b.task_id));
356
+ result.taskCount = result.tasks.length;
357
+ }
358
+
359
+ // Check for review data in archived sessions too
360
+ const reviewDir = join(session.path, '.review');
361
+ if (existsSync(reviewDir)) {
362
+ result.hasReview = true;
363
+ result.reviewSummary = loadReviewSummary(reviewDir);
364
+ // Load dimension data for review sessions
365
+ if (session.type === 'review') {
366
+ result.reviewDimensions = await loadDimensionData(reviewDir);
367
+ }
368
+ }
369
+ }
370
+
371
+ return result;
372
+ }
373
+
374
+ /**
375
+ * Aggregate review data from all active sessions with reviews
376
+ * @param activeSessions - Active session objects
377
+ * @returns Aggregated review data
378
+ */
379
+ async function aggregateReviewData(activeSessions: SessionInput[]): Promise<ReviewData> {
380
+ const reviewData: ReviewData = {
381
+ totalFindings: 0,
382
+ severityDistribution: { critical: 0, high: 0, medium: 0, low: 0 },
383
+ dimensionSummary: {},
384
+ sessions: []
385
+ };
386
+
387
+ for (const session of activeSessions) {
388
+ const reviewDir = join(session.path, '.review');
389
+ if (!existsSync(reviewDir)) continue;
390
+
391
+ const reviewProgress = loadReviewProgress(reviewDir);
392
+ const dimensionData = await loadDimensionData(reviewDir);
393
+
394
+ if (reviewProgress || dimensionData.length > 0) {
395
+ const sessionReview: SessionReviewData = {
396
+ session_id: session.session_id || session.id || '',
397
+ progress: reviewProgress,
398
+ dimensions: dimensionData,
399
+ findings: []
400
+ };
401
+
402
+ // Collect and count findings
403
+ for (const dim of dimensionData) {
404
+ if (dim.findings && Array.isArray(dim.findings)) {
405
+ for (const finding of dim.findings) {
406
+ const severity = (finding.severity || 'low').toLowerCase();
407
+ if (reviewData.severityDistribution.hasOwnProperty(severity)) {
408
+ reviewData.severityDistribution[severity as keyof typeof reviewData.severityDistribution]++;
409
+ }
410
+ reviewData.totalFindings++;
411
+ sessionReview.findings.push({
412
+ ...finding,
413
+ dimension: dim.name
414
+ });
415
+ }
416
+ }
417
+
418
+ // Track dimension summary
419
+ if (!reviewData.dimensionSummary[dim.name]) {
420
+ reviewData.dimensionSummary[dim.name] = { count: 0, sessions: [] };
421
+ }
422
+ reviewData.dimensionSummary[dim.name].count += dim.findings?.length || 0;
423
+ reviewData.dimensionSummary[dim.name].sessions.push(session.session_id || session.id || '');
424
+ }
425
+
426
+ reviewData.sessions.push(sessionReview);
427
+ }
428
+ }
429
+
430
+ return reviewData;
431
+ }
432
+
433
+ /**
434
+ * Load review progress from review-progress.json
435
+ * @param reviewDir - Path to .review directory
436
+ * @returns Review progress data or null
437
+ */
438
+ function loadReviewProgress(reviewDir: string): unknown | null {
439
+ const progressFile = join(reviewDir, 'review-progress.json');
440
+ if (!existsSync(progressFile)) return null;
441
+ try {
442
+ return JSON.parse(readFileSync(progressFile, 'utf8'));
443
+ } catch {
444
+ return null;
445
+ }
446
+ }
447
+
448
+ /**
449
+ * Load review summary from review-state.json
450
+ * @param reviewDir - Path to .review directory
451
+ * @returns Review summary or null
452
+ */
453
+ function loadReviewSummary(reviewDir: string): ReviewSummary | null {
454
+ const stateFile = join(reviewDir, 'review-state.json');
455
+ if (!existsSync(stateFile)) return null;
456
+ try {
457
+ const state = JSON.parse(readFileSync(stateFile, 'utf8')) as Record<string, unknown>;
458
+ return {
459
+ phase: (state.phase as string) || 'unknown',
460
+ severityDistribution: (state.severity_distribution as Record<string, number>) || {},
461
+ criticalFiles: ((state.critical_files as string[]) || []).slice(0, 3),
462
+ status: (state.status as string) || 'in_progress'
463
+ };
464
+ } catch {
465
+ return null;
466
+ }
467
+ }
468
+
469
+ /**
470
+ * Load dimension data from .review/dimensions/
471
+ * @param reviewDir - Path to .review directory
472
+ * @returns Array of dimension data
473
+ */
474
+ async function loadDimensionData(reviewDir: string): Promise<DimensionData[]> {
475
+ const dimensionsDir = join(reviewDir, 'dimensions');
476
+ if (!existsSync(dimensionsDir)) return [];
477
+
478
+ const dimensions: DimensionData[] = [];
479
+ const dimFiles = await safeGlob('*.json', dimensionsDir);
480
+
481
+ for (const file of dimFiles) {
482
+ try {
483
+ const data = JSON.parse(readFileSync(join(dimensionsDir, file), 'utf8'));
484
+ // Handle array structure: [ { findings: [...], summary: {...} } ]
485
+ let findings: Finding[] = [];
486
+ let summary: unknown | null = null;
487
+ let status = 'completed';
488
+
489
+ if (Array.isArray(data) && data.length > 0) {
490
+ const dimData = data[0] as Record<string, unknown>;
491
+ findings = (dimData.findings as Finding[]) || [];
492
+ summary = dimData.summary || null;
493
+ status = (dimData.status as string) || 'completed';
494
+ } else if ((data as Record<string, unknown>).findings) {
495
+ const dataObj = data as Record<string, unknown>;
496
+ findings = (dataObj.findings as Finding[]) || [];
497
+ summary = dataObj.summary || null;
498
+ status = (dataObj.status as string) || 'completed';
499
+ }
500
+
501
+ dimensions.push({
502
+ name: basename(file, '.json'),
503
+ findings: findings,
504
+ summary: summary,
505
+ status: status
506
+ });
507
+ } catch {
508
+ // Skip invalid dimension files
509
+ }
510
+ }
511
+
512
+ return dimensions;
513
+ }
514
+
515
+ /**
516
+ * Safe glob wrapper that returns empty array on error
517
+ * @param pattern - Glob pattern
518
+ * @param cwd - Current working directory
519
+ * @returns Array of matching file names
520
+ */
521
+ async function safeGlob(pattern: string, cwd: string): Promise<string[]> {
522
+ try {
523
+ return await glob(pattern, { cwd, absolute: false });
524
+ } catch {
525
+ return [];
526
+ }
527
+ }
528
+
529
+ // formatDate removed - dates are now passed as raw ISO strings
530
+ // Frontend (dashboard.js) handles all date formatting
531
+
532
+ /**
533
+ * Sort task IDs numerically (IMPL-1, IMPL-2, IMPL-1.1, etc.)
534
+ * @param a - First task ID
535
+ * @param b - Second task ID
536
+ * @returns Comparison result
537
+ */
538
+ function sortTaskIds(a: string, b: string): number {
539
+ const parseId = (id: string): [number, number] => {
540
+ const match = id.match(/IMPL-(\d+)(?:\.(\d+))?/);
541
+ if (!match) return [0, 0];
542
+ return [parseInt(match[1]), parseInt(match[2] || '0')];
543
+ };
544
+ const [a1, a2] = parseId(a);
545
+ const [b1, b2] = parseId(b);
546
+ return a1 - b1 || a2 - b2;
547
+ }
548
+
549
+ /**
550
+ * Load project overview from project-tech.json and project-guidelines.json
551
+ * Supports dual file structure with backward compatibility for legacy project.json
552
+ * @param workflowDir - Path to .workflow directory
553
+ * @returns Project overview data or null if not found
554
+ */
555
+ function loadProjectOverview(workflowDir: string): ProjectOverview | null {
556
+ const techFile = join(workflowDir, 'project-tech.json');
557
+ const guidelinesFile = join(workflowDir, 'project-guidelines.json');
558
+ const legacyFile = join(workflowDir, 'project.json');
559
+
560
+ // Check for new dual file structure first, fallback to legacy
561
+ const useLegacy = !existsSync(techFile) && existsSync(legacyFile);
562
+ const projectFile = useLegacy ? legacyFile : techFile;
563
+
564
+ if (!existsSync(projectFile)) {
565
+ console.log(`Project file not found at: ${projectFile}`);
566
+ return null;
567
+ }
568
+
569
+ try {
570
+ const fileContent = readFileSync(projectFile, 'utf8');
571
+ const projectData = JSON.parse(fileContent) as Record<string, unknown>;
572
+
573
+ console.log(`Successfully loaded project overview: ${projectData.project_name || 'Unknown'} (${useLegacy ? 'legacy' : 'tech'})`);
574
+
575
+ // Parse tech data (compatible with both legacy and new structure)
576
+ const overview = projectData.overview as Record<string, unknown> | undefined;
577
+ const technologyAnalysis = projectData.technology_analysis as Record<string, unknown> | undefined;
578
+ const developmentStatus = projectData.development_status as Record<string, unknown> | undefined;
579
+
580
+ // Support both old and new schema field names
581
+ const technologyStack = (overview?.technology_stack || technologyAnalysis?.technology_stack) as Record<string, unknown[]> | undefined;
582
+ const architecture = (overview?.architecture || technologyAnalysis?.architecture) as Record<string, unknown> | undefined;
583
+ const developmentIndex = (projectData.development_index || developmentStatus?.development_index) as Record<string, unknown[]> | undefined;
584
+ const statistics = (projectData.statistics || developmentStatus?.statistics) as Record<string, unknown> | undefined;
585
+ const metadata = projectData._metadata as Record<string, unknown> | undefined;
586
+
587
+ // Load guidelines from separate file if exists
588
+ let guidelines: ProjectGuidelines | null = null;
589
+ if (existsSync(guidelinesFile)) {
590
+ try {
591
+ const guidelinesContent = readFileSync(guidelinesFile, 'utf8');
592
+ const guidelinesData = JSON.parse(guidelinesContent) as Record<string, unknown>;
593
+
594
+ const conventions = guidelinesData.conventions as Record<string, string[]> | undefined;
595
+ const constraints = guidelinesData.constraints as Record<string, string[]> | undefined;
596
+
597
+ guidelines = {
598
+ conventions: {
599
+ coding_style: conventions?.coding_style || [],
600
+ naming_patterns: conventions?.naming_patterns || [],
601
+ file_structure: conventions?.file_structure || [],
602
+ documentation: conventions?.documentation || []
603
+ },
604
+ constraints: {
605
+ architecture: constraints?.architecture || [],
606
+ tech_stack: constraints?.tech_stack || [],
607
+ performance: constraints?.performance || [],
608
+ security: constraints?.security || []
609
+ },
610
+ quality_rules: (guidelinesData.quality_rules as Array<{ rule: string; scope: string; enforced_by?: string }>) || [],
611
+ learnings: (guidelinesData.learnings as Array<{
612
+ date: string;
613
+ session_id?: string;
614
+ insight: string;
615
+ context?: string;
616
+ category?: string;
617
+ }>) || [],
618
+ _metadata: guidelinesData._metadata as ProjectGuidelines['_metadata'] | undefined
619
+ };
620
+ console.log(`Successfully loaded project guidelines`);
621
+ } catch (guidelinesErr) {
622
+ console.error(`Failed to parse project-guidelines.json:`, (guidelinesErr as Error).message);
623
+ }
624
+ }
625
+
626
+ return {
627
+ projectName: (projectData.project_name as string) || 'Unknown',
628
+ description: (overview?.description as string) || '',
629
+ initializedAt: (projectData.initialized_at as string) || null,
630
+ technologyStack: {
631
+ languages: (technologyStack?.languages as string[]) || [],
632
+ frameworks: (technologyStack?.frameworks as string[]) || [],
633
+ build_tools: (technologyStack?.build_tools as string[]) || [],
634
+ test_frameworks: (technologyStack?.test_frameworks as string[]) || []
635
+ },
636
+ architecture: {
637
+ style: (architecture?.style as string) || 'Unknown',
638
+ layers: (architecture?.layers as string[]) || [],
639
+ patterns: (architecture?.patterns as string[]) || []
640
+ },
641
+ keyComponents: (overview?.key_components as string[]) || [],
642
+ features: (projectData.features as unknown[]) || [],
643
+ developmentIndex: {
644
+ feature: (developmentIndex?.feature as unknown[]) || [],
645
+ enhancement: (developmentIndex?.enhancement as unknown[]) || [],
646
+ bugfix: (developmentIndex?.bugfix as unknown[]) || [],
647
+ refactor: (developmentIndex?.refactor as unknown[]) || [],
648
+ docs: (developmentIndex?.docs as unknown[]) || []
649
+ },
650
+ statistics: {
651
+ total_features: (statistics?.total_features as number) || 0,
652
+ total_sessions: (statistics?.total_sessions as number) || 0,
653
+ last_updated: (statistics?.last_updated as string) || null
654
+ },
655
+ metadata: {
656
+ initialized_by: (metadata?.initialized_by as string) || 'unknown',
657
+ analysis_timestamp: (metadata?.analysis_timestamp as string) || null,
658
+ analysis_mode: (metadata?.analysis_mode as string) || 'unknown'
659
+ },
660
+ guidelines
661
+ };
662
+ } catch (err) {
663
+ console.error(`Failed to parse project file at ${projectFile}:`, (err as Error).message);
664
+ console.error('Error stack:', (err as Error).stack);
665
+ return null;
666
+ }
667
+ }