claude-code-workflow 6.1.4 → 6.2.1

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 (879) hide show
  1. package/README.md +145 -274
  2. package/bin/ccw-mcp.js +7 -0
  3. package/bin/ccw.js +10 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +219 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/cli.d.ts +32 -0
  9. package/dist/commands/cli.d.ts.map +1 -0
  10. package/dist/commands/cli.js +619 -0
  11. package/dist/commands/cli.js.map +1 -0
  12. package/dist/commands/core-memory.d.ts +32 -0
  13. package/dist/commands/core-memory.d.ts.map +1 -0
  14. package/dist/commands/core-memory.js +640 -0
  15. package/dist/commands/core-memory.js.map +1 -0
  16. package/dist/commands/hook.d.ts +16 -0
  17. package/dist/commands/hook.d.ts.map +1 -0
  18. package/dist/commands/hook.js +276 -0
  19. package/dist/commands/hook.js.map +1 -0
  20. package/dist/commands/install.d.ts +12 -0
  21. package/dist/commands/install.d.ts.map +1 -0
  22. package/dist/commands/install.js +443 -0
  23. package/dist/commands/install.js.map +1 -0
  24. package/dist/commands/list.d.ts +5 -0
  25. package/dist/commands/list.d.ts.map +1 -0
  26. package/dist/commands/list.js +32 -0
  27. package/dist/commands/list.js.map +1 -0
  28. package/dist/commands/memory.d.ts +57 -0
  29. package/dist/commands/memory.d.ts.map +1 -0
  30. package/dist/commands/memory.js +890 -0
  31. package/dist/commands/memory.js.map +1 -0
  32. package/dist/commands/serve.d.ts +12 -0
  33. package/dist/commands/serve.d.ts.map +1 -0
  34. package/dist/commands/serve.js +63 -0
  35. package/dist/commands/serve.js.map +1 -0
  36. package/dist/commands/session-path-resolver.d.ts +45 -0
  37. package/dist/commands/session-path-resolver.d.ts.map +1 -0
  38. package/dist/commands/session-path-resolver.js +302 -0
  39. package/dist/commands/session-path-resolver.js.map +1 -0
  40. package/dist/commands/session.d.ts +12 -0
  41. package/dist/commands/session.d.ts.map +1 -0
  42. package/dist/commands/session.js +954 -0
  43. package/dist/commands/session.js.map +1 -0
  44. package/dist/commands/stop.d.ts +11 -0
  45. package/dist/commands/stop.d.ts.map +1 -0
  46. package/dist/commands/stop.js +96 -0
  47. package/dist/commands/stop.js.map +1 -0
  48. package/dist/commands/tool.d.ts +29 -0
  49. package/dist/commands/tool.d.ts.map +1 -0
  50. package/dist/commands/tool.js +173 -0
  51. package/dist/commands/tool.js.map +1 -0
  52. package/dist/commands/uninstall.d.ts +9 -0
  53. package/dist/commands/uninstall.d.ts.map +1 -0
  54. package/dist/commands/uninstall.js +239 -0
  55. package/dist/commands/uninstall.js.map +1 -0
  56. package/dist/commands/upgrade.d.ts +10 -0
  57. package/dist/commands/upgrade.d.ts.map +1 -0
  58. package/dist/commands/upgrade.js +288 -0
  59. package/dist/commands/upgrade.js.map +1 -0
  60. package/dist/commands/view.d.ts +14 -0
  61. package/dist/commands/view.d.ts.map +1 -0
  62. package/dist/commands/view.js +100 -0
  63. package/dist/commands/view.js.map +1 -0
  64. package/dist/config/storage-paths.d.ts +184 -0
  65. package/dist/config/storage-paths.d.ts.map +1 -0
  66. package/dist/config/storage-paths.js +536 -0
  67. package/dist/config/storage-paths.js.map +1 -0
  68. package/dist/core/cache-manager.d.ts +80 -0
  69. package/dist/core/cache-manager.d.ts.map +1 -0
  70. package/dist/core/cache-manager.js +260 -0
  71. package/dist/core/cache-manager.js.map +1 -0
  72. package/dist/core/claude-freshness.d.ts +53 -0
  73. package/dist/core/claude-freshness.d.ts.map +1 -0
  74. package/dist/core/claude-freshness.js +232 -0
  75. package/dist/core/claude-freshness.js.map +1 -0
  76. package/dist/core/core-memory-store.d.ts +320 -0
  77. package/dist/core/core-memory-store.d.ts.map +1 -0
  78. package/dist/core/core-memory-store.js +1177 -0
  79. package/dist/core/core-memory-store.js.map +1 -0
  80. package/dist/core/dashboard-generator-patch.d.ts +2 -0
  81. package/dist/core/dashboard-generator-patch.d.ts.map +1 -0
  82. package/dist/core/dashboard-generator-patch.js +48 -0
  83. package/dist/core/dashboard-generator-patch.js.map +1 -0
  84. package/dist/core/dashboard-generator.d.ts +8 -0
  85. package/dist/core/dashboard-generator.d.ts.map +1 -0
  86. package/dist/core/dashboard-generator.js +695 -0
  87. package/dist/core/dashboard-generator.js.map +1 -0
  88. package/dist/core/data-aggregator.d.ts +145 -0
  89. package/dist/core/data-aggregator.d.ts.map +1 -0
  90. package/dist/core/data-aggregator.js +416 -0
  91. package/dist/core/data-aggregator.js.map +1 -0
  92. package/dist/core/history-importer.d.ts +102 -0
  93. package/dist/core/history-importer.d.ts.map +1 -0
  94. package/dist/core/history-importer.js +493 -0
  95. package/dist/core/history-importer.js.map +1 -0
  96. package/dist/core/lite-scanner-complete.d.ts +81 -0
  97. package/dist/core/lite-scanner-complete.d.ts.map +1 -0
  98. package/dist/core/lite-scanner-complete.js +368 -0
  99. package/dist/core/lite-scanner-complete.js.map +1 -0
  100. package/dist/core/lite-scanner.d.ts +81 -0
  101. package/dist/core/lite-scanner.d.ts.map +1 -0
  102. package/dist/core/lite-scanner.js +368 -0
  103. package/dist/core/lite-scanner.js.map +1 -0
  104. package/dist/core/manifest.d.ts +88 -0
  105. package/dist/core/manifest.d.ts.map +1 -0
  106. package/dist/core/manifest.js +214 -0
  107. package/dist/core/manifest.js.map +1 -0
  108. package/dist/core/memory-embedder-bridge.d.ts +83 -0
  109. package/dist/core/memory-embedder-bridge.d.ts.map +1 -0
  110. package/dist/core/memory-embedder-bridge.js +181 -0
  111. package/dist/core/memory-embedder-bridge.js.map +1 -0
  112. package/dist/core/memory-store.d.ts +249 -0
  113. package/dist/core/memory-store.d.ts.map +1 -0
  114. package/dist/core/memory-store.js +781 -0
  115. package/dist/core/memory-store.js.map +1 -0
  116. package/dist/core/routes/ccw-routes.d.ts +20 -0
  117. package/dist/core/routes/ccw-routes.d.ts.map +1 -0
  118. package/dist/core/routes/ccw-routes.js +70 -0
  119. package/dist/core/routes/ccw-routes.js.map +1 -0
  120. package/dist/core/routes/claude-routes.d.ts +19 -0
  121. package/dist/core/routes/claude-routes.d.ts.map +1 -0
  122. package/dist/core/routes/claude-routes.js +1017 -0
  123. package/dist/core/routes/claude-routes.js.map +1 -0
  124. package/dist/core/routes/cli-routes.d.ts +20 -0
  125. package/dist/core/routes/cli-routes.d.ts.map +1 -0
  126. package/dist/core/routes/cli-routes.js +468 -0
  127. package/dist/core/routes/cli-routes.js.map +1 -0
  128. package/dist/core/routes/codexlens-routes.d.ts +20 -0
  129. package/dist/core/routes/codexlens-routes.d.ts.map +1 -0
  130. package/dist/core/routes/codexlens-routes.js +754 -0
  131. package/dist/core/routes/codexlens-routes.js.map +1 -0
  132. package/dist/core/routes/core-memory-routes.d.ts +21 -0
  133. package/dist/core/routes/core-memory-routes.d.ts.map +1 -0
  134. package/dist/core/routes/core-memory-routes.js +520 -0
  135. package/dist/core/routes/core-memory-routes.js.map +1 -0
  136. package/dist/core/routes/files-routes.d.ts +20 -0
  137. package/dist/core/routes/files-routes.d.ts.map +1 -0
  138. package/dist/core/routes/files-routes.js +374 -0
  139. package/dist/core/routes/files-routes.js.map +1 -0
  140. package/dist/core/routes/graph-routes.d.ts +20 -0
  141. package/dist/core/routes/graph-routes.d.ts.map +1 -0
  142. package/dist/core/routes/graph-routes.js +517 -0
  143. package/dist/core/routes/graph-routes.js.map +1 -0
  144. package/dist/core/routes/help-routes.d.ts +20 -0
  145. package/dist/core/routes/help-routes.d.ts.map +1 -0
  146. package/dist/core/routes/help-routes.js +250 -0
  147. package/dist/core/routes/help-routes.js.map +1 -0
  148. package/dist/core/routes/hooks-routes.d.ts +21 -0
  149. package/dist/core/routes/hooks-routes.d.ts.map +1 -0
  150. package/dist/core/routes/hooks-routes.js +346 -0
  151. package/dist/core/routes/hooks-routes.js.map +1 -0
  152. package/dist/core/routes/mcp-routes.d.ts +20 -0
  153. package/dist/core/routes/mcp-routes.d.ts.map +1 -0
  154. package/dist/core/routes/mcp-routes.js +1129 -0
  155. package/dist/core/routes/mcp-routes.js.map +1 -0
  156. package/dist/core/routes/mcp-templates-db.d.ts +54 -0
  157. package/dist/core/routes/mcp-templates-db.d.ts.map +1 -0
  158. package/dist/core/routes/mcp-templates-db.js +226 -0
  159. package/dist/core/routes/mcp-templates-db.js.map +1 -0
  160. package/dist/core/routes/memory-routes.d.ts +21 -0
  161. package/dist/core/routes/memory-routes.d.ts.map +1 -0
  162. package/dist/core/routes/memory-routes.js +1095 -0
  163. package/dist/core/routes/memory-routes.js.map +1 -0
  164. package/dist/core/routes/rules-routes.d.ts +20 -0
  165. package/dist/core/routes/rules-routes.d.ts.map +1 -0
  166. package/dist/core/routes/rules-routes.js +442 -0
  167. package/dist/core/routes/rules-routes.js.map +1 -0
  168. package/dist/core/routes/session-routes.d.ts +20 -0
  169. package/dist/core/routes/session-routes.d.ts.map +1 -0
  170. package/dist/core/routes/session-routes.js +423 -0
  171. package/dist/core/routes/session-routes.js.map +1 -0
  172. package/dist/core/routes/skills-routes.d.ts +20 -0
  173. package/dist/core/routes/skills-routes.d.ts.map +1 -0
  174. package/dist/core/routes/skills-routes.js +533 -0
  175. package/dist/core/routes/skills-routes.js.map +1 -0
  176. package/dist/core/routes/status-routes.d.ts +20 -0
  177. package/dist/core/routes/status-routes.d.ts.map +1 -0
  178. package/dist/core/routes/status-routes.js +38 -0
  179. package/dist/core/routes/status-routes.js.map +1 -0
  180. package/dist/core/routes/system-routes.d.ts +22 -0
  181. package/dist/core/routes/system-routes.d.ts.map +1 -0
  182. package/dist/core/routes/system-routes.js +354 -0
  183. package/dist/core/routes/system-routes.js.map +1 -0
  184. package/dist/core/server.d.ts +17 -0
  185. package/dist/core/server.d.ts.map +1 -0
  186. package/dist/core/server.js +386 -0
  187. package/dist/core/server.js.map +1 -0
  188. package/dist/core/session-clustering-service.d.ts +153 -0
  189. package/dist/core/session-clustering-service.d.ts.map +1 -0
  190. package/dist/core/session-clustering-service.js +1065 -0
  191. package/dist/core/session-clustering-service.js.map +1 -0
  192. package/dist/core/session-scanner.d.ts +32 -0
  193. package/dist/core/session-scanner.d.ts.map +1 -0
  194. package/dist/core/session-scanner.js +253 -0
  195. package/dist/core/session-scanner.js.map +1 -0
  196. package/dist/core/websocket.d.ts +23 -0
  197. package/dist/core/websocket.d.ts.map +1 -0
  198. package/dist/core/websocket.js +168 -0
  199. package/dist/core/websocket.js.map +1 -0
  200. package/dist/index.d.ts +10 -0
  201. package/dist/index.d.ts.map +1 -0
  202. package/dist/index.js +10 -0
  203. package/dist/index.js.map +1 -0
  204. package/dist/mcp-server/index.d.ts +7 -0
  205. package/dist/mcp-server/index.d.ts.map +1 -0
  206. package/dist/mcp-server/index.js +157 -0
  207. package/dist/mcp-server/index.js.map +1 -0
  208. package/dist/tools/classify-folders.d.ts +26 -0
  209. package/dist/tools/classify-folders.d.ts.map +1 -0
  210. package/dist/tools/classify-folders.js +201 -0
  211. package/dist/tools/classify-folders.js.map +1 -0
  212. package/dist/tools/cli-config-manager.d.ts +62 -0
  213. package/dist/tools/cli-config-manager.d.ts.map +1 -0
  214. package/dist/tools/cli-config-manager.js +221 -0
  215. package/dist/tools/cli-config-manager.js.map +1 -0
  216. package/dist/tools/cli-executor.d.ts +373 -0
  217. package/dist/tools/cli-executor.d.ts.map +1 -0
  218. package/dist/tools/cli-executor.js +1625 -0
  219. package/dist/tools/cli-executor.js.map +1 -0
  220. package/dist/tools/cli-history-store.d.ts +330 -0
  221. package/dist/tools/cli-history-store.d.ts.map +1 -0
  222. package/dist/tools/cli-history-store.js +916 -0
  223. package/dist/tools/cli-history-store.js.map +1 -0
  224. package/dist/tools/codex-lens.d.ts +118 -0
  225. package/dist/tools/codex-lens.d.ts.map +1 -0
  226. package/dist/tools/codex-lens.js +962 -0
  227. package/dist/tools/codex-lens.js.map +1 -0
  228. package/dist/tools/convert-tokens-to-css.d.ts +14 -0
  229. package/dist/tools/convert-tokens-to-css.d.ts.map +1 -0
  230. package/dist/tools/convert-tokens-to-css.js +244 -0
  231. package/dist/tools/convert-tokens-to-css.js.map +1 -0
  232. package/dist/tools/core-memory.d.ts +66 -0
  233. package/dist/tools/core-memory.d.ts.map +1 -0
  234. package/dist/tools/core-memory.js +324 -0
  235. package/dist/tools/core-memory.js.map +1 -0
  236. package/dist/tools/detect-changed-modules.d.ts +24 -0
  237. package/dist/tools/detect-changed-modules.d.ts.map +1 -0
  238. package/dist/tools/detect-changed-modules.js +277 -0
  239. package/dist/tools/detect-changed-modules.js.map +1 -0
  240. package/dist/tools/discover-design-files.d.ts +36 -0
  241. package/dist/tools/discover-design-files.d.ts.map +1 -0
  242. package/dist/tools/discover-design-files.js +147 -0
  243. package/dist/tools/discover-design-files.js.map +1 -0
  244. package/dist/tools/edit-file.d.ts +28 -0
  245. package/dist/tools/edit-file.d.ts.map +1 -0
  246. package/dist/tools/edit-file.js +479 -0
  247. package/dist/tools/edit-file.js.map +1 -0
  248. package/dist/tools/generate-module-docs.d.ts +22 -0
  249. package/dist/tools/generate-module-docs.d.ts.map +1 -0
  250. package/dist/tools/generate-module-docs.js +379 -0
  251. package/dist/tools/generate-module-docs.js.map +1 -0
  252. package/dist/tools/get-modules-by-depth.d.ts +15 -0
  253. package/dist/tools/get-modules-by-depth.d.ts.map +1 -0
  254. package/dist/tools/get-modules-by-depth.js +296 -0
  255. package/dist/tools/get-modules-by-depth.js.map +1 -0
  256. package/dist/tools/index.d.ts +55 -0
  257. package/dist/tools/index.d.ts.map +1 -0
  258. package/dist/tools/index.js +304 -0
  259. package/dist/tools/index.js.map +1 -0
  260. package/dist/tools/native-session-discovery.d.ts +97 -0
  261. package/dist/tools/native-session-discovery.d.ts.map +1 -0
  262. package/dist/tools/native-session-discovery.js +700 -0
  263. package/dist/tools/native-session-discovery.js.map +1 -0
  264. package/dist/tools/notifier.d.ts +50 -0
  265. package/dist/tools/notifier.d.ts.map +1 -0
  266. package/dist/tools/notifier.js +90 -0
  267. package/dist/tools/notifier.js.map +1 -0
  268. package/dist/tools/read-file.d.ts +32 -0
  269. package/dist/tools/read-file.d.ts.map +1 -0
  270. package/dist/tools/read-file.js +329 -0
  271. package/dist/tools/read-file.js.map +1 -0
  272. package/dist/tools/resume-strategy.d.ts +48 -0
  273. package/dist/tools/resume-strategy.d.ts.map +1 -0
  274. package/dist/tools/resume-strategy.js +248 -0
  275. package/dist/tools/resume-strategy.js.map +1 -0
  276. package/dist/tools/session-content-parser.d.ts +58 -0
  277. package/dist/tools/session-content-parser.d.ts.map +1 -0
  278. package/dist/tools/session-content-parser.js +420 -0
  279. package/dist/tools/session-content-parser.js.map +1 -0
  280. package/dist/tools/session-manager.d.ts +9 -0
  281. package/dist/tools/session-manager.d.ts.map +1 -0
  282. package/dist/tools/session-manager.js +834 -0
  283. package/dist/tools/session-manager.js.map +1 -0
  284. package/dist/tools/smart-context.d.ts +35 -0
  285. package/dist/tools/smart-context.d.ts.map +1 -0
  286. package/dist/tools/smart-context.js +182 -0
  287. package/dist/tools/smart-context.js.map +1 -0
  288. package/dist/tools/smart-search.d.ts +105 -0
  289. package/dist/tools/smart-search.d.ts.map +1 -0
  290. package/dist/tools/smart-search.js +1753 -0
  291. package/dist/tools/smart-search.js.map +1 -0
  292. package/dist/tools/storage-manager.d.ts +114 -0
  293. package/dist/tools/storage-manager.d.ts.map +1 -0
  294. package/dist/tools/storage-manager.js +392 -0
  295. package/dist/tools/storage-manager.js.map +1 -0
  296. package/dist/tools/ui-generate-preview.d.ts +39 -0
  297. package/dist/tools/ui-generate-preview.d.ts.map +1 -0
  298. package/dist/tools/ui-generate-preview.js +300 -0
  299. package/dist/tools/ui-generate-preview.js.map +1 -0
  300. package/dist/tools/ui-instantiate-prototypes.d.ts +75 -0
  301. package/dist/tools/ui-instantiate-prototypes.d.ts.map +1 -0
  302. package/dist/tools/ui-instantiate-prototypes.js +256 -0
  303. package/dist/tools/ui-instantiate-prototypes.js.map +1 -0
  304. package/dist/tools/update-module-claude.d.ts +80 -0
  305. package/dist/tools/update-module-claude.d.ts.map +1 -0
  306. package/dist/tools/update-module-claude.js +351 -0
  307. package/dist/tools/update-module-claude.js.map +1 -0
  308. package/dist/tools/write-file.d.ts +19 -0
  309. package/dist/tools/write-file.d.ts.map +1 -0
  310. package/dist/tools/write-file.js +193 -0
  311. package/dist/tools/write-file.js.map +1 -0
  312. package/dist/types/config.d.ts +11 -0
  313. package/dist/types/config.d.ts.map +1 -0
  314. package/dist/types/config.js +2 -0
  315. package/dist/types/config.js.map +1 -0
  316. package/dist/types/index.d.ts +4 -0
  317. package/dist/types/index.d.ts.map +1 -0
  318. package/dist/types/index.js +4 -0
  319. package/dist/types/index.js.map +1 -0
  320. package/dist/types/session.d.ts +20 -0
  321. package/dist/types/session.d.ts.map +1 -0
  322. package/dist/types/session.js +2 -0
  323. package/dist/types/session.js.map +1 -0
  324. package/dist/types/tool.d.ts +36 -0
  325. package/dist/types/tool.d.ts.map +1 -0
  326. package/dist/types/tool.js +11 -0
  327. package/dist/types/tool.js.map +1 -0
  328. package/dist/utils/browser-launcher.d.ts +13 -0
  329. package/dist/utils/browser-launcher.d.ts.map +1 -0
  330. package/dist/utils/browser-launcher.js +60 -0
  331. package/dist/utils/browser-launcher.js.map +1 -0
  332. package/dist/utils/file-utils.d.ts +25 -0
  333. package/dist/utils/file-utils.d.ts.map +1 -0
  334. package/dist/utils/file-utils.js +48 -0
  335. package/dist/utils/file-utils.js.map +1 -0
  336. package/dist/utils/path-resolver.d.ts +80 -0
  337. package/dist/utils/path-resolver.d.ts.map +1 -0
  338. package/dist/utils/path-resolver.js +260 -0
  339. package/dist/utils/path-resolver.js.map +1 -0
  340. package/dist/utils/path-validator.d.ts +49 -0
  341. package/dist/utils/path-validator.d.ts.map +1 -0
  342. package/dist/utils/path-validator.js +123 -0
  343. package/dist/utils/path-validator.js.map +1 -0
  344. package/dist/utils/ui.d.ts +62 -0
  345. package/dist/utils/ui.d.ts.map +1 -0
  346. package/dist/utils/ui.js +129 -0
  347. package/dist/utils/ui.js.map +1 -0
  348. package/package.json +32 -34
  349. package/src/.workflow/.cli-history/history.db +0 -0
  350. package/src/.workflow/.cli-history/history.db-shm +0 -0
  351. package/src/.workflow/.cli-history/history.db-wal +0 -0
  352. package/src/cli.ts +244 -0
  353. package/src/commands/cli.ts +740 -0
  354. package/src/commands/core-memory.ts +770 -0
  355. package/src/commands/hook.ts +315 -0
  356. package/src/commands/install.ts +519 -0
  357. package/src/commands/list.ts +37 -0
  358. package/src/commands/memory.ts +1090 -0
  359. package/src/commands/serve.ts +76 -0
  360. package/src/commands/session-path-resolver.ts +372 -0
  361. package/src/commands/session.ts +1141 -0
  362. package/src/commands/stop.ts +111 -0
  363. package/src/commands/tool.ts +201 -0
  364. package/src/commands/uninstall.ts +287 -0
  365. package/src/commands/upgrade.ts +352 -0
  366. package/src/commands/view.ts +119 -0
  367. package/src/config/storage-paths.ts +670 -0
  368. package/src/core/cache-manager.ts +294 -0
  369. package/src/core/claude-freshness.ts +319 -0
  370. package/src/core/core-memory-store.ts +1528 -0
  371. package/src/core/dashboard-generator-patch.ts +47 -0
  372. package/src/core/dashboard-generator.ts +739 -0
  373. package/src/core/data-aggregator.ts +584 -0
  374. package/src/core/history-importer.ts +625 -0
  375. package/src/core/lite-scanner-complete.ts +469 -0
  376. package/src/core/lite-scanner.ts +469 -0
  377. package/src/core/manifest.ts +271 -0
  378. package/src/core/memory-embedder-bridge.ts +262 -0
  379. package/src/core/memory-store.ts +978 -0
  380. package/src/core/routes/ccw-routes.ts +96 -0
  381. package/src/core/routes/claude-routes.ts +1183 -0
  382. package/src/core/routes/cli-routes.ts +561 -0
  383. package/src/core/routes/codexlens-routes.ts +806 -0
  384. package/src/core/routes/core-memory-routes.ts +605 -0
  385. package/src/core/routes/files-routes.ts +428 -0
  386. package/src/core/routes/graph-routes.md +164 -0
  387. package/src/core/routes/graph-routes.ts +626 -0
  388. package/src/core/routes/help-routes.ts +308 -0
  389. package/src/core/routes/hooks-routes.ts +405 -0
  390. package/src/core/routes/mcp-routes.ts +1271 -0
  391. package/src/core/routes/mcp-routes.ts.backup +550 -0
  392. package/src/core/routes/mcp-templates-db.ts +268 -0
  393. package/src/core/routes/memory-routes.ts +1206 -0
  394. package/src/core/routes/rules-routes.ts +526 -0
  395. package/src/core/routes/session-routes.ts +467 -0
  396. package/src/core/routes/skills-routes.ts +599 -0
  397. package/src/core/routes/status-routes.ts +57 -0
  398. package/src/core/routes/system-routes.ts +427 -0
  399. package/src/core/server.ts +431 -0
  400. package/src/core/session-clustering-service.ts +1258 -0
  401. package/src/core/session-scanner.ts +283 -0
  402. package/src/core/websocket.ts +190 -0
  403. package/src/index.ts +10 -0
  404. package/src/mcp-server/index.ts +186 -0
  405. package/src/templates/assets/css/github-dark.min.css +10 -0
  406. package/src/templates/assets/css/github.min.css +10 -0
  407. package/src/templates/assets/js/cytoscape.min.js +32 -0
  408. package/src/templates/assets/js/d3.min.js +2 -0
  409. package/src/templates/assets/js/highlight.min.js +1244 -0
  410. package/src/templates/assets/js/lucide.min.js +12 -0
  411. package/src/templates/assets/js/marked.min.js +69 -0
  412. package/src/templates/assets/js/tailwind.js +83 -0
  413. package/src/templates/dashboard-css/01-base.css +302 -0
  414. package/src/templates/dashboard-css/02-session.css +748 -0
  415. package/src/templates/dashboard-css/04-lite-tasks.css +1181 -0
  416. package/src/templates/dashboard-css/06-cards.css +1576 -0
  417. package/src/templates/dashboard-css/07-managers.css +2107 -0
  418. package/src/templates/dashboard-css/09-explorer.css +1408 -0
  419. package/src/templates/dashboard-css/10-cli-status.css +337 -0
  420. package/src/templates/dashboard-css/11-cli-history.css +271 -0
  421. package/src/templates/dashboard-css/12-cli-legacy.css +796 -0
  422. package/src/templates/dashboard-css/13-cli-ccw.css +199 -0
  423. package/src/templates/dashboard-css/14-cli-modals.css +258 -0
  424. package/src/templates/dashboard-css/15-cli-endpoints.css +305 -0
  425. package/src/templates/dashboard-css/16-cli-session.css +241 -0
  426. package/src/templates/dashboard-css/17-cli-conversation.css +283 -0
  427. package/src/templates/dashboard-css/18-cli-settings.css +160 -0
  428. package/src/templates/dashboard-css/19-cli-native-session.css +496 -0
  429. package/src/templates/dashboard-css/20-cli-taskqueue.css +188 -0
  430. package/src/templates/dashboard-css/21-cli-toolmgmt.css +310 -0
  431. package/src/templates/dashboard-css/22-cli-semantic.css +240 -0
  432. package/src/templates/dashboard-css/23-memory.css +2390 -0
  433. package/src/templates/dashboard-css/24-prompt-history.css +1089 -0
  434. package/src/templates/dashboard-css/25-skills-rules.css +326 -0
  435. package/src/templates/dashboard-css/26-claude-manager.css +908 -0
  436. package/src/templates/dashboard-css/27-graph-explorer.css +1678 -0
  437. package/src/templates/dashboard-css/28-mcp-manager.css +748 -0
  438. package/src/templates/dashboard-css/29-help.css +264 -0
  439. package/src/templates/dashboard-css/30-core-memory.css +1700 -0
  440. package/src/templates/dashboard-js/api.js +220 -0
  441. package/src/templates/dashboard-js/components/carousel.js +398 -0
  442. package/src/templates/dashboard-js/components/cli-history.js +876 -0
  443. package/src/templates/dashboard-js/components/cli-status.js +978 -0
  444. package/src/templates/dashboard-js/components/global-notifications.js +508 -0
  445. package/src/templates/dashboard-js/components/hook-manager.js +1278 -0
  446. package/src/templates/dashboard-js/components/index-manager.js +302 -0
  447. package/src/templates/dashboard-js/components/mcp-manager.js +1219 -0
  448. package/src/templates/dashboard-js/components/modals.js +326 -0
  449. package/src/templates/dashboard-js/components/navigation.js +313 -0
  450. package/src/templates/dashboard-js/components/notifications.js +758 -0
  451. package/src/templates/dashboard-js/components/storage-manager.js +478 -0
  452. package/src/templates/dashboard-js/components/tabs-other.js +424 -0
  453. package/src/templates/dashboard-js/components/task-queue-sidebar.js +716 -0
  454. package/src/templates/dashboard-js/help-i18n.js +272 -0
  455. package/src/templates/dashboard-js/i18n.js +2807 -0
  456. package/src/templates/dashboard-js/main.js +87 -0
  457. package/src/templates/dashboard-js/state.js +243 -0
  458. package/src/templates/dashboard-js/utils.js +199 -0
  459. package/src/templates/dashboard-js/views/claude-manager.js +912 -0
  460. package/src/templates/dashboard-js/views/cli-manager.js +2272 -0
  461. package/src/templates/dashboard-js/views/codexlens-manager.js +964 -0
  462. package/src/templates/dashboard-js/views/core-memory-clusters.js +503 -0
  463. package/src/templates/dashboard-js/views/core-memory.js +782 -0
  464. package/src/templates/dashboard-js/views/explorer.js +888 -0
  465. package/src/templates/dashboard-js/views/graph-explorer.js +1157 -0
  466. package/src/templates/dashboard-js/views/help.js +856 -0
  467. package/src/templates/dashboard-js/views/history.js +337 -0
  468. package/src/templates/dashboard-js/views/home.js +243 -0
  469. package/src/templates/dashboard-js/views/hook-manager.js +660 -0
  470. package/src/templates/dashboard-js/views/lite-tasks.js +861 -0
  471. package/src/templates/dashboard-js/views/mcp-manager.js +2187 -0
  472. package/src/templates/dashboard-js/views/mcp-manager.js.backup +1729 -0
  473. package/src/templates/dashboard-js/views/mcp-manager.js.new +928 -0
  474. package/src/templates/dashboard-js/views/memory.js +1221 -0
  475. package/src/templates/dashboard-js/views/prompt-history.js +713 -0
  476. package/src/templates/dashboard-js/views/rules-manager.js +828 -0
  477. package/src/templates/dashboard-js/views/session-detail.js +781 -0
  478. package/src/templates/dashboard-js/views/skills-manager.js +819 -0
  479. package/src/templates/dashboard.html +831 -0
  480. package/src/templates/hooks-config-example.json +60 -0
  481. package/src/tools/classify-folders.ts +245 -0
  482. package/src/tools/cli-config-manager.ts +268 -0
  483. package/src/tools/cli-executor.ts +2014 -0
  484. package/src/tools/cli-history-store.ts +1195 -0
  485. package/src/tools/codex-lens.ts +1141 -0
  486. package/src/tools/convert-tokens-to-css.ts +300 -0
  487. package/src/tools/core-memory.ts +444 -0
  488. package/src/tools/detect-changed-modules.ts +325 -0
  489. package/src/tools/discover-design-files.ts +184 -0
  490. package/src/tools/edit-file.ts +568 -0
  491. package/src/tools/generate-module-docs.ts +438 -0
  492. package/src/tools/get-modules-by-depth.ts +349 -0
  493. package/src/tools/index.ts +370 -0
  494. package/src/tools/native-session-discovery.ts +795 -0
  495. package/src/tools/notifier.ts +129 -0
  496. package/src/tools/read-file.ts +410 -0
  497. package/src/tools/resume-strategy.ts +345 -0
  498. package/src/tools/session-content-parser.ts +619 -0
  499. package/src/tools/session-manager.ts +1026 -0
  500. package/src/tools/smart-context.ts +228 -0
  501. package/src/tools/smart-search.ts +2065 -0
  502. package/src/tools/smart-search.ts.backup +1233 -0
  503. package/src/tools/storage-manager.ts +455 -0
  504. package/src/tools/write-file.ts +222 -0
  505. package/src/types/config.ts +11 -0
  506. package/src/types/index.ts +3 -0
  507. package/src/types/session.ts +25 -0
  508. package/src/types/tool.ts +41 -0
  509. package/src/utils/browser-launcher.ts +62 -0
  510. package/src/utils/file-utils.ts +48 -0
  511. package/src/utils/path-resolver.ts +315 -0
  512. package/src/utils/path-validator.ts +153 -0
  513. package/src/utils/ui.ts +155 -0
  514. package/.claude/agents/action-planning-agent.md +0 -778
  515. package/.claude/agents/cli-execution-agent.md +0 -270
  516. package/.claude/agents/cli-explore-agent.md +0 -182
  517. package/.claude/agents/cli-lite-planning-agent.md +0 -396
  518. package/.claude/agents/cli-planning-agent.md +0 -558
  519. package/.claude/agents/code-developer.md +0 -310
  520. package/.claude/agents/conceptual-planning-agent.md +0 -308
  521. package/.claude/agents/context-search-agent.md +0 -582
  522. package/.claude/agents/doc-generator.md +0 -330
  523. package/.claude/agents/memory-bridge.md +0 -94
  524. package/.claude/agents/test-context-search-agent.md +0 -399
  525. package/.claude/agents/test-fix-agent.md +0 -343
  526. package/.claude/agents/ui-design-agent.md +0 -593
  527. package/.claude/agents/universal-executor.md +0 -131
  528. package/.claude/commands/cli/cli-init.md +0 -440
  529. package/.claude/commands/enhance-prompt.md +0 -93
  530. package/.claude/commands/memory/code-map-memory.md +0 -687
  531. package/.claude/commands/memory/docs-full-cli.md +0 -471
  532. package/.claude/commands/memory/docs-related-cli.md +0 -386
  533. package/.claude/commands/memory/docs.md +0 -615
  534. package/.claude/commands/memory/load-skill-memory.md +0 -182
  535. package/.claude/commands/memory/load.md +0 -240
  536. package/.claude/commands/memory/skill-memory.md +0 -525
  537. package/.claude/commands/memory/style-skill-memory.md +0 -396
  538. package/.claude/commands/memory/tech-research.md +0 -477
  539. package/.claude/commands/memory/update-full.md +0 -332
  540. package/.claude/commands/memory/update-related.md +0 -332
  541. package/.claude/commands/memory/workflow-skill-memory.md +0 -517
  542. package/.claude/commands/task/breakdown.md +0 -204
  543. package/.claude/commands/task/create.md +0 -152
  544. package/.claude/commands/task/execute.md +0 -270
  545. package/.claude/commands/task/replan.md +0 -437
  546. package/.claude/commands/version.md +0 -254
  547. package/.claude/commands/workflow/action-plan-verify.md +0 -447
  548. package/.claude/commands/workflow/brainstorm/api-designer.md +0 -585
  549. package/.claude/commands/workflow/brainstorm/artifacts.md +0 -452
  550. package/.claude/commands/workflow/brainstorm/auto-parallel.md +0 -443
  551. package/.claude/commands/workflow/brainstorm/data-architect.md +0 -220
  552. package/.claude/commands/workflow/brainstorm/product-manager.md +0 -200
  553. package/.claude/commands/workflow/brainstorm/product-owner.md +0 -200
  554. package/.claude/commands/workflow/brainstorm/scrum-master.md +0 -200
  555. package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  556. package/.claude/commands/workflow/brainstorm/synthesis.md +0 -398
  557. package/.claude/commands/workflow/brainstorm/system-architect.md +0 -387
  558. package/.claude/commands/workflow/brainstorm/ui-designer.md +0 -221
  559. package/.claude/commands/workflow/brainstorm/ux-expert.md +0 -221
  560. package/.claude/commands/workflow/execute.md +0 -462
  561. package/.claude/commands/workflow/init.md +0 -164
  562. package/.claude/commands/workflow/lite-execute.md +0 -686
  563. package/.claude/commands/workflow/lite-fix.md +0 -621
  564. package/.claude/commands/workflow/lite-plan.md +0 -592
  565. package/.claude/commands/workflow/plan.md +0 -551
  566. package/.claude/commands/workflow/replan.md +0 -515
  567. package/.claude/commands/workflow/review-fix.md +0 -606
  568. package/.claude/commands/workflow/review-module-cycle.md +0 -765
  569. package/.claude/commands/workflow/review-session-cycle.md +0 -776
  570. package/.claude/commands/workflow/review.md +0 -291
  571. package/.claude/commands/workflow/session/complete.md +0 -500
  572. package/.claude/commands/workflow/session/list.md +0 -96
  573. package/.claude/commands/workflow/session/resume.md +0 -61
  574. package/.claude/commands/workflow/session/start.md +0 -200
  575. package/.claude/commands/workflow/tdd-plan.md +0 -460
  576. package/.claude/commands/workflow/tdd-verify.md +0 -386
  577. package/.claude/commands/workflow/test-cycle-execute.md +0 -498
  578. package/.claude/commands/workflow/test-fix-gen.md +0 -699
  579. package/.claude/commands/workflow/test-gen.md +0 -529
  580. package/.claude/commands/workflow/tools/conflict-resolution.md +0 -680
  581. package/.claude/commands/workflow/tools/context-gather.md +0 -434
  582. package/.claude/commands/workflow/tools/task-generate-agent.md +0 -291
  583. package/.claude/commands/workflow/tools/task-generate-tdd.md +0 -518
  584. package/.claude/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  585. package/.claude/commands/workflow/tools/test-concept-enhanced.md +0 -163
  586. package/.claude/commands/workflow/tools/test-context-gather.md +0 -235
  587. package/.claude/commands/workflow/tools/test-task-generate.md +0 -256
  588. package/.claude/commands/workflow/ui-design/animation-extract.md +0 -1150
  589. package/.claude/commands/workflow/ui-design/codify-style.md +0 -652
  590. package/.claude/commands/workflow/ui-design/design-sync.md +0 -454
  591. package/.claude/commands/workflow/ui-design/explore-auto.md +0 -678
  592. package/.claude/commands/workflow/ui-design/generate.md +0 -504
  593. package/.claude/commands/workflow/ui-design/imitate-auto.md +0 -745
  594. package/.claude/commands/workflow/ui-design/import-from-code.md +0 -537
  595. package/.claude/commands/workflow/ui-design/layout-extract.md +0 -788
  596. package/.claude/commands/workflow/ui-design/reference-page-generator.md +0 -356
  597. package/.claude/commands/workflow/ui-design/style-extract.md +0 -773
  598. package/.claude/scripts/classify-folders.sh +0 -39
  599. package/.claude/scripts/convert_tokens_to_css.sh +0 -229
  600. package/.claude/scripts/detect_changed_modules.sh +0 -161
  601. package/.claude/scripts/discover-design-files.sh +0 -87
  602. package/.claude/scripts/extract-animations.js +0 -243
  603. package/.claude/scripts/extract-computed-styles.js +0 -118
  604. package/.claude/scripts/extract-layout-structure.js +0 -411
  605. package/.claude/scripts/generate_module_docs.sh +0 -717
  606. package/.claude/scripts/get_modules_by_depth.sh +0 -170
  607. package/.claude/scripts/ui-generate-preview.sh +0 -395
  608. package/.claude/scripts/ui-instantiate-prototypes.sh +0 -815
  609. package/.claude/scripts/update_module_claude.sh +0 -337
  610. package/.claude/skills/command-guide/SKILL.md +0 -388
  611. package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
  612. package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
  613. package/.claude/skills/command-guide/guides/examples.md +0 -537
  614. package/.claude/skills/command-guide/guides/getting-started.md +0 -242
  615. package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
  616. package/.claude/skills/command-guide/guides/index-structure.md +0 -326
  617. package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
  618. package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
  619. package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
  620. package/.claude/skills/command-guide/index/all-commands.json +0 -772
  621. package/.claude/skills/command-guide/index/by-category.json +0 -800
  622. package/.claude/skills/command-guide/index/by-use-case.json +0 -786
  623. package/.claude/skills/command-guide/index/command-relationships.json +0 -307
  624. package/.claude/skills/command-guide/index/essential-commands.json +0 -112
  625. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -778
  626. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -270
  627. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
  628. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -396
  629. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
  630. package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -310
  631. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
  632. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -582
  633. package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
  634. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
  635. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -399
  636. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -343
  637. package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
  638. package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
  639. package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
  640. package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
  641. package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
  642. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
  643. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
  644. package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -615
  645. package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
  646. package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
  647. package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
  648. package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
  649. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -477
  650. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
  651. package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
  652. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
  653. package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
  654. package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
  655. package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
  656. package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
  657. package/.claude/skills/command-guide/reference/commands/version.md +0 -254
  658. package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
  659. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
  660. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
  661. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
  662. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
  663. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
  664. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
  665. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
  666. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
  667. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
  668. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
  669. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
  670. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
  671. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -460
  672. package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
  673. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -686
  674. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -621
  675. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -592
  676. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
  677. package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
  678. package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
  679. package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
  680. package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
  681. package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -291
  682. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -500
  683. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -96
  684. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -61
  685. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -200
  686. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
  687. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -386
  688. package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
  689. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
  690. package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
  691. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -680
  692. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -434
  693. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -291
  694. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
  695. package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
  696. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
  697. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -235
  698. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -256
  699. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
  700. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
  701. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
  702. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
  703. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
  704. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
  705. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
  706. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
  707. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
  708. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
  709. package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
  710. package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
  711. package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
  712. package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
  713. package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
  714. package/.claude/skills/command-guide/templates/issue-question.md +0 -141
  715. package/.claude/skills/prompt-enhancer/SKILL.md +0 -124
  716. package/.claude/workflows/_template-compare-matrix.html +0 -692
  717. package/.claude/workflows/cli-templates/fix-plan-template.json +0 -75
  718. package/.claude/workflows/cli-templates/fix-progress-template.json +0 -48
  719. package/.claude/workflows/cli-templates/memory/style-skill-memory/skill-md-template.md +0 -299
  720. package/.claude/workflows/cli-templates/planning-roles/data-architect.md +0 -120
  721. package/.claude/workflows/cli-templates/planning-roles/product-manager.md +0 -119
  722. package/.claude/workflows/cli-templates/planning-roles/product-owner.md +0 -261
  723. package/.claude/workflows/cli-templates/planning-roles/scrum-master.md +0 -186
  724. package/.claude/workflows/cli-templates/planning-roles/subject-matter-expert.md +0 -281
  725. package/.claude/workflows/cli-templates/planning-roles/synthesis-role.md +0 -414
  726. package/.claude/workflows/cli-templates/planning-roles/system-architect.md +0 -106
  727. package/.claude/workflows/cli-templates/planning-roles/test-strategist.md +0 -124
  728. package/.claude/workflows/cli-templates/planning-roles/ui-designer.md +0 -379
  729. package/.claude/workflows/cli-templates/planning-roles/ux-expert.md +0 -240
  730. package/.claude/workflows/cli-templates/prompts/analysis/01-diagnose-bug-root-cause.txt +0 -127
  731. package/.claude/workflows/cli-templates/prompts/analysis/01-trace-code-execution.txt +0 -115
  732. package/.claude/workflows/cli-templates/prompts/analysis/02-analyze-code-patterns.txt +0 -37
  733. package/.claude/workflows/cli-templates/prompts/analysis/02-analyze-technical-document.txt +0 -33
  734. package/.claude/workflows/cli-templates/prompts/analysis/02-review-architecture.txt +0 -29
  735. package/.claude/workflows/cli-templates/prompts/analysis/02-review-code-quality.txt +0 -28
  736. package/.claude/workflows/cli-templates/prompts/analysis/03-analyze-performance.txt +0 -29
  737. package/.claude/workflows/cli-templates/prompts/analysis/03-assess-security-risks.txt +0 -29
  738. package/.claude/workflows/cli-templates/prompts/analysis/03-review-quality-standards.txt +0 -29
  739. package/.claude/workflows/cli-templates/prompts/development/02-generate-tests.txt +0 -70
  740. package/.claude/workflows/cli-templates/prompts/development/02-implement-component-ui.txt +0 -55
  741. package/.claude/workflows/cli-templates/prompts/development/02-implement-feature.txt +0 -58
  742. package/.claude/workflows/cli-templates/prompts/development/02-refactor-codebase.txt +0 -55
  743. package/.claude/workflows/cli-templates/prompts/development/03-debug-runtime-issues.txt +0 -55
  744. package/.claude/workflows/cli-templates/prompts/documentation/api.txt +0 -15
  745. package/.claude/workflows/cli-templates/prompts/documentation/folder-navigation.txt +0 -27
  746. package/.claude/workflows/cli-templates/prompts/documentation/module-readme.txt +0 -49
  747. package/.claude/workflows/cli-templates/prompts/documentation/project-architecture.txt +0 -41
  748. package/.claude/workflows/cli-templates/prompts/documentation/project-examples.txt +0 -35
  749. package/.claude/workflows/cli-templates/prompts/documentation/project-readme.txt +0 -35
  750. package/.claude/workflows/cli-templates/prompts/memory/02-document-module-structure.txt +0 -165
  751. package/.claude/workflows/cli-templates/prompts/planning/01-plan-architecture-design.txt +0 -109
  752. package/.claude/workflows/cli-templates/prompts/planning/02-breakdown-task-steps.txt +0 -30
  753. package/.claude/workflows/cli-templates/prompts/planning/02-design-component-spec.txt +0 -28
  754. package/.claude/workflows/cli-templates/prompts/planning/03-evaluate-concept-feasibility.txt +0 -127
  755. package/.claude/workflows/cli-templates/prompts/planning/03-plan-migration-strategy.txt +0 -30
  756. package/.claude/workflows/cli-templates/prompts/tech/tech-module-format.txt +0 -359
  757. package/.claude/workflows/cli-templates/prompts/tech/tech-skill-index.txt +0 -185
  758. package/.claude/workflows/cli-templates/prompts/test/test-concept-analysis.txt +0 -179
  759. package/.claude/workflows/cli-templates/prompts/universal/00-universal-creative-style.txt +0 -95
  760. package/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt +0 -92
  761. package/.claude/workflows/cli-templates/prompts/verification/codex-technical.txt +0 -28
  762. package/.claude/workflows/cli-templates/prompts/verification/cross-validation.txt +0 -28
  763. package/.claude/workflows/cli-templates/prompts/verification/gemini-strategic.txt +0 -27
  764. package/.claude/workflows/cli-templates/prompts/workflow/analysis-results-structure.txt +0 -224
  765. package/.claude/workflows/cli-templates/prompts/workflow/codex-feasibility-validation.txt +0 -176
  766. package/.claude/workflows/cli-templates/prompts/workflow/gemini-solution-design.txt +0 -131
  767. package/.claude/workflows/cli-templates/prompts/workflow/impl-plan-template.txt +0 -286
  768. package/.claude/workflows/cli-templates/prompts/workflow/skill-aggregation.txt +0 -172
  769. package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +0 -98
  770. package/.claude/workflows/cli-templates/prompts/workflow/skill-index.txt +0 -224
  771. package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +0 -98
  772. package/.claude/workflows/cli-templates/prompts/workflow/skill-sessions-timeline.txt +0 -53
  773. package/.claude/workflows/cli-templates/prompts/workflow/task-json-agent-mode.txt +0 -123
  774. package/.claude/workflows/cli-templates/prompts/workflow/task-json-cli-mode.txt +0 -182
  775. package/.claude/workflows/cli-templates/schemas/diagnosis-json-schema.json +0 -234
  776. package/.claude/workflows/cli-templates/schemas/explore-json-schema.json +0 -124
  777. package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +0 -273
  778. package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +0 -219
  779. package/.claude/workflows/cli-templates/schemas/project-json-schema.json +0 -221
  780. package/.claude/workflows/cli-templates/schemas/review-deep-dive-results-schema.json +0 -82
  781. package/.claude/workflows/cli-templates/schemas/review-dimension-results-schema.json +0 -51
  782. package/.claude/workflows/cli-templates/tech-stacks/go-dev.md +0 -91
  783. package/.claude/workflows/cli-templates/tech-stacks/java-dev.md +0 -107
  784. package/.claude/workflows/cli-templates/tech-stacks/javascript-dev.md +0 -58
  785. package/.claude/workflows/cli-templates/tech-stacks/python-dev.md +0 -79
  786. package/.claude/workflows/cli-templates/tech-stacks/react-dev.md +0 -103
  787. package/.claude/workflows/cli-templates/tech-stacks/typescript-dev.md +0 -83
  788. package/.claude/workflows/cli-templates/ui-design/systems/animation-tokens.json +0 -247
  789. package/.claude/workflows/cli-templates/ui-design/systems/design-tokens.json +0 -342
  790. package/.claude/workflows/cli-templates/ui-design/systems/layout-templates.json +0 -145
  791. package/.claude/workflows/context-search-strategy.md +0 -77
  792. package/.claude/workflows/intelligent-tools-strategy.md +0 -662
  793. package/.claude/workflows/review-directory-specification.md +0 -336
  794. package/.claude/workflows/task-core.md +0 -214
  795. package/.claude/workflows/tool-strategy.md +0 -79
  796. package/.claude/workflows/workflow-architecture.md +0 -942
  797. package/.codex/AGENTS.md +0 -330
  798. package/.gemini/GEMINI.md +0 -164
  799. package/.qwen/QWEN.md +0 -164
  800. package/CLAUDE.md +0 -91
  801. package/LICENSE +0 -21
  802. package/ccw/README.md +0 -121
  803. package/ccw/bin/ccw.js +0 -10
  804. package/ccw/package.json +0 -47
  805. package/ccw/src/cli.js +0 -119
  806. package/ccw/src/commands/install.js +0 -324
  807. package/ccw/src/commands/list.js +0 -37
  808. package/ccw/src/commands/serve.js +0 -67
  809. package/ccw/src/commands/stop.js +0 -101
  810. package/ccw/src/commands/tool.js +0 -138
  811. package/ccw/src/commands/uninstall.js +0 -238
  812. package/ccw/src/commands/upgrade.js +0 -307
  813. package/ccw/src/commands/view.js +0 -105
  814. package/ccw/src/core/dashboard-generator-patch.js +0 -29
  815. package/ccw/src/core/dashboard-generator.js +0 -682
  816. package/ccw/src/core/data-aggregator.js +0 -409
  817. package/ccw/src/core/lite-scanner.js +0 -373
  818. package/ccw/src/core/manifest.js +0 -201
  819. package/ccw/src/core/server.js +0 -2063
  820. package/ccw/src/core/session-scanner.js +0 -235
  821. package/ccw/src/index.js +0 -9
  822. package/ccw/src/templates/dashboard-css/01-base.css +0 -291
  823. package/ccw/src/templates/dashboard-css/02-session.css +0 -726
  824. package/ccw/src/templates/dashboard-css/04-lite-tasks.css +0 -1171
  825. package/ccw/src/templates/dashboard-css/06-cards.css +0 -1570
  826. package/ccw/src/templates/dashboard-css/07-managers.css +0 -936
  827. package/ccw/src/templates/dashboard-css/09-explorer.css +0 -1397
  828. package/ccw/src/templates/dashboard-js/api.js +0 -200
  829. package/ccw/src/templates/dashboard-js/components/carousel.js +0 -398
  830. package/ccw/src/templates/dashboard-js/components/global-notifications.js +0 -219
  831. package/ccw/src/templates/dashboard-js/components/hook-manager.js +0 -283
  832. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +0 -528
  833. package/ccw/src/templates/dashboard-js/components/modals.js +0 -260
  834. package/ccw/src/templates/dashboard-js/components/navigation.js +0 -245
  835. package/ccw/src/templates/dashboard-js/components/notifications.js +0 -194
  836. package/ccw/src/templates/dashboard-js/components/tabs-other.js +0 -273
  837. package/ccw/src/templates/dashboard-js/main.js +0 -72
  838. package/ccw/src/templates/dashboard-js/state.js +0 -42
  839. package/ccw/src/templates/dashboard-js/utils.js +0 -153
  840. package/ccw/src/templates/dashboard-js/views/explorer.js +0 -852
  841. package/ccw/src/templates/dashboard-js/views/home.js +0 -197
  842. package/ccw/src/templates/dashboard-js/views/hook-manager.js +0 -392
  843. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +0 -685
  844. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +0 -411
  845. package/ccw/src/templates/dashboard-js/views/session-detail.js +0 -780
  846. package/ccw/src/templates/dashboard.html +0 -731
  847. package/ccw/src/tools/classify-folders.js +0 -204
  848. package/ccw/src/tools/convert-tokens-to-css.js +0 -250
  849. package/ccw/src/tools/detect-changed-modules.js +0 -288
  850. package/ccw/src/tools/discover-design-files.js +0 -134
  851. package/ccw/src/tools/edit-file.js +0 -266
  852. package/ccw/src/tools/generate-module-docs.js +0 -416
  853. package/ccw/src/tools/get-modules-by-depth.js +0 -308
  854. package/ccw/src/tools/index.js +0 -176
  855. package/ccw/src/utils/browser-launcher.js +0 -60
  856. package/ccw/src/utils/file-utils.js +0 -48
  857. package/ccw/src/utils/path-resolver.js +0 -279
  858. package/ccw/src/utils/ui.js +0 -148
  859. /package/{ccw/src → src}/templates/dashboard-css/03-tasks.css +0 -0
  860. /package/{ccw/src → src}/templates/dashboard-css/05-context.css +0 -0
  861. /package/{ccw/src → src}/templates/dashboard-css/08-review.css +0 -0
  862. /package/{ccw/src → src}/templates/dashboard-js/components/_conflict_tab.js +0 -0
  863. /package/{ccw/src → src}/templates/dashboard-js/components/_exp_helpers.js +0 -0
  864. /package/{ccw/src → src}/templates/dashboard-js/components/_review_tab.js +0 -0
  865. /package/{ccw/src → src}/templates/dashboard-js/components/flowchart.js +0 -0
  866. /package/{ccw/src → src}/templates/dashboard-js/components/sidebar.js +0 -0
  867. /package/{ccw/src → src}/templates/dashboard-js/components/tabs-context.js +0 -0
  868. /package/{ccw/src → src}/templates/dashboard-js/components/task-drawer-core.js +0 -0
  869. /package/{ccw/src → src}/templates/dashboard-js/components/task-drawer-renderers.js +0 -0
  870. /package/{ccw/src → src}/templates/dashboard-js/components/theme.js +0 -0
  871. /package/{ccw/src → src}/templates/dashboard-js/components/version-check.js +0 -0
  872. /package/{ccw/src → src}/templates/dashboard-js/views/fix-session.js +0 -0
  873. /package/{ccw/src → src}/templates/dashboard-js/views/project-overview.js +0 -0
  874. /package/{ccw/src → src}/templates/dashboard-js/views/review-session.js +0 -0
  875. /package/{ccw/src → src}/templates/review-cycle-dashboard.html +0 -0
  876. /package/{ccw/src → src}/templates/workflow-dashboard.html +0 -0
  877. /package/{ccw/src → src}/tools/ui-generate-preview.js +0 -0
  878. /package/{ccw/src → src}/tools/ui-instantiate-prototypes.js +0 -0
  879. /package/{ccw/src → src}/tools/update-module-claude.js +0 -0
@@ -0,0 +1,1258 @@
1
+ /**
2
+ * Session Clustering Service
3
+ * Intelligently groups related sessions into clusters using multi-dimensional similarity analysis
4
+ */
5
+
6
+ import { CoreMemoryStore, SessionCluster, ClusterMember, SessionMetadataCache } from './core-memory-store.js';
7
+ import { CliHistoryStore } from '../tools/cli-history-store.js';
8
+ import { StoragePaths } from '../config/storage-paths.js';
9
+ import { readdirSync, readFileSync, statSync, existsSync } from 'fs';
10
+ import { join } from 'path';
11
+
12
+ // Clustering dimension weights
13
+ const WEIGHTS = {
14
+ fileOverlap: 0.2,
15
+ temporalProximity: 0.15,
16
+ keywordSimilarity: 0.15,
17
+ vectorSimilarity: 0.3,
18
+ intentAlignment: 0.2,
19
+ };
20
+
21
+ // Clustering threshold (0.4 = moderate similarity required)
22
+ const CLUSTER_THRESHOLD = 0.4;
23
+
24
+ export interface ClusteringOptions {
25
+ scope?: 'all' | 'recent' | 'unclustered';
26
+ timeRange?: { start: string; end: string };
27
+ minClusterSize?: number;
28
+ }
29
+
30
+ export interface ClusteringResult {
31
+ clustersCreated: number;
32
+ sessionsProcessed: number;
33
+ sessionsClustered: number;
34
+ }
35
+
36
+ export class SessionClusteringService {
37
+ private coreMemoryStore: CoreMemoryStore;
38
+ private cliHistoryStore: CliHistoryStore;
39
+ private projectPath: string;
40
+
41
+ constructor(projectPath: string) {
42
+ this.projectPath = projectPath;
43
+ this.coreMemoryStore = new CoreMemoryStore(projectPath);
44
+ this.cliHistoryStore = new CliHistoryStore(projectPath);
45
+ }
46
+
47
+ /**
48
+ * Collect all session sources
49
+ */
50
+ async collectSessions(options?: ClusteringOptions): Promise<SessionMetadataCache[]> {
51
+ const sessions: SessionMetadataCache[] = [];
52
+
53
+ // 1. Core Memories
54
+ const memories = this.coreMemoryStore.getMemories({ archived: false, limit: 1000 });
55
+ for (const memory of memories) {
56
+ const cached = this.coreMemoryStore.getSessionMetadata(memory.id);
57
+ if (cached) {
58
+ sessions.push(cached);
59
+ } else {
60
+ const metadata = this.extractMetadata(memory, 'core_memory');
61
+ sessions.push(metadata);
62
+ }
63
+ }
64
+
65
+ // 2. CLI History
66
+ const history = this.cliHistoryStore.getHistory({ limit: 1000 });
67
+ for (const exec of history.executions) {
68
+ const cached = this.coreMemoryStore.getSessionMetadata(exec.id);
69
+ if (cached) {
70
+ sessions.push(cached);
71
+ } else {
72
+ const conversation = this.cliHistoryStore.getConversation(exec.id);
73
+ if (conversation) {
74
+ const metadata = this.extractMetadata(conversation, 'cli_history');
75
+ sessions.push(metadata);
76
+ }
77
+ }
78
+ }
79
+
80
+ // 3. Workflow Sessions (WFS-*)
81
+ const workflowSessions = await this.parseWorkflowSessions();
82
+ sessions.push(...workflowSessions);
83
+
84
+ // Apply scope filter
85
+ if (options?.scope === 'recent') {
86
+ // Last 30 days
87
+ const cutoff = new Date();
88
+ cutoff.setDate(cutoff.getDate() - 30);
89
+ const cutoffStr = cutoff.toISOString();
90
+ return sessions.filter(s => (s.created_at || '') >= cutoffStr);
91
+ } else if (options?.scope === 'unclustered') {
92
+ // Only sessions not in any cluster
93
+ return sessions.filter(s => {
94
+ const clusters = this.coreMemoryStore.getSessionClusters(s.session_id);
95
+ return clusters.length === 0;
96
+ });
97
+ }
98
+
99
+ return sessions;
100
+ }
101
+
102
+ /**
103
+ * Extract metadata from a session
104
+ */
105
+ extractMetadata(session: any, type: 'core_memory' | 'workflow' | 'cli_history' | 'native'): SessionMetadataCache {
106
+ let content = '';
107
+ let title = '';
108
+ let created_at = '';
109
+
110
+ if (type === 'core_memory') {
111
+ content = session.content || '';
112
+ created_at = session.created_at;
113
+ // Extract title from first line
114
+ const lines = content.split('\n');
115
+ title = lines[0].replace(/^#+\s*/, '').trim().substring(0, 100);
116
+ } else if (type === 'cli_history') {
117
+ // Extract from conversation turns
118
+ const turns = session.turns || [];
119
+ if (turns.length > 0) {
120
+ content = turns.map((t: any) => t.prompt).join('\n');
121
+ title = turns[0].prompt.substring(0, 100);
122
+ created_at = session.created_at || turns[0].timestamp;
123
+ }
124
+ } else if (type === 'workflow') {
125
+ content = session.content || '';
126
+ title = session.title || 'Workflow Session';
127
+ created_at = session.created_at || '';
128
+ }
129
+
130
+ const summary = content.substring(0, 200).trim();
131
+ const keywords = this.extractKeywords(content);
132
+ const file_patterns = this.extractFilePatterns(content);
133
+ const token_estimate = Math.ceil(content.length / 4);
134
+
135
+ return {
136
+ session_id: session.id,
137
+ session_type: type,
138
+ title,
139
+ summary,
140
+ keywords,
141
+ token_estimate,
142
+ file_patterns,
143
+ created_at,
144
+ last_accessed: new Date().toISOString(),
145
+ access_count: 0
146
+ };
147
+ }
148
+
149
+ /**
150
+ * Extract keywords from content
151
+ */
152
+ private extractKeywords(content: string): string[] {
153
+ const keywords = new Set<string>();
154
+
155
+ // 1. File paths (src/xxx, .ts, .js, etc)
156
+ const filePathRegex = /(?:^|\s|["'`])((?:\.\/|\.\.\/|\/)?[\w-]+(?:\/[\w-]+)*\.[\w]+)(?:\s|["'`]|$)/g;
157
+ let match;
158
+ while ((match = filePathRegex.exec(content)) !== null) {
159
+ keywords.add(match[1]);
160
+ }
161
+
162
+ // 2. Function/Class names (camelCase, PascalCase)
163
+ const camelCaseRegex = /\b([A-Z][a-z]+(?:[A-Z][a-z]+)+|[a-z]+[A-Z][a-z]+(?:[A-Z][a-z]+)*)\b/g;
164
+ while ((match = camelCaseRegex.exec(content)) !== null) {
165
+ keywords.add(match[1]);
166
+ }
167
+
168
+ // 3. Technical terms (common frameworks/libraries/concepts)
169
+ const techTerms = [
170
+ // Frameworks
171
+ 'react', 'vue', 'angular', 'typescript', 'javascript', 'node', 'express',
172
+ // Auth
173
+ 'auth', 'authentication', 'jwt', 'oauth', 'session', 'token',
174
+ // Data
175
+ 'api', 'rest', 'graphql', 'database', 'sql', 'mongodb', 'redis',
176
+ // Testing
177
+ 'test', 'testing', 'jest', 'mocha', 'vitest',
178
+ // Development
179
+ 'refactor', 'refactoring', 'optimization', 'performance',
180
+ 'bug', 'fix', 'error', 'issue', 'debug',
181
+ // CCW-specific terms
182
+ 'cluster', 'clustering', 'memory', 'hook', 'service', 'context',
183
+ 'workflow', 'skill', 'prompt', 'embedding', 'vector', 'semantic',
184
+ 'dashboard', 'view', 'route', 'command', 'cli', 'mcp'
185
+ ];
186
+
187
+ const lowerContent = content.toLowerCase();
188
+ for (const term of techTerms) {
189
+ if (lowerContent.includes(term)) {
190
+ keywords.add(term);
191
+ }
192
+ }
193
+
194
+ // 4. Generic word extraction (words >= 4 chars, not stopwords)
195
+ const stopwords = new Set([
196
+ 'the', 'and', 'for', 'that', 'this', 'with', 'from', 'have', 'will',
197
+ 'are', 'was', 'were', 'been', 'being', 'what', 'when', 'where', 'which',
198
+ 'there', 'their', 'they', 'them', 'then', 'than', 'into', 'some', 'such',
199
+ 'only', 'also', 'just', 'more', 'most', 'other', 'after', 'before'
200
+ ]);
201
+
202
+ const wordRegex = /\b([a-z]{4,})\b/g;
203
+ let wordMatch;
204
+ while ((wordMatch = wordRegex.exec(lowerContent)) !== null) {
205
+ const word = wordMatch[1];
206
+ if (!stopwords.has(word)) {
207
+ keywords.add(word);
208
+ }
209
+ }
210
+
211
+ // Return top 20 keywords
212
+ return Array.from(keywords).slice(0, 20);
213
+ }
214
+
215
+ /**
216
+ * Extract file patterns from content
217
+ */
218
+ private extractFilePatterns(content: string): string[] {
219
+ const patterns = new Set<string>();
220
+
221
+ // Extract directory patterns (src/xxx/, lib/xxx/)
222
+ const dirRegex = /\b((?:src|lib|test|dist|build|public|components|utils|services|config|core|tools)(?:\/[\w-]+)*)\//g;
223
+ let match;
224
+ while ((match = dirRegex.exec(content)) !== null) {
225
+ patterns.add(match[1] + '/**');
226
+ }
227
+
228
+ // Extract file extension patterns
229
+ const extRegex = /\.(\w+)(?:\s|$|["'`])/g;
230
+ const extensions = new Set<string>();
231
+ while ((match = extRegex.exec(content)) !== null) {
232
+ extensions.add(match[1]);
233
+ }
234
+
235
+ // Add extension patterns
236
+ if (extensions.size > 0) {
237
+ patterns.add(`**/*.{${Array.from(extensions).join(',')}}`);
238
+ }
239
+
240
+ return Array.from(patterns).slice(0, 10);
241
+ }
242
+
243
+ /**
244
+ * Calculate relevance score between two sessions
245
+ */
246
+ calculateRelevance(session1: SessionMetadataCache, session2: SessionMetadataCache): number {
247
+ const fileScore = this.calculateFileOverlap(session1, session2);
248
+ const temporalScore = this.calculateTemporalProximity(session1, session2);
249
+ const keywordScore = this.calculateSemanticSimilarity(session1, session2);
250
+ const vectorScore = this.calculateVectorSimilarity(session1, session2);
251
+ const intentScore = this.calculateIntentAlignment(session1, session2);
252
+
253
+ return (
254
+ fileScore * WEIGHTS.fileOverlap +
255
+ temporalScore * WEIGHTS.temporalProximity +
256
+ keywordScore * WEIGHTS.keywordSimilarity +
257
+ vectorScore * WEIGHTS.vectorSimilarity +
258
+ intentScore * WEIGHTS.intentAlignment
259
+ );
260
+ }
261
+
262
+ /**
263
+ * Calculate file path overlap score (Jaccard similarity)
264
+ */
265
+ private calculateFileOverlap(s1: SessionMetadataCache, s2: SessionMetadataCache): number {
266
+ const files1 = new Set(s1.file_patterns || []);
267
+ const files2 = new Set(s2.file_patterns || []);
268
+
269
+ if (files1.size === 0 || files2.size === 0) return 0;
270
+
271
+ const intersection = new Set([...files1].filter(f => files2.has(f)));
272
+ const union = new Set([...files1, ...files2]);
273
+
274
+ return intersection.size / union.size;
275
+ }
276
+
277
+ /**
278
+ * Calculate temporal proximity score
279
+ * 24h: 1.0, 7d: 0.7, 30d: 0.4, >30d: 0.1
280
+ */
281
+ private calculateTemporalProximity(s1: SessionMetadataCache, s2: SessionMetadataCache): number {
282
+ if (!s1.created_at || !s2.created_at) return 0.1;
283
+
284
+ const t1 = new Date(s1.created_at).getTime();
285
+ const t2 = new Date(s2.created_at).getTime();
286
+ const diffMs = Math.abs(t1 - t2);
287
+ const diffHours = diffMs / (1000 * 60 * 60);
288
+
289
+ if (diffHours <= 24) return 1.0;
290
+ if (diffHours <= 24 * 7) return 0.7;
291
+ if (diffHours <= 24 * 30) return 0.4;
292
+ return 0.1;
293
+ }
294
+
295
+ /**
296
+ * Calculate semantic similarity using keyword overlap (Jaccard similarity)
297
+ */
298
+ private calculateSemanticSimilarity(s1: SessionMetadataCache, s2: SessionMetadataCache): number {
299
+ const kw1 = new Set(s1.keywords || []);
300
+ const kw2 = new Set(s2.keywords || []);
301
+
302
+ if (kw1.size === 0 || kw2.size === 0) return 0;
303
+
304
+ const intersection = new Set([...kw1].filter(k => kw2.has(k)));
305
+ const union = new Set([...kw1, ...kw2]);
306
+
307
+ return intersection.size / union.size;
308
+ }
309
+
310
+ /**
311
+ * Calculate intent alignment score
312
+ * Based on title/summary keyword matching
313
+ */
314
+ private calculateIntentAlignment(s1: SessionMetadataCache, s2: SessionMetadataCache): number {
315
+ const text1 = ((s1.title || '') + ' ' + (s1.summary || '')).toLowerCase();
316
+ const text2 = ((s2.title || '') + ' ' + (s2.summary || '')).toLowerCase();
317
+
318
+ if (!text1 || !text2) return 0;
319
+
320
+ // Simple word-based TF-IDF approximation
321
+ const words1 = text1.split(/\s+/).filter(w => w.length > 3);
322
+ const words2 = text2.split(/\s+/).filter(w => w.length > 3);
323
+
324
+ const set1 = new Set(words1);
325
+ const set2 = new Set(words2);
326
+
327
+ const intersection = new Set([...set1].filter(w => set2.has(w)));
328
+ const union = new Set([...set1, ...set2]);
329
+
330
+ return intersection.size / union.size;
331
+ }
332
+
333
+ /**
334
+ * Calculate vector similarity using pre-computed embeddings from memory_chunks
335
+ * Returns average cosine similarity of chunk embeddings
336
+ */
337
+ private calculateVectorSimilarity(s1: SessionMetadataCache, s2: SessionMetadataCache): number {
338
+ const embedding1 = this.getSessionEmbedding(s1.session_id);
339
+ const embedding2 = this.getSessionEmbedding(s2.session_id);
340
+
341
+ // Graceful fallback if no embeddings available
342
+ if (!embedding1 || !embedding2) {
343
+ return 0;
344
+ }
345
+
346
+ return this.cosineSimilarity(embedding1, embedding2);
347
+ }
348
+
349
+ /**
350
+ * Get session embedding by averaging all chunk embeddings
351
+ */
352
+ private getSessionEmbedding(sessionId: string): number[] | null {
353
+ const chunks = this.coreMemoryStore.getChunks(sessionId);
354
+
355
+ if (chunks.length === 0) {
356
+ return null;
357
+ }
358
+
359
+ // Filter chunks that have embeddings
360
+ const embeddedChunks = chunks.filter(chunk => chunk.embedding && chunk.embedding.length > 0);
361
+
362
+ if (embeddedChunks.length === 0) {
363
+ return null;
364
+ }
365
+
366
+ // Convert Buffer embeddings to number arrays and calculate average
367
+ const embeddings = embeddedChunks.map(chunk => {
368
+ // Convert Buffer to Float32Array
369
+ const buffer = chunk.embedding!;
370
+ const float32Array = new Float32Array(buffer.buffer, buffer.byteOffset, buffer.byteLength / 4);
371
+ return Array.from(float32Array);
372
+ });
373
+
374
+ // Check all embeddings have same dimension
375
+ const dimension = embeddings[0].length;
376
+ if (!embeddings.every(emb => emb.length === dimension)) {
377
+ console.warn(`[VectorSimilarity] Inconsistent embedding dimensions for session ${sessionId}`);
378
+ return null;
379
+ }
380
+
381
+ // Calculate average embedding
382
+ const avgEmbedding = new Array(dimension).fill(0);
383
+ for (const embedding of embeddings) {
384
+ for (let i = 0; i < dimension; i++) {
385
+ avgEmbedding[i] += embedding[i];
386
+ }
387
+ }
388
+
389
+ for (let i = 0; i < dimension; i++) {
390
+ avgEmbedding[i] /= embeddings.length;
391
+ }
392
+
393
+ return avgEmbedding;
394
+ }
395
+
396
+ /**
397
+ * Calculate cosine similarity between two vectors
398
+ */
399
+ private cosineSimilarity(a: number[], b: number[]): number {
400
+ if (a.length !== b.length) {
401
+ console.warn('[VectorSimilarity] Vector dimension mismatch');
402
+ return 0;
403
+ }
404
+
405
+ let dotProduct = 0;
406
+ let normA = 0;
407
+ let normB = 0;
408
+
409
+ for (let i = 0; i < a.length; i++) {
410
+ dotProduct += a[i] * b[i];
411
+ normA += a[i] * a[i];
412
+ normB += b[i] * b[i];
413
+ }
414
+
415
+ normA = Math.sqrt(normA);
416
+ normB = Math.sqrt(normB);
417
+
418
+ if (normA === 0 || normB === 0) {
419
+ return 0;
420
+ }
421
+
422
+ return dotProduct / (normA * normB);
423
+ }
424
+
425
+ /**
426
+ * Find the most relevant existing cluster for a set of session IDs
427
+ * Returns the cluster with highest session overlap
428
+ */
429
+ private findExistingClusterForSessions(sessionIds: string[]): SessionCluster | null {
430
+ if (sessionIds.length === 0) return null;
431
+
432
+ const clusterCounts = new Map<string, number>();
433
+ let maxCount = 0;
434
+ let bestClusterId: string | null = null;
435
+
436
+ for (const sessionId of sessionIds) {
437
+ const clusters = this.coreMemoryStore.getSessionClusters(sessionId);
438
+ for (const cluster of clusters) {
439
+ if (cluster.status !== 'active') continue;
440
+
441
+ const count = (clusterCounts.get(cluster.id) || 0) + 1;
442
+ clusterCounts.set(cluster.id, count);
443
+
444
+ if (count > maxCount) {
445
+ maxCount = count;
446
+ bestClusterId = cluster.id;
447
+ }
448
+ }
449
+ }
450
+
451
+ if (bestClusterId) {
452
+ return this.coreMemoryStore.getCluster(bestClusterId);
453
+ }
454
+ return null;
455
+ }
456
+
457
+ /**
458
+ * Determine if a new cluster should merge with an existing one
459
+ * Based on 70% session overlap threshold
460
+ */
461
+ private shouldMergeWithExisting(newClusterSessions: SessionMetadataCache[], existingCluster: SessionCluster): boolean {
462
+ const MERGE_THRESHOLD = 0.7;
463
+
464
+ const existingMembers = this.coreMemoryStore.getClusterMembers(existingCluster.id);
465
+ const newSessionIds = new Set(newClusterSessions.map(s => s.session_id));
466
+ const existingSessionIds = new Set(existingMembers.map(m => m.session_id));
467
+
468
+ if (newSessionIds.size === 0) return false;
469
+
470
+ const intersection = new Set([...newSessionIds].filter(id => existingSessionIds.has(id)));
471
+ const overlapRatio = intersection.size / newSessionIds.size;
472
+
473
+ return overlapRatio > MERGE_THRESHOLD;
474
+ }
475
+
476
+ /**
477
+ * Run auto-clustering algorithm
478
+ * Optimized to prevent duplicate clusters by checking existing clusters first
479
+ */
480
+ async autocluster(options?: ClusteringOptions): Promise<ClusteringResult> {
481
+ // 1. Collect sessions based on user-specified scope (default: 'recent')
482
+ const allSessions = await this.collectSessions(options);
483
+ console.log(`[Clustering] Collected ${allSessions.length} sessions (scope: ${options?.scope || 'recent'})`);
484
+
485
+ // 2. Filter out already-clustered sessions to prevent duplicates
486
+ const sessions = allSessions.filter(s => {
487
+ const clusters = this.coreMemoryStore.getSessionClusters(s.session_id);
488
+ return clusters.length === 0;
489
+ });
490
+ console.log(`[Clustering] ${sessions.length} unclustered sessions after filtering`);
491
+
492
+ // 3. Update metadata cache
493
+ for (const session of sessions) {
494
+ this.coreMemoryStore.upsertSessionMetadata(session);
495
+ }
496
+
497
+ // 4. Calculate relevance matrix
498
+ const n = sessions.length;
499
+ const relevanceMatrix: number[][] = Array(n).fill(0).map(() => Array(n).fill(0));
500
+
501
+ let maxScore = 0;
502
+ let avgScore = 0;
503
+ let pairCount = 0;
504
+
505
+ for (let i = 0; i < n; i++) {
506
+ for (let j = i + 1; j < n; j++) {
507
+ const score = this.calculateRelevance(sessions[i], sessions[j]);
508
+ relevanceMatrix[i][j] = score;
509
+ relevanceMatrix[j][i] = score;
510
+
511
+ if (score > maxScore) maxScore = score;
512
+ avgScore += score;
513
+ pairCount++;
514
+ }
515
+ }
516
+
517
+ if (pairCount > 0) {
518
+ avgScore = avgScore / pairCount;
519
+ console.log(`[Clustering] Relevance stats: max=${maxScore.toFixed(3)}, avg=${avgScore.toFixed(3)}, pairs=${pairCount}, threshold=${CLUSTER_THRESHOLD}`);
520
+ }
521
+
522
+ // 5. Agglomerative clustering
523
+ const minClusterSize = options?.minClusterSize || 2;
524
+
525
+ // Early return if not enough sessions
526
+ if (sessions.length < minClusterSize) {
527
+ console.log('[Clustering] Not enough unclustered sessions to form new clusters');
528
+ return { clustersCreated: 0, sessionsProcessed: allSessions.length, sessionsClustered: 0 };
529
+ }
530
+
531
+ const newPotentialClusters = this.agglomerativeClustering(sessions, relevanceMatrix, CLUSTER_THRESHOLD);
532
+ console.log(`[Clustering] Generated ${newPotentialClusters.length} potential clusters`);
533
+
534
+ // 6. Process clusters: create new or merge with existing
535
+ let clustersCreated = 0;
536
+ let clustersMerged = 0;
537
+ let sessionsClustered = 0;
538
+
539
+ for (const clusterSessions of newPotentialClusters) {
540
+ if (clusterSessions.length < minClusterSize) {
541
+ continue; // Skip small clusters
542
+ }
543
+
544
+ const sessionIds = clusterSessions.map(s => s.session_id);
545
+ const existingCluster = this.findExistingClusterForSessions(sessionIds);
546
+
547
+ // Check if we should merge with an existing cluster
548
+ if (existingCluster && this.shouldMergeWithExisting(clusterSessions, existingCluster)) {
549
+ const existingMembers = this.coreMemoryStore.getClusterMembers(existingCluster.id);
550
+ const existingSessionIds = new Set(existingMembers.map(m => m.session_id));
551
+
552
+ // Only add sessions not already in the cluster
553
+ const newSessions = clusterSessions.filter(s => !existingSessionIds.has(s.session_id));
554
+
555
+ if (newSessions.length > 0) {
556
+ newSessions.forEach((session, index) => {
557
+ this.coreMemoryStore.addClusterMember({
558
+ cluster_id: existingCluster.id,
559
+ session_id: session.session_id,
560
+ session_type: session.session_type as 'core_memory' | 'workflow' | 'cli_history' | 'native',
561
+ sequence_order: existingMembers.length + index + 1,
562
+ relevance_score: 1.0
563
+ });
564
+ });
565
+
566
+ // Update cluster description
567
+ this.coreMemoryStore.updateCluster(existingCluster.id, {
568
+ description: `Auto-generated cluster with ${existingMembers.length + newSessions.length} sessions`
569
+ });
570
+
571
+ clustersMerged++;
572
+ sessionsClustered += newSessions.length;
573
+ console.log(`[Clustering] Merged ${newSessions.length} sessions into existing cluster '${existingCluster.name}'`);
574
+ }
575
+ } else {
576
+ // Create new cluster
577
+ const clusterName = this.generateClusterName(clusterSessions);
578
+ const clusterIntent = this.generateClusterIntent(clusterSessions);
579
+
580
+ const clusterRecord = this.coreMemoryStore.createCluster({
581
+ name: clusterName,
582
+ description: `Auto-generated cluster with ${clusterSessions.length} sessions`,
583
+ intent: clusterIntent,
584
+ status: 'active'
585
+ });
586
+
587
+ // Add members
588
+ clusterSessions.forEach((session, index) => {
589
+ this.coreMemoryStore.addClusterMember({
590
+ cluster_id: clusterRecord.id,
591
+ session_id: session.session_id,
592
+ session_type: session.session_type as 'core_memory' | 'workflow' | 'cli_history' | 'native',
593
+ sequence_order: index + 1,
594
+ relevance_score: 1.0
595
+ });
596
+ });
597
+
598
+ clustersCreated++;
599
+ sessionsClustered += clusterSessions.length;
600
+ }
601
+ }
602
+
603
+ console.log(`[Clustering] Summary: ${clustersCreated} created, ${clustersMerged} merged, ${allSessions.length - sessions.length} already clustered`);
604
+
605
+ return {
606
+ clustersCreated,
607
+ sessionsProcessed: allSessions.length,
608
+ sessionsClustered
609
+ };
610
+ }
611
+
612
+ /**
613
+ * Deduplicate clusters by merging similar ones
614
+ * Clusters with same name or >50% member overlap are merged
615
+ * @returns Statistics about deduplication
616
+ */
617
+ async deduplicateClusters(): Promise<{ merged: number; deleted: number; remaining: number }> {
618
+ const clusters = this.coreMemoryStore.listClusters('active');
619
+ console.log(`[Dedup] Analyzing ${clusters.length} active clusters`);
620
+
621
+ if (clusters.length < 2) {
622
+ return { merged: 0, deleted: 0, remaining: clusters.length };
623
+ }
624
+
625
+ // Group clusters by name (case-insensitive)
626
+ const byName = new Map<string, typeof clusters>();
627
+ for (const cluster of clusters) {
628
+ const key = cluster.name.toLowerCase().trim();
629
+ if (!byName.has(key)) {
630
+ byName.set(key, []);
631
+ }
632
+ byName.get(key)!.push(cluster);
633
+ }
634
+
635
+ let merged = 0;
636
+ let deleted = 0;
637
+
638
+ // Merge clusters with same name
639
+ for (const [name, group] of byName) {
640
+ if (group.length < 2) continue;
641
+
642
+ // Sort by created_at (oldest first) to keep the original
643
+ group.sort((a, b) => a.created_at.localeCompare(b.created_at));
644
+ const target = group[0];
645
+ const sources = group.slice(1).map(c => c.id);
646
+
647
+ console.log(`[Dedup] Merging ${sources.length} duplicate clusters named '${name}' into ${target.id}`);
648
+
649
+ try {
650
+ const membersMoved = this.coreMemoryStore.mergeClusters(target.id, sources);
651
+ merged += sources.length;
652
+ console.log(`[Dedup] Moved ${membersMoved} members, deleted ${sources.length} clusters`);
653
+ } catch (error) {
654
+ console.warn(`[Dedup] Failed to merge: ${(error as Error).message}`);
655
+ }
656
+ }
657
+
658
+ // Check for clusters with high member overlap
659
+ const remainingClusters = this.coreMemoryStore.listClusters('active');
660
+ const clusterMembers = new Map<string, Set<string>>();
661
+
662
+ for (const cluster of remainingClusters) {
663
+ const members = this.coreMemoryStore.getClusterMembers(cluster.id);
664
+ clusterMembers.set(cluster.id, new Set(members.map(m => m.session_id)));
665
+ }
666
+
667
+ // Find and merge overlapping clusters
668
+ const processed = new Set<string>();
669
+ for (let i = 0; i < remainingClusters.length; i++) {
670
+ const clusterA = remainingClusters[i];
671
+ if (processed.has(clusterA.id)) continue;
672
+
673
+ const membersA = clusterMembers.get(clusterA.id)!;
674
+ const toMerge: string[] = [];
675
+
676
+ for (let j = i + 1; j < remainingClusters.length; j++) {
677
+ const clusterB = remainingClusters[j];
678
+ if (processed.has(clusterB.id)) continue;
679
+
680
+ const membersB = clusterMembers.get(clusterB.id)!;
681
+ const intersection = new Set([...membersA].filter(m => membersB.has(m)));
682
+
683
+ // Calculate overlap ratio (based on smaller cluster)
684
+ const minSize = Math.min(membersA.size, membersB.size);
685
+ if (minSize > 0 && intersection.size / minSize >= 0.5) {
686
+ toMerge.push(clusterB.id);
687
+ processed.add(clusterB.id);
688
+ }
689
+ }
690
+
691
+ if (toMerge.length > 0) {
692
+ console.log(`[Dedup] Merging ${toMerge.length} overlapping clusters into ${clusterA.id}`);
693
+ try {
694
+ this.coreMemoryStore.mergeClusters(clusterA.id, toMerge);
695
+ merged += toMerge.length;
696
+ } catch (error) {
697
+ console.warn(`[Dedup] Failed to merge overlapping: ${(error as Error).message}`);
698
+ }
699
+ }
700
+ }
701
+
702
+ // Delete empty clusters
703
+ const finalClusters = this.coreMemoryStore.listClusters('active');
704
+ for (const cluster of finalClusters) {
705
+ const members = this.coreMemoryStore.getClusterMembers(cluster.id);
706
+ if (members.length === 0) {
707
+ this.coreMemoryStore.deleteCluster(cluster.id);
708
+ deleted++;
709
+ console.log(`[Dedup] Deleted empty cluster: ${cluster.id}`);
710
+ }
711
+ }
712
+
713
+ const remaining = this.coreMemoryStore.listClusters('active').length;
714
+ console.log(`[Dedup] Complete: ${merged} merged, ${deleted} deleted, ${remaining} remaining`);
715
+
716
+ return { merged, deleted, remaining };
717
+ }
718
+
719
+ /**
720
+ * Agglomerative clustering algorithm
721
+ * Returns array of clusters (each cluster is array of sessions)
722
+ */
723
+ private agglomerativeClustering(
724
+ sessions: SessionMetadataCache[],
725
+ relevanceMatrix: number[][],
726
+ threshold: number
727
+ ): SessionMetadataCache[][] {
728
+ const n = sessions.length;
729
+
730
+ // Initialize: each session is its own cluster
731
+ const clusters: Set<number>[] = sessions.map((_, i) => new Set([i]));
732
+
733
+ while (true) {
734
+ let maxScore = -1;
735
+ let mergeI = -1;
736
+ let mergeJ = -1;
737
+
738
+ // Find pair of clusters with highest average linkage
739
+ for (let i = 0; i < clusters.length; i++) {
740
+ for (let j = i + 1; j < clusters.length; j++) {
741
+ const score = this.averageLinkage(clusters[i], clusters[j], relevanceMatrix);
742
+ if (score > maxScore) {
743
+ maxScore = score;
744
+ mergeI = i;
745
+ mergeJ = j;
746
+ }
747
+ }
748
+ }
749
+
750
+ // Stop if no pair exceeds threshold
751
+ if (maxScore < threshold) break;
752
+
753
+ // Merge clusters
754
+ const merged = new Set([...clusters[mergeI], ...clusters[mergeJ]]);
755
+ clusters.splice(mergeJ, 1); // Remove j first (higher index)
756
+ clusters.splice(mergeI, 1);
757
+ clusters.push(merged);
758
+ }
759
+
760
+ // Convert cluster indices to sessions
761
+ return clusters.map(cluster =>
762
+ Array.from(cluster).map(i => sessions[i])
763
+ );
764
+ }
765
+
766
+ /**
767
+ * Calculate average linkage between two clusters
768
+ */
769
+ private averageLinkage(
770
+ cluster1: Set<number>,
771
+ cluster2: Set<number>,
772
+ relevanceMatrix: number[][]
773
+ ): number {
774
+ let sum = 0;
775
+ let count = 0;
776
+
777
+ for (const i of cluster1) {
778
+ for (const j of cluster2) {
779
+ sum += relevanceMatrix[i][j];
780
+ count++;
781
+ }
782
+ }
783
+
784
+ return count > 0 ? sum / count : 0;
785
+ }
786
+
787
+ /**
788
+ * Generate cluster name from members
789
+ */
790
+ private generateClusterName(members: SessionMetadataCache[]): string {
791
+ // Count keyword frequency
792
+ const keywordFreq = new Map<string, number>();
793
+ for (const member of members) {
794
+ for (const keyword of member.keywords || []) {
795
+ keywordFreq.set(keyword, (keywordFreq.get(keyword) || 0) + 1);
796
+ }
797
+ }
798
+
799
+ // Get top 2 keywords
800
+ const sorted = Array.from(keywordFreq.entries())
801
+ .sort((a, b) => b[1] - a[1])
802
+ .map(([kw]) => kw);
803
+
804
+ if (sorted.length >= 2) {
805
+ return `${sorted[0]}-${sorted[1]}`;
806
+ } else if (sorted.length === 1) {
807
+ return sorted[0];
808
+ } else {
809
+ return 'unnamed-cluster';
810
+ }
811
+ }
812
+
813
+ /**
814
+ * Generate cluster intent from members
815
+ */
816
+ private generateClusterIntent(members: SessionMetadataCache[]): string {
817
+ // Extract common action words from titles
818
+ const actionWords = ['implement', 'refactor', 'fix', 'add', 'create', 'update', 'optimize'];
819
+ const titles = members.map(m => (m.title || '').toLowerCase());
820
+
821
+ for (const action of actionWords) {
822
+ const count = titles.filter(t => t.includes(action)).length;
823
+ if (count >= members.length / 2) {
824
+ const topic = this.generateClusterName(members);
825
+ return `${action.charAt(0).toUpperCase() + action.slice(1)} ${topic}`;
826
+ }
827
+ }
828
+
829
+ return `Work on ${this.generateClusterName(members)}`;
830
+ }
831
+
832
+ /**
833
+ * Get progressive disclosure index for hook
834
+ * @param options - Configuration options
835
+ * @param options.type - 'session-start' returns recent sessions, 'context' returns intent-matched sessions
836
+ * @param options.sessionId - Current session ID (optional)
837
+ * @param options.prompt - User prompt for intent matching (required for 'context' type)
838
+ */
839
+ async getProgressiveIndex(options: {
840
+ type: 'session-start' | 'context';
841
+ sessionId?: string;
842
+ prompt?: string;
843
+ }): Promise<string> {
844
+ const { type, sessionId, prompt } = options;
845
+
846
+ // For session-start: return recent sessions by time
847
+ if (type === 'session-start') {
848
+ return this.getRecentSessionsIndex();
849
+ }
850
+
851
+ // For context: return intent-matched sessions based on prompt
852
+ if (type === 'context' && prompt) {
853
+ return this.getIntentMatchedIndex(prompt, sessionId);
854
+ }
855
+
856
+ // Fallback to recent sessions
857
+ return this.getRecentSessionsIndex();
858
+ }
859
+
860
+ /**
861
+ * Get recent sessions index (for session-start)
862
+ * Shows sessions grouped by clusters with progressive disclosure
863
+ */
864
+ private async getRecentSessionsIndex(): Promise<string> {
865
+ // 1. Get all active clusters
866
+ const allClusters = this.coreMemoryStore.listClusters('active');
867
+
868
+ // Sort clusters by most recent activity (based on member last_accessed)
869
+ const clustersWithActivity = allClusters.map(cluster => {
870
+ const members = this.coreMemoryStore.getClusterMembers(cluster.id);
871
+ const memberMetadata = members
872
+ .map(m => this.coreMemoryStore.getSessionMetadata(m.session_id))
873
+ .filter((m): m is SessionMetadataCache => m !== null);
874
+
875
+ const lastActivity = memberMetadata.reduce((latest, m) => {
876
+ const accessed = m.last_accessed || m.created_at || '';
877
+ return accessed > latest ? accessed : latest;
878
+ }, '');
879
+
880
+ return { cluster, members, memberMetadata, lastActivity };
881
+ }).sort((a, b) => b.lastActivity.localeCompare(a.lastActivity));
882
+
883
+ // 2. Get unclustered recent sessions
884
+ const allSessions = await this.collectSessions({ scope: 'recent' });
885
+ const clusteredSessionIds = new Set<string>();
886
+ clustersWithActivity.forEach(c => {
887
+ c.members.forEach(m => clusteredSessionIds.add(m.session_id));
888
+ });
889
+
890
+ const unclusteredSessions = allSessions
891
+ .filter(s => !clusteredSessionIds.has(s.session_id))
892
+ .sort((a, b) => (b.created_at || '').localeCompare(a.created_at || ''))
893
+ .slice(0, 3);
894
+
895
+ // 3. Build output
896
+ let output = `<ccw-session-context>\n## 📋 Session Context (Progressive Disclosure)\n\n`;
897
+
898
+ // Show top 2 active clusters
899
+ const topClusters = clustersWithActivity.slice(0, 2);
900
+ if (topClusters.length > 0) {
901
+ output += `### 🔗 Active Clusters\n\n`;
902
+
903
+ for (const { cluster, memberMetadata } of topClusters) {
904
+ output += `**${cluster.name}** (${memberMetadata.length} sessions)\n`;
905
+ if (cluster.intent) {
906
+ output += `> Intent: ${cluster.intent}\n`;
907
+ }
908
+ output += `\n| Session | Type | Title |\n|---------|------|-------|\n`;
909
+
910
+ // Show top 3 members per cluster
911
+ const displayMembers = memberMetadata.slice(0, 3);
912
+ for (const m of displayMembers) {
913
+ const type = m.session_type === 'core_memory' ? 'Core' :
914
+ m.session_type === 'workflow' ? 'Workflow' : 'CLI';
915
+ const title = (m.title || '').substring(0, 35);
916
+ output += `| ${m.session_id} | ${type} | ${title} |\n`;
917
+ }
918
+
919
+ if (memberMetadata.length > 3) {
920
+ output += `| ... | ... | +${memberMetadata.length - 3} more |\n`;
921
+ }
922
+ output += `\n`;
923
+ }
924
+ }
925
+
926
+ // Show unclustered recent sessions
927
+ if (unclusteredSessions.length > 0) {
928
+ output += `### 📝 Recent Sessions (Unclustered)\n\n`;
929
+ output += `| Session | Type | Title | Date |\n`;
930
+ output += `|---------|------|-------|------|\n`;
931
+
932
+ for (const s of unclusteredSessions) {
933
+ const type = s.session_type === 'core_memory' ? 'Core' :
934
+ s.session_type === 'workflow' ? 'Workflow' : 'CLI';
935
+ const title = (s.title || '').substring(0, 30);
936
+ const date = s.created_at ? new Date(s.created_at).toLocaleDateString() : '';
937
+ output += `| ${s.session_id} | ${type} | ${title} | ${date} |\n`;
938
+ }
939
+ output += `\n`;
940
+ }
941
+
942
+ // If nothing found
943
+ if (topClusters.length === 0 && unclusteredSessions.length === 0) {
944
+ output += `No recent sessions found. Start a new workflow to begin tracking.\n\n`;
945
+ }
946
+
947
+ // Add MCP tools reference
948
+ const topSession = topClusters[0]?.memberMetadata[0] || unclusteredSessions[0];
949
+ const topClusterId = topClusters[0]?.cluster.id;
950
+
951
+ output += `**MCP Tools**:\n\`\`\`\n`;
952
+ if (topSession) {
953
+ output += `# Resume session\nmcp__ccw-tools__core_memory({ "operation": "export", "id": "${topSession.session_id}" })\n\n`;
954
+ }
955
+ if (topClusterId) {
956
+ output += `# Load cluster context\nmcp__ccw-tools__core_memory({ "operation": "search", "query": "cluster:${topClusterId}" })\n`;
957
+ }
958
+ output += `\`\`\`\n</ccw-session-context>`;
959
+
960
+ return output;
961
+ }
962
+
963
+ /**
964
+ * Get intent-matched sessions index (for context with prompt)
965
+ * Shows sessions grouped by clusters and ranked by relevance
966
+ */
967
+ private async getIntentMatchedIndex(prompt: string, sessionId?: string): Promise<string> {
968
+ const sessions = await this.collectSessions({ scope: 'all' });
969
+
970
+ if (sessions.length === 0) {
971
+ return `<ccw-session-context>
972
+ ## 📋 Related Sessions
973
+
974
+ No sessions available for intent matching.
975
+ </ccw-session-context>`;
976
+ }
977
+
978
+ // Create a virtual session from the prompt for similarity calculation
979
+ const promptSession: SessionMetadataCache = {
980
+ session_id: 'prompt-virtual',
981
+ session_type: 'native',
982
+ title: prompt.substring(0, 100),
983
+ summary: prompt.substring(0, 200),
984
+ keywords: this.extractKeywords(prompt),
985
+ token_estimate: Math.ceil(prompt.length / 4),
986
+ file_patterns: this.extractFilePatterns(prompt),
987
+ created_at: new Date().toISOString(),
988
+ last_accessed: new Date().toISOString(),
989
+ access_count: 0
990
+ };
991
+
992
+ // Build session-to-cluster mapping
993
+ const sessionClusterMap = new Map<string, SessionCluster[]>();
994
+ const allClusters = this.coreMemoryStore.listClusters('active');
995
+ for (const cluster of allClusters) {
996
+ const members = this.coreMemoryStore.getClusterMembers(cluster.id);
997
+ for (const member of members) {
998
+ const existing = sessionClusterMap.get(member.session_id) || [];
999
+ existing.push(cluster);
1000
+ sessionClusterMap.set(member.session_id, existing);
1001
+ }
1002
+ }
1003
+
1004
+ // Calculate relevance scores for all sessions
1005
+ const scoredSessions = sessions
1006
+ .filter(s => s.session_id !== sessionId) // Exclude current session
1007
+ .map(s => ({
1008
+ session: s,
1009
+ score: this.calculateRelevance(promptSession, s),
1010
+ clusters: sessionClusterMap.get(s.session_id) || []
1011
+ }))
1012
+ .filter(item => item.score >= 0.15) // Minimum relevance threshold (lowered for file-path-based keywords)
1013
+ .sort((a, b) => b.score - a.score)
1014
+ .slice(0, 8); // Top 8 relevant sessions
1015
+
1016
+ if (scoredSessions.length === 0) {
1017
+ return `<ccw-session-context>
1018
+ ## 📋 Related Sessions
1019
+
1020
+ No sessions match current intent. Consider:
1021
+ - Starting fresh with a new approach
1022
+ - Using \`search\` to find sessions by keyword
1023
+
1024
+ **MCP Tools**:
1025
+ \`\`\`
1026
+ mcp__ccw-tools__core_memory({ "operation": "search", "query": "<keyword>" })
1027
+ \`\`\`
1028
+ </ccw-session-context>`;
1029
+ }
1030
+
1031
+ // Group sessions by cluster
1032
+ const clusterGroups = new Map<string, { cluster: SessionCluster; sessions: typeof scoredSessions }>();
1033
+ const unclusteredSessions: typeof scoredSessions = [];
1034
+
1035
+ for (const item of scoredSessions) {
1036
+ if (item.clusters.length > 0) {
1037
+ // Add to the highest-priority cluster
1038
+ const primaryCluster = item.clusters[0];
1039
+ const existing = clusterGroups.get(primaryCluster.id) || { cluster: primaryCluster, sessions: [] };
1040
+ existing.sessions.push(item);
1041
+ clusterGroups.set(primaryCluster.id, existing);
1042
+ } else {
1043
+ unclusteredSessions.push(item);
1044
+ }
1045
+ }
1046
+
1047
+ // Sort cluster groups by best session score
1048
+ const sortedGroups = Array.from(clusterGroups.values())
1049
+ .sort((a, b) => Math.max(...b.sessions.map(s => s.score)) - Math.max(...a.sessions.map(s => s.score)));
1050
+
1051
+ // Generate output
1052
+ let output = `<ccw-session-context>\n## 📋 Intent-Matched Sessions\n\n`;
1053
+ output += `**Detected Intent**: ${(promptSession.keywords || []).slice(0, 5).join(', ') || 'General'}\n\n`;
1054
+
1055
+ // Show clustered sessions
1056
+ if (sortedGroups.length > 0) {
1057
+ output += `### 🔗 Matched Clusters\n\n`;
1058
+
1059
+ for (const { cluster, sessions: clusterSessions } of sortedGroups.slice(0, 2)) {
1060
+ const avgScore = Math.round(clusterSessions.reduce((sum, s) => sum + s.score, 0) / clusterSessions.length * 100);
1061
+ output += `**${cluster.name}** (${avgScore}% avg match)\n`;
1062
+ if (cluster.intent) {
1063
+ output += `> ${cluster.intent}\n`;
1064
+ }
1065
+ output += `\n| Session | Match | Title |\n|---------|-------|-------|\n`;
1066
+
1067
+ for (const item of clusterSessions.slice(0, 3)) {
1068
+ const matchPct = Math.round(item.score * 100);
1069
+ const title = (item.session.title || '').substring(0, 35);
1070
+ output += `| ${item.session.session_id} | ${matchPct}% | ${title} |\n`;
1071
+ }
1072
+ output += `\n`;
1073
+ }
1074
+ }
1075
+
1076
+ // Show unclustered sessions
1077
+ if (unclusteredSessions.length > 0) {
1078
+ output += `### 📝 Individual Matches\n\n`;
1079
+ output += `| Session | Type | Match | Title |\n`;
1080
+ output += `|---------|------|-------|-------|\n`;
1081
+
1082
+ for (const item of unclusteredSessions.slice(0, 4)) {
1083
+ const type = item.session.session_type === 'core_memory' ? 'Core' :
1084
+ item.session.session_type === 'workflow' ? 'Workflow' : 'CLI';
1085
+ const matchPct = Math.round(item.score * 100);
1086
+ const title = (item.session.title || '').substring(0, 30);
1087
+ output += `| ${item.session.session_id} | ${type} | ${matchPct}% | ${title} |\n`;
1088
+ }
1089
+ output += `\n`;
1090
+ }
1091
+
1092
+ // Add MCP tools reference
1093
+ const topSession = scoredSessions[0];
1094
+ const topCluster = sortedGroups[0]?.cluster;
1095
+
1096
+ output += `**MCP Tools**:\n\`\`\`\n`;
1097
+ output += `# Resume top match\nmcp__ccw-tools__core_memory({ "operation": "export", "id": "${topSession.session.session_id}" })\n`;
1098
+ if (topCluster) {
1099
+ output += `\n# Load cluster context\nmcp__ccw-tools__core_memory({ "operation": "search", "query": "cluster:${topCluster.id}" })\n`;
1100
+ }
1101
+ output += `\`\`\`\n</ccw-session-context>`;
1102
+
1103
+ return output;
1104
+ }
1105
+
1106
+ /**
1107
+ * Legacy method for backward compatibility
1108
+ * @deprecated Use getProgressiveIndex({ type, sessionId, prompt }) instead
1109
+ */
1110
+ async getProgressiveIndexLegacy(sessionId?: string): Promise<string> {
1111
+ let activeCluster: SessionCluster | null = null;
1112
+ let members: SessionMetadataCache[] = [];
1113
+
1114
+ if (sessionId) {
1115
+ const clusters = this.coreMemoryStore.getSessionClusters(sessionId);
1116
+ if (clusters.length > 0) {
1117
+ activeCluster = clusters[0];
1118
+ const clusterMembers = this.coreMemoryStore.getClusterMembers(activeCluster.id);
1119
+ members = clusterMembers
1120
+ .map(m => this.coreMemoryStore.getSessionMetadata(m.session_id))
1121
+ .filter((m): m is SessionMetadataCache => m !== null)
1122
+ .sort((a, b) => (a.created_at || '').localeCompare(b.created_at || ''));
1123
+ }
1124
+ }
1125
+
1126
+ if (!activeCluster || members.length === 0) {
1127
+ return `<ccw-session-context>
1128
+ ## 📋 Related Sessions Index
1129
+
1130
+ No active cluster found. Start a new workflow or continue from recent sessions.
1131
+
1132
+ **MCP Tools**:
1133
+ \`\`\`
1134
+ # Search sessions
1135
+ Use tool: mcp__ccw-tools__core_memory
1136
+ Parameters: { "action": "search", "query": "<keyword>" }
1137
+
1138
+ # Trigger clustering
1139
+ Parameters: { "action": "cluster", "scope": "auto" }
1140
+ \`\`\`
1141
+ </ccw-session-context>`;
1142
+ }
1143
+
1144
+ // Generate table
1145
+ let table = `| # | Session | Type | Summary | Tokens |\n`;
1146
+ table += `|---|---------|------|---------|--------|\n`;
1147
+
1148
+ members.forEach((m, idx) => {
1149
+ const type = m.session_type === 'core_memory' ? 'Core' :
1150
+ m.session_type === 'workflow' ? 'Workflow' : 'CLI';
1151
+ const summary = (m.summary || '').substring(0, 40);
1152
+ const token = `~${m.token_estimate || 0}`;
1153
+ table += `| ${idx + 1} | ${m.session_id} | ${type} | ${summary} | ${token} |\n`;
1154
+ });
1155
+
1156
+ // Generate timeline - show multiple recent sessions
1157
+ let timeline = '';
1158
+ if (members.length > 0) {
1159
+ const timelineEntries: string[] = [];
1160
+ const displayCount = Math.min(members.length, 3); // Show last 3 sessions
1161
+
1162
+ for (let i = members.length - displayCount; i < members.length; i++) {
1163
+ const member = members[i];
1164
+ const date = member.created_at ? new Date(member.created_at).toLocaleDateString() : '';
1165
+ const title = member.title?.substring(0, 30) || 'Untitled';
1166
+ const isCurrent = i === members.length - 1;
1167
+ const marker = isCurrent ? ' ← Current' : '';
1168
+ timelineEntries.push(`${date} ─●─ ${member.session_id} (${title})${marker}`);
1169
+ }
1170
+
1171
+ timeline = `\`\`\`\n${timelineEntries.join('\n │\n')}\n\`\`\``;
1172
+ }
1173
+
1174
+ return `<ccw-session-context>
1175
+ ## 📋 Related Sessions Index
1176
+
1177
+ ### 🔗 Active Cluster: ${activeCluster.name} (${members.length} sessions)
1178
+ **Intent**: ${activeCluster.intent || 'No intent specified'}
1179
+
1180
+ ${table}
1181
+
1182
+ **Resume via MCP**:
1183
+ \`\`\`
1184
+ Use tool: mcp__ccw-tools__core_memory
1185
+ Parameters: { "action": "load", "id": "${members[members.length - 1].session_id}" }
1186
+
1187
+ Or load entire cluster:
1188
+ { "action": "load-cluster", "clusterId": "${activeCluster.id}" }
1189
+ \`\`\`
1190
+
1191
+ ### 📊 Timeline
1192
+ ${timeline}
1193
+
1194
+ ---
1195
+ **Tip**: Use \`mcp__ccw-tools__core_memory({ action: "search", query: "<keyword>" })\` to find more sessions
1196
+ </ccw-session-context>`;
1197
+ }
1198
+
1199
+ /**
1200
+ * Parse workflow session files
1201
+ */
1202
+ private async parseWorkflowSessions(): Promise<SessionMetadataCache[]> {
1203
+ const sessions: SessionMetadataCache[] = [];
1204
+ const workflowDir = join(this.projectPath, '.workflow', 'sessions');
1205
+
1206
+ if (!existsSync(workflowDir)) {
1207
+ return sessions;
1208
+ }
1209
+
1210
+ try {
1211
+ const sessionDirs = readdirSync(workflowDir).filter(d => d.startsWith('WFS-'));
1212
+
1213
+ for (const sessionDir of sessionDirs) {
1214
+ const sessionFile = join(workflowDir, sessionDir, 'session.json');
1215
+ if (!existsSync(sessionFile)) continue;
1216
+
1217
+ try {
1218
+ const content = readFileSync(sessionFile, 'utf8');
1219
+ const sessionData = JSON.parse(content);
1220
+
1221
+ const metadata: SessionMetadataCache = {
1222
+ session_id: sessionDir,
1223
+ session_type: 'workflow',
1224
+ title: sessionData.title || sessionDir,
1225
+ summary: (sessionData.description || '').substring(0, 200),
1226
+ keywords: this.extractKeywords(JSON.stringify(sessionData)),
1227
+ token_estimate: Math.ceil(JSON.stringify(sessionData).length / 4),
1228
+ file_patterns: this.extractFilePatterns(JSON.stringify(sessionData)),
1229
+ created_at: sessionData.created_at || statSync(sessionFile).mtime.toISOString(),
1230
+ last_accessed: new Date().toISOString(),
1231
+ access_count: 0
1232
+ };
1233
+
1234
+ sessions.push(metadata);
1235
+ } catch (err) {
1236
+ console.warn(`[Clustering] Failed to parse ${sessionFile}:`, err);
1237
+ }
1238
+ }
1239
+ } catch (err) {
1240
+ console.warn('[Clustering] Failed to read workflow sessions:', err);
1241
+ }
1242
+
1243
+ return sessions;
1244
+ }
1245
+
1246
+ /**
1247
+ * Update metadata cache for all sessions
1248
+ */
1249
+ async refreshMetadataCache(): Promise<number> {
1250
+ const sessions = await this.collectSessions({ scope: 'all' });
1251
+
1252
+ for (const session of sessions) {
1253
+ this.coreMemoryStore.upsertSessionMetadata(session);
1254
+ }
1255
+
1256
+ return sessions.length;
1257
+ }
1258
+ }