claude-code-workflow 6.1.4 → 6.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (437) hide show
  1. package/.claude/CLAUDE.md +10 -0
  2. package/.claude/agents/action-planning-agent.md +857 -778
  3. package/.claude/agents/cli-execution-agent.md +266 -269
  4. package/.claude/agents/cli-explore-agent.md +2 -2
  5. package/.claude/agents/cli-lite-planning-agent.md +142 -92
  6. package/.claude/agents/cli-planning-agent.md +4 -4
  7. package/.claude/agents/code-developer.md +7 -6
  8. package/.claude/agents/conceptual-planning-agent.md +2 -2
  9. package/.claude/agents/context-search-agent.md +31 -32
  10. package/.claude/agents/doc-generator.md +4 -4
  11. package/.claude/agents/memory-bridge.md +93 -93
  12. package/.claude/agents/test-context-search-agent.md +8 -7
  13. package/.claude/agents/test-fix-agent.md +7 -6
  14. package/.claude/commands/clean.md +516 -0
  15. package/.claude/commands/memory/compact.md +383 -0
  16. package/.claude/commands/memory/docs-full-cli.md +471 -471
  17. package/.claude/commands/memory/docs-related-cli.md +386 -386
  18. package/.claude/commands/memory/docs.md +615 -615
  19. package/.claude/commands/memory/load.md +5 -5
  20. package/.claude/commands/memory/tech-research-rules.md +310 -0
  21. package/.claude/commands/memory/update-full.md +332 -332
  22. package/.claude/commands/memory/workflow-skill-memory.md +4 -4
  23. package/.claude/commands/task/create.md +151 -151
  24. package/.claude/commands/version.md +254 -254
  25. package/.claude/commands/workflow/brainstorm/api-designer.md +587 -585
  26. package/.claude/commands/workflow/brainstorm/artifacts.md +1 -0
  27. package/.claude/commands/workflow/brainstorm/auto-parallel.md +443 -443
  28. package/.claude/commands/workflow/brainstorm/data-architect.md +220 -220
  29. package/.claude/commands/workflow/brainstorm/product-manager.md +200 -200
  30. package/.claude/commands/workflow/brainstorm/product-owner.md +200 -200
  31. package/.claude/commands/workflow/brainstorm/scrum-master.md +200 -200
  32. package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
  33. package/.claude/commands/workflow/brainstorm/system-architect.md +389 -387
  34. package/.claude/commands/workflow/brainstorm/ui-designer.md +221 -221
  35. package/.claude/commands/workflow/brainstorm/ux-expert.md +221 -221
  36. package/.claude/commands/workflow/debug.md +321 -0
  37. package/.claude/commands/workflow/execute.md +13 -0
  38. package/.claude/commands/workflow/init.md +165 -164
  39. package/.claude/commands/workflow/lite-execute.md +119 -13
  40. package/.claude/commands/workflow/lite-fix.md +623 -621
  41. package/.claude/commands/workflow/lite-plan.md +610 -592
  42. package/.claude/commands/workflow/plan.md +5 -5
  43. package/.claude/commands/workflow/review-module-cycle.md +2 -0
  44. package/.claude/commands/workflow/review-session-cycle.md +2 -0
  45. package/.claude/commands/workflow/review.md +297 -291
  46. package/.claude/commands/workflow/session/complete.md +153 -500
  47. package/.claude/commands/workflow/session/list.md +95 -95
  48. package/.claude/commands/workflow/session/resume.md +60 -60
  49. package/.claude/commands/workflow/session/start.md +199 -199
  50. package/.claude/commands/workflow/tdd-plan.md +3 -3
  51. package/.claude/commands/workflow/tdd-verify.md +23 -9
  52. package/.claude/commands/workflow/test-cycle-execute.md +2 -0
  53. package/.claude/commands/workflow/test-fix-gen.md +699 -699
  54. package/.claude/commands/workflow/tools/conflict-resolution.md +104 -18
  55. package/.claude/commands/workflow/tools/context-gather.md +436 -434
  56. package/.claude/commands/workflow/tools/task-generate-agent.md +490 -291
  57. package/.claude/commands/workflow/tools/task-generate-tdd.md +18 -10
  58. package/.claude/commands/workflow/tools/test-concept-enhanced.md +2 -1
  59. package/.claude/commands/workflow/tools/test-context-gather.md +1 -0
  60. package/.claude/commands/workflow/tools/test-task-generate.md +1 -0
  61. package/.claude/commands/workflow/ui-design/import-from-code.md +9 -6
  62. package/.claude/skills/command-guide/SKILL.md +5 -5
  63. package/.claude/skills/command-guide/index/all-commands.json +1 -1
  64. package/.claude/skills/command-guide/index/by-category.json +1 -1
  65. package/.claude/skills/command-guide/index/by-use-case.json +1 -1
  66. package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +857 -778
  67. package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +266 -269
  68. package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +2 -2
  69. package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +142 -92
  70. package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +4 -4
  71. package/.claude/skills/command-guide/reference/agents/code-developer.md +7 -6
  72. package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +2 -2
  73. package/.claude/skills/command-guide/reference/agents/context-search-agent.md +31 -32
  74. package/.claude/skills/command-guide/reference/agents/doc-generator.md +4 -4
  75. package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
  76. package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +8 -7
  77. package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +7 -6
  78. package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
  79. package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
  80. package/.claude/skills/command-guide/reference/commands/memory/docs.md +17 -16
  81. package/.claude/skills/command-guide/reference/commands/memory/load.md +5 -5
  82. package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +194 -357
  83. package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
  84. package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +4 -4
  85. package/.claude/skills/command-guide/reference/commands/task/create.md +151 -151
  86. package/.claude/skills/command-guide/reference/commands/version.md +254 -254
  87. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +585 -585
  88. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +443 -443
  89. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +220 -220
  90. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +200 -200
  91. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +200 -200
  92. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +200 -200
  93. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
  94. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +387 -387
  95. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +221 -221
  96. package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +221 -221
  97. package/.claude/skills/command-guide/reference/commands/workflow/execute.md +25 -20
  98. package/.claude/skills/command-guide/reference/commands/workflow/init.md +164 -164
  99. package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +748 -686
  100. package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +664 -621
  101. package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +645 -592
  102. package/.claude/skills/command-guide/reference/commands/workflow/plan.md +5 -5
  103. package/.claude/skills/command-guide/reference/commands/workflow/review.md +25 -18
  104. package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +547 -500
  105. package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +45 -27
  106. package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +35 -19
  107. package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +90 -33
  108. package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +3 -3
  109. package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +23 -9
  110. package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +699 -699
  111. package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +103 -17
  112. package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
  113. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +487 -291
  114. package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +17 -10
  115. package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +1 -1
  116. package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +6 -6
  117. package/.claude/workflows/chinese-response.md +38 -0
  118. package/.claude/workflows/cli-templates/prompts/rules/rule-api.txt +122 -0
  119. package/.claude/workflows/cli-templates/prompts/rules/rule-components.txt +122 -0
  120. package/.claude/workflows/cli-templates/prompts/rules/rule-config.txt +89 -0
  121. package/.claude/workflows/cli-templates/prompts/rules/rule-core.txt +60 -0
  122. package/.claude/workflows/cli-templates/prompts/rules/rule-patterns.txt +70 -0
  123. package/.claude/workflows/cli-templates/prompts/rules/rule-testing.txt +81 -0
  124. package/.claude/workflows/cli-templates/prompts/rules/tech-rules-agent-prompt.txt +89 -0
  125. package/.claude/workflows/cli-templates/prompts/workflow/gemini-solution-design.txt +131 -131
  126. package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +5 -9
  127. package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +5 -9
  128. package/.claude/workflows/cli-templates/protocols/analysis-protocol.md +112 -0
  129. package/.claude/workflows/cli-templates/protocols/write-protocol.md +201 -0
  130. package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +137 -0
  131. package/.claude/workflows/cli-templates/schemas/debug-log-json-schema.json +127 -0
  132. package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +25 -0
  133. package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +25 -0
  134. package/.claude/workflows/cli-tools-usage.md +526 -0
  135. package/{CLAUDE.md → .claude/workflows/coding-philosophy.md} +24 -45
  136. package/.claude/workflows/context-tools.md +84 -0
  137. package/.claude/workflows/file-modification.md +64 -0
  138. package/.claude/workflows/tool-strategy.md +216 -79
  139. package/.claude/workflows/windows-platform.md +16 -0
  140. package/.claude/workflows/workflow-architecture.md +942 -942
  141. package/.codex/AGENTS.md +63 -330
  142. package/.codex/prompts/debug.md +318 -0
  143. package/.codex/prompts/execute.md +273 -0
  144. package/.codex/prompts/lite-execute.md +164 -0
  145. package/.codex/prompts/lite-plan.md +469 -0
  146. package/.codex/prompts.zip +0 -0
  147. package/.gemini/GEMINI.md +25 -164
  148. package/.qwen/QWEN.md +0 -139
  149. package/README.md +29 -9
  150. package/ccw/README.md +30 -6
  151. package/ccw/bin/ccw-mcp.js +7 -0
  152. package/ccw/bin/ccw.js +9 -9
  153. package/ccw/package.json +65 -47
  154. package/ccw/src/.workflow/.cli-history/history.db +0 -0
  155. package/ccw/src/.workflow/.cli-history/history.db-shm +0 -0
  156. package/ccw/src/.workflow/.cli-history/history.db-wal +0 -0
  157. package/ccw/src/cli.ts +244 -0
  158. package/ccw/src/commands/cli.ts +740 -0
  159. package/ccw/src/commands/core-memory.ts +770 -0
  160. package/ccw/src/commands/hook.ts +315 -0
  161. package/ccw/src/commands/install.ts +519 -0
  162. package/ccw/src/commands/{list.js → list.ts} +1 -1
  163. package/ccw/src/commands/memory.ts +1090 -0
  164. package/ccw/src/commands/{serve.js → serve.ts} +14 -5
  165. package/ccw/src/commands/session-path-resolver.ts +372 -0
  166. package/ccw/src/commands/session.ts +1141 -0
  167. package/ccw/src/commands/{stop.js → stop.ts} +16 -6
  168. package/ccw/src/commands/tool.ts +201 -0
  169. package/ccw/src/commands/{uninstall.js → uninstall.ts} +89 -40
  170. package/ccw/src/commands/{upgrade.js → upgrade.ts} +68 -23
  171. package/ccw/src/commands/{view.js → view.ts} +22 -8
  172. package/ccw/src/config/storage-paths.ts +670 -0
  173. package/ccw/src/core/cache-manager.ts +294 -0
  174. package/ccw/src/core/claude-freshness.ts +319 -0
  175. package/ccw/src/core/core-memory-store.ts +1528 -0
  176. package/ccw/src/core/{dashboard-generator-patch.js → dashboard-generator-patch.ts} +18 -0
  177. package/ccw/src/core/{dashboard-generator.js → dashboard-generator.ts} +69 -12
  178. package/ccw/src/core/data-aggregator.ts +584 -0
  179. package/ccw/src/core/history-importer.ts +625 -0
  180. package/ccw/src/core/{lite-scanner.js → lite-scanner-complete.ts} +162 -66
  181. package/ccw/src/core/lite-scanner.ts +469 -0
  182. package/ccw/src/core/{manifest.js → manifest.ts} +104 -34
  183. package/ccw/src/core/memory-embedder-bridge.ts +262 -0
  184. package/ccw/src/core/memory-store.ts +978 -0
  185. package/ccw/src/core/routes/ccw-routes.ts +96 -0
  186. package/ccw/src/core/routes/claude-routes.ts +1183 -0
  187. package/ccw/src/core/routes/cli-routes.ts +561 -0
  188. package/ccw/src/core/routes/codexlens-routes.ts +806 -0
  189. package/ccw/src/core/routes/core-memory-routes.ts +605 -0
  190. package/ccw/src/core/routes/files-routes.ts +428 -0
  191. package/ccw/src/core/routes/graph-routes.md +164 -0
  192. package/ccw/src/core/routes/graph-routes.ts +626 -0
  193. package/ccw/src/core/routes/help-routes.ts +308 -0
  194. package/ccw/src/core/routes/hooks-routes.ts +405 -0
  195. package/ccw/src/core/routes/mcp-routes.ts +1271 -0
  196. package/ccw/src/core/routes/mcp-routes.ts.backup +550 -0
  197. package/ccw/src/core/routes/mcp-templates-db.ts +268 -0
  198. package/ccw/src/core/routes/memory-routes.ts +1206 -0
  199. package/ccw/src/core/routes/rules-routes.ts +526 -0
  200. package/ccw/src/core/routes/session-routes.ts +467 -0
  201. package/ccw/src/core/routes/skills-routes.ts +599 -0
  202. package/ccw/src/core/routes/status-routes.ts +57 -0
  203. package/ccw/src/core/routes/system-routes.ts +427 -0
  204. package/ccw/src/core/server.ts +431 -0
  205. package/ccw/src/core/session-clustering-service.ts +1258 -0
  206. package/ccw/src/core/session-scanner.ts +283 -0
  207. package/ccw/src/core/websocket.ts +190 -0
  208. package/ccw/src/{index.js → index.ts} +1 -0
  209. package/ccw/src/mcp-server/index.ts +186 -0
  210. package/ccw/src/templates/assets/css/github-dark.min.css +10 -0
  211. package/ccw/src/templates/assets/css/github.min.css +10 -0
  212. package/ccw/src/templates/assets/js/cytoscape.min.js +32 -0
  213. package/ccw/src/templates/assets/js/d3.min.js +2 -0
  214. package/ccw/src/templates/assets/js/highlight.min.js +1244 -0
  215. package/ccw/src/templates/assets/js/lucide.min.js +12 -0
  216. package/ccw/src/templates/assets/js/marked.min.js +69 -0
  217. package/ccw/src/templates/assets/js/tailwind.js +83 -0
  218. package/ccw/src/templates/dashboard-css/01-base.css +11 -0
  219. package/ccw/src/templates/dashboard-css/02-session.css +22 -0
  220. package/ccw/src/templates/dashboard-css/04-lite-tasks.css +10 -0
  221. package/ccw/src/templates/dashboard-css/06-cards.css +10 -4
  222. package/ccw/src/templates/dashboard-css/07-managers.css +1178 -7
  223. package/ccw/src/templates/dashboard-css/09-explorer.css +23 -12
  224. package/ccw/src/templates/dashboard-css/10-cli-status.css +337 -0
  225. package/ccw/src/templates/dashboard-css/11-cli-history.css +271 -0
  226. package/ccw/src/templates/dashboard-css/12-cli-legacy.css +796 -0
  227. package/ccw/src/templates/dashboard-css/13-cli-ccw.css +199 -0
  228. package/ccw/src/templates/dashboard-css/14-cli-modals.css +258 -0
  229. package/ccw/src/templates/dashboard-css/15-cli-endpoints.css +305 -0
  230. package/ccw/src/templates/dashboard-css/16-cli-session.css +241 -0
  231. package/ccw/src/templates/dashboard-css/17-cli-conversation.css +283 -0
  232. package/ccw/src/templates/dashboard-css/18-cli-settings.css +160 -0
  233. package/ccw/src/templates/dashboard-css/19-cli-native-session.css +496 -0
  234. package/ccw/src/templates/dashboard-css/20-cli-taskqueue.css +188 -0
  235. package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +310 -0
  236. package/ccw/src/templates/dashboard-css/22-cli-semantic.css +240 -0
  237. package/ccw/src/templates/dashboard-css/23-memory.css +2390 -0
  238. package/ccw/src/templates/dashboard-css/24-prompt-history.css +1089 -0
  239. package/ccw/src/templates/dashboard-css/25-skills-rules.css +326 -0
  240. package/ccw/src/templates/dashboard-css/26-claude-manager.css +908 -0
  241. package/ccw/src/templates/dashboard-css/27-graph-explorer.css +1678 -0
  242. package/ccw/src/templates/dashboard-css/28-mcp-manager.css +748 -0
  243. package/ccw/src/templates/dashboard-css/29-help.css +264 -0
  244. package/ccw/src/templates/dashboard-css/30-core-memory.css +1700 -0
  245. package/ccw/src/templates/dashboard-js/api.js +162 -142
  246. package/ccw/src/templates/dashboard-js/components/carousel.js +4 -4
  247. package/ccw/src/templates/dashboard-js/components/cli-history.js +876 -0
  248. package/ccw/src/templates/dashboard-js/components/cli-status.js +978 -0
  249. package/ccw/src/templates/dashboard-js/components/global-notifications.js +508 -219
  250. package/ccw/src/templates/dashboard-js/components/hook-manager.js +1277 -282
  251. package/ccw/src/templates/dashboard-js/components/index-manager.js +302 -0
  252. package/ccw/src/templates/dashboard-js/components/mcp-manager.js +718 -27
  253. package/ccw/src/templates/dashboard-js/components/modals.js +66 -0
  254. package/ccw/src/templates/dashboard-js/components/navigation.js +80 -12
  255. package/ccw/src/templates/dashboard-js/components/notifications.js +758 -194
  256. package/ccw/src/templates/dashboard-js/components/storage-manager.js +478 -0
  257. package/ccw/src/templates/dashboard-js/components/tabs-other.js +157 -6
  258. package/ccw/src/templates/dashboard-js/components/task-queue-sidebar.js +716 -0
  259. package/ccw/src/templates/dashboard-js/help-i18n.js +272 -0
  260. package/ccw/src/templates/dashboard-js/i18n.js +2807 -0
  261. package/ccw/src/templates/dashboard-js/main.js +15 -0
  262. package/ccw/src/templates/dashboard-js/state.js +243 -42
  263. package/ccw/src/templates/dashboard-js/utils.js +47 -1
  264. package/ccw/src/templates/dashboard-js/views/claude-manager.js +912 -0
  265. package/ccw/src/templates/dashboard-js/views/cli-manager.js +2272 -0
  266. package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +964 -0
  267. package/ccw/src/templates/dashboard-js/views/core-memory-clusters.js +503 -0
  268. package/ccw/src/templates/dashboard-js/views/core-memory.js +782 -0
  269. package/ccw/src/templates/dashboard-js/views/explorer.js +888 -852
  270. package/ccw/src/templates/dashboard-js/views/graph-explorer.js +1157 -0
  271. package/ccw/src/templates/dashboard-js/views/help.js +856 -0
  272. package/ccw/src/templates/dashboard-js/views/history.js +337 -0
  273. package/ccw/src/templates/dashboard-js/views/home.js +61 -15
  274. package/ccw/src/templates/dashboard-js/views/hook-manager.js +311 -43
  275. package/ccw/src/templates/dashboard-js/views/lite-tasks.js +204 -28
  276. package/ccw/src/templates/dashboard-js/views/mcp-manager.js +2187 -411
  277. package/ccw/src/templates/dashboard-js/views/mcp-manager.js.backup +1729 -0
  278. package/ccw/src/templates/dashboard-js/views/mcp-manager.js.new +928 -0
  279. package/ccw/src/templates/dashboard-js/views/memory.js +1221 -0
  280. package/ccw/src/templates/dashboard-js/views/prompt-history.js +713 -0
  281. package/ccw/src/templates/dashboard-js/views/rules-manager.js +828 -0
  282. package/ccw/src/templates/dashboard-js/views/session-detail.js +54 -53
  283. package/ccw/src/templates/dashboard-js/views/skills-manager.js +819 -0
  284. package/ccw/src/templates/dashboard.html +185 -85
  285. package/ccw/src/templates/hooks-config-example.json +60 -0
  286. package/ccw/src/tools/classify-folders.ts +245 -0
  287. package/ccw/src/tools/cli-config-manager.ts +268 -0
  288. package/ccw/src/tools/cli-executor.ts +2014 -0
  289. package/ccw/src/tools/cli-history-store.ts +1195 -0
  290. package/ccw/src/tools/codex-lens.ts +1141 -0
  291. package/ccw/src/tools/{convert-tokens-to-css.js → convert-tokens-to-css.ts} +73 -23
  292. package/ccw/src/tools/core-memory.ts +444 -0
  293. package/ccw/src/tools/detect-changed-modules.ts +325 -0
  294. package/ccw/src/tools/{discover-design-files.js → discover-design-files.ts} +74 -24
  295. package/ccw/src/tools/edit-file.ts +568 -0
  296. package/ccw/src/tools/{generate-module-docs.js → generate-module-docs.ts} +207 -185
  297. package/ccw/src/tools/{get-modules-by-depth.js → get-modules-by-depth.ts} +120 -79
  298. package/ccw/src/tools/index.ts +370 -0
  299. package/ccw/src/tools/native-session-discovery.ts +795 -0
  300. package/ccw/src/tools/notifier.ts +129 -0
  301. package/ccw/src/tools/read-file.ts +410 -0
  302. package/ccw/src/tools/resume-strategy.ts +345 -0
  303. package/ccw/src/tools/session-content-parser.ts +619 -0
  304. package/ccw/src/tools/session-manager.ts +1026 -0
  305. package/ccw/src/tools/smart-context.ts +228 -0
  306. package/ccw/src/tools/smart-search.ts +2065 -0
  307. package/ccw/src/tools/smart-search.ts.backup +1233 -0
  308. package/ccw/src/tools/storage-manager.ts +455 -0
  309. package/ccw/src/tools/write-file.ts +222 -0
  310. package/ccw/src/types/config.ts +11 -0
  311. package/ccw/src/types/index.ts +3 -0
  312. package/ccw/src/types/session.ts +25 -0
  313. package/ccw/src/types/tool.ts +41 -0
  314. package/ccw/src/utils/{browser-launcher.js → browser-launcher.ts} +10 -8
  315. package/ccw/src/utils/file-utils.ts +48 -0
  316. package/ccw/src/utils/{path-resolver.js → path-resolver.ts} +114 -78
  317. package/ccw/src/utils/path-validator.ts +153 -0
  318. package/ccw/src/utils/{ui.js → ui.ts} +32 -25
  319. package/codex-lens/pyproject.toml +48 -0
  320. package/codex-lens/src/codexlens/.workflow/.cli-history/history.db +0 -0
  321. package/codex-lens/src/codexlens/__init__.py +28 -0
  322. package/codex-lens/src/codexlens/__main__.py +14 -0
  323. package/codex-lens/src/codexlens/__pycache__/__init__.cpython-313.pyc +0 -0
  324. package/codex-lens/src/codexlens/__pycache__/__main__.cpython-313.pyc +0 -0
  325. package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
  326. package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
  327. package/codex-lens/src/codexlens/__pycache__/errors.cpython-313.pyc +0 -0
  328. package/codex-lens/src/codexlens/cli/__init__.py +27 -0
  329. package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-313.pyc +0 -0
  330. package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
  331. package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
  332. package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
  333. package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-313.pyc +0 -0
  334. package/codex-lens/src/codexlens/cli/commands.py +1931 -0
  335. package/codex-lens/src/codexlens/cli/embedding_manager.py +620 -0
  336. package/codex-lens/src/codexlens/cli/model_manager.py +289 -0
  337. package/codex-lens/src/codexlens/cli/output.py +124 -0
  338. package/codex-lens/src/codexlens/config.py +201 -0
  339. package/codex-lens/src/codexlens/entities.py +121 -0
  340. package/codex-lens/src/codexlens/errors.py +55 -0
  341. package/codex-lens/src/codexlens/indexing/README.md +77 -0
  342. package/codex-lens/src/codexlens/indexing/__init__.py +4 -0
  343. package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
  344. package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
  345. package/codex-lens/src/codexlens/indexing/symbol_extractor.py +243 -0
  346. package/codex-lens/src/codexlens/parsers/__init__.py +8 -0
  347. package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
  348. package/codex-lens/src/codexlens/parsers/__pycache__/encoding.cpython-313.pyc +0 -0
  349. package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
  350. package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-313.pyc +0 -0
  351. package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
  352. package/codex-lens/src/codexlens/parsers/encoding.py +202 -0
  353. package/codex-lens/src/codexlens/parsers/factory.py +256 -0
  354. package/codex-lens/src/codexlens/parsers/tokenizer.py +98 -0
  355. package/codex-lens/src/codexlens/parsers/treesitter_parser.py +335 -0
  356. package/codex-lens/src/codexlens/search/__init__.py +15 -0
  357. package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-313.pyc +0 -0
  358. package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
  359. package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
  360. package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
  361. package/codex-lens/src/codexlens/search/__pycache__/query_parser.cpython-313.pyc +0 -0
  362. package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
  363. package/codex-lens/src/codexlens/search/chain_search.py +647 -0
  364. package/codex-lens/src/codexlens/search/enrichment.py +150 -0
  365. package/codex-lens/src/codexlens/search/hybrid_search.py +313 -0
  366. package/codex-lens/src/codexlens/search/query_parser.py +242 -0
  367. package/codex-lens/src/codexlens/search/ranking.py +274 -0
  368. package/codex-lens/src/codexlens/semantic/__init__.py +39 -0
  369. package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-313.pyc +0 -0
  370. package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
  371. package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
  372. package/codex-lens/src/codexlens/semantic/__pycache__/code_extractor.cpython-313.pyc +0 -0
  373. package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-313.pyc +0 -0
  374. package/codex-lens/src/codexlens/semantic/__pycache__/graph_analyzer.cpython-313.pyc +0 -0
  375. package/codex-lens/src/codexlens/semantic/__pycache__/llm_enhancer.cpython-313.pyc +0 -0
  376. package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
  377. package/codex-lens/src/codexlens/semantic/ann_index.py +414 -0
  378. package/codex-lens/src/codexlens/semantic/chunker.py +448 -0
  379. package/codex-lens/src/codexlens/semantic/code_extractor.py +274 -0
  380. package/codex-lens/src/codexlens/semantic/embedder.py +185 -0
  381. package/codex-lens/src/codexlens/semantic/vector_store.py +955 -0
  382. package/codex-lens/src/codexlens/storage/__init__.py +29 -0
  383. package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
  384. package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
  385. package/codex-lens/src/codexlens/storage/__pycache__/file_cache.cpython-313.pyc +0 -0
  386. package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
  387. package/codex-lens/src/codexlens/storage/__pycache__/migration_manager.cpython-313.pyc +0 -0
  388. package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-313.pyc +0 -0
  389. package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-313.pyc +0 -0
  390. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
  391. package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-313.pyc +0 -0
  392. package/codex-lens/src/codexlens/storage/dir_index.py +1850 -0
  393. package/codex-lens/src/codexlens/storage/file_cache.py +32 -0
  394. package/codex-lens/src/codexlens/storage/index_tree.py +776 -0
  395. package/codex-lens/src/codexlens/storage/migration_manager.py +154 -0
  396. package/codex-lens/src/codexlens/storage/migrations/__init__.py +1 -0
  397. package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
  398. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_001_normalize_keywords.cpython-313.pyc +0 -0
  399. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_002_add_token_metadata.cpython-313.pyc +0 -0
  400. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_003_code_relationships.cpython-313.pyc +0 -0
  401. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_004_dual_fts.cpython-313.pyc +0 -0
  402. package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_005_cleanup_unused_fields.cpython-313.pyc +0 -0
  403. package/codex-lens/src/codexlens/storage/migrations/migration_001_normalize_keywords.py +123 -0
  404. package/codex-lens/src/codexlens/storage/migrations/migration_002_add_token_metadata.py +48 -0
  405. package/codex-lens/src/codexlens/storage/migrations/migration_004_dual_fts.py +232 -0
  406. package/codex-lens/src/codexlens/storage/migrations/migration_005_cleanup_unused_fields.py +196 -0
  407. package/codex-lens/src/codexlens/storage/path_mapper.py +274 -0
  408. package/codex-lens/src/codexlens/storage/registry.py +670 -0
  409. package/codex-lens/src/codexlens/storage/sqlite_store.py +576 -0
  410. package/codex-lens/src/codexlens/storage/sqlite_utils.py +64 -0
  411. package/package.json +4 -1
  412. package/.claude/commands/memory/tech-research.md +0 -477
  413. package/.claude/scripts/classify-folders.sh +0 -39
  414. package/.claude/scripts/convert_tokens_to_css.sh +0 -229
  415. package/.claude/scripts/detect_changed_modules.sh +0 -161
  416. package/.claude/scripts/discover-design-files.sh +0 -87
  417. package/.claude/scripts/extract-animations.js +0 -243
  418. package/.claude/scripts/extract-computed-styles.js +0 -118
  419. package/.claude/scripts/extract-layout-structure.js +0 -411
  420. package/.claude/scripts/generate_module_docs.sh +0 -717
  421. package/.claude/scripts/get_modules_by_depth.sh +0 -170
  422. package/.claude/scripts/ui-generate-preview.sh +0 -395
  423. package/.claude/scripts/ui-instantiate-prototypes.sh +0 -815
  424. package/.claude/scripts/update_module_claude.sh +0 -337
  425. package/.claude/workflows/context-search-strategy.md +0 -77
  426. package/.claude/workflows/intelligent-tools-strategy.md +0 -662
  427. package/ccw/src/cli.js +0 -119
  428. package/ccw/src/commands/install.js +0 -324
  429. package/ccw/src/commands/tool.js +0 -138
  430. package/ccw/src/core/data-aggregator.js +0 -409
  431. package/ccw/src/core/server.js +0 -2063
  432. package/ccw/src/core/session-scanner.js +0 -235
  433. package/ccw/src/tools/classify-folders.js +0 -204
  434. package/ccw/src/tools/detect-changed-modules.js +0 -288
  435. package/ccw/src/tools/edit-file.js +0 -266
  436. package/ccw/src/tools/index.js +0 -176
  437. package/ccw/src/utils/file-utils.js +0 -48
@@ -0,0 +1,770 @@
1
+ /**
2
+ * Core Memory Command - Simplified CLI for core memory management
3
+ * Commands: list, import, export, summary, projects, cluster
4
+ */
5
+
6
+ import chalk from 'chalk';
7
+ import {
8
+ getCoreMemoryStore,
9
+ listAllProjects,
10
+ getMemoriesFromProject,
11
+ exportMemories,
12
+ importMemories
13
+ } from '../core/core-memory-store.js';
14
+ import { notifyRefreshRequired } from '../tools/notifier.js';
15
+
16
+ interface CommandOptions {
17
+ id?: string;
18
+ tool?: 'gemini' | 'qwen';
19
+ status?: string;
20
+ json?: boolean;
21
+ auto?: boolean;
22
+ output?: string;
23
+ from?: string;
24
+ overwrite?: boolean;
25
+ prefix?: string;
26
+ all?: boolean;
27
+ scope?: string;
28
+ create?: boolean;
29
+ name?: string;
30
+ members?: string;
31
+ format?: string;
32
+ level?: string;
33
+ type?: string;
34
+ delete?: boolean;
35
+ merge?: string;
36
+ dedup?: boolean;
37
+ }
38
+
39
+ /**
40
+ * Get project path from current working directory
41
+ */
42
+ function getProjectPath(): string {
43
+ return process.cwd();
44
+ }
45
+
46
+ /**
47
+ * List all memories
48
+ */
49
+ async function listAction(): Promise<void> {
50
+ try {
51
+ const store = getCoreMemoryStore(getProjectPath());
52
+ const memories = store.getMemories({ limit: 100 });
53
+
54
+ console.log(chalk.bold.cyan('\n Core Memories\n'));
55
+
56
+ if (memories.length === 0) {
57
+ console.log(chalk.yellow(' No memories found\n'));
58
+ return;
59
+ }
60
+
61
+ console.log(chalk.gray(' ─────────────────────────────────────────────────────────────────'));
62
+
63
+ for (const memory of memories) {
64
+ const date = new Date(memory.updated_at).toLocaleString();
65
+ const archived = memory.archived ? chalk.gray(' [archived]') : '';
66
+ console.log(chalk.cyan(` ${memory.id}`) + archived);
67
+ console.log(chalk.white(` ${memory.summary || memory.content.substring(0, 80)}${memory.content.length > 80 ? '...' : ''}`));
68
+ console.log(chalk.gray(` Updated: ${date}`));
69
+ console.log(chalk.gray(' ─────────────────────────────────────────────────────────────────'));
70
+ }
71
+
72
+ console.log(chalk.gray(`\n Total: ${memories.length}\n`));
73
+
74
+ } catch (error) {
75
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
76
+ process.exit(1);
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Import text as a new memory
82
+ */
83
+ async function importAction(text: string): Promise<void> {
84
+ if (!text || text.trim() === '') {
85
+ console.error(chalk.red('Error: Text content is required'));
86
+ console.error(chalk.gray('Usage: ccw core-memory import "your text content here"'));
87
+ process.exit(1);
88
+ }
89
+
90
+ try {
91
+ const store = getCoreMemoryStore(getProjectPath());
92
+ const memory = store.upsertMemory({
93
+ content: text.trim()
94
+ });
95
+
96
+ console.log(chalk.green(`✓ Created memory: ${memory.id}`));
97
+
98
+ // Notify dashboard
99
+ notifyRefreshRequired('memory').catch(() => { /* ignore */ });
100
+
101
+ } catch (error) {
102
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
103
+ process.exit(1);
104
+ }
105
+ }
106
+
107
+ /**
108
+ * Export a memory as plain text (searches all projects if not found locally)
109
+ */
110
+ async function exportAction(options: CommandOptions): Promise<void> {
111
+ const { id } = options;
112
+
113
+ if (!id) {
114
+ console.error(chalk.red('Error: --id is required'));
115
+ console.error(chalk.gray('Usage: ccw core-memory export --id <id>'));
116
+ process.exit(1);
117
+ }
118
+
119
+ try {
120
+ // First try current project
121
+ const store = getCoreMemoryStore(getProjectPath());
122
+ let memory = store.getMemory(id);
123
+
124
+ // If not found, search all projects
125
+ if (!memory) {
126
+ const projects = listAllProjects();
127
+ for (const project of projects) {
128
+ try {
129
+ const memories = getMemoriesFromProject(project.id);
130
+ const found = memories.find(m => m.id === id);
131
+ if (found) {
132
+ memory = found;
133
+ console.error(chalk.gray(`Found in project: ${project.id}`));
134
+ break;
135
+ }
136
+ } catch {
137
+ // Skip projects that can't be read
138
+ }
139
+ }
140
+ }
141
+
142
+ if (!memory) {
143
+ console.error(chalk.red(`Error: Memory "${id}" not found in any project`));
144
+ process.exit(1);
145
+ }
146
+
147
+ // Output plain text content
148
+ console.log(memory.content);
149
+
150
+ } catch (error) {
151
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
152
+ process.exit(1);
153
+ }
154
+ }
155
+
156
+ /**
157
+ * List all projects with their memory counts
158
+ */
159
+ async function projectsAction(options: CommandOptions): Promise<void> {
160
+ try {
161
+ const projects = listAllProjects();
162
+
163
+ if (options.json) {
164
+ console.log(JSON.stringify(projects, null, 2));
165
+ return;
166
+ }
167
+
168
+ console.log(chalk.bold.cyan('\n All CCW Projects\n'));
169
+
170
+ if (projects.length === 0) {
171
+ console.log(chalk.yellow(' No projects found\n'));
172
+ return;
173
+ }
174
+
175
+ console.log(chalk.gray(' ─────────────────────────────────────────────────────────────────'));
176
+
177
+ for (const project of projects) {
178
+ const hasData = project.memoriesCount > 0 || project.clustersCount > 0;
179
+ const icon = hasData ? '●' : '○';
180
+ const color = hasData ? chalk.cyan : chalk.gray;
181
+
182
+ console.log(color(` ${icon} ${project.id}`));
183
+ console.log(chalk.white(` Path: ${project.path}`));
184
+ console.log(chalk.white(` Memories: ${project.memoriesCount} | Clusters: ${project.clustersCount}`));
185
+ if (project.lastUpdated) {
186
+ console.log(chalk.gray(` Last updated: ${new Date(project.lastUpdated).toLocaleString()}`));
187
+ }
188
+ console.log(chalk.gray(' ─────────────────────────────────────────────────────────────────'));
189
+ }
190
+
191
+ console.log(chalk.gray(`\n Total: ${projects.length} projects\n`));
192
+
193
+ } catch (error) {
194
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
195
+ process.exit(1);
196
+ }
197
+ }
198
+
199
+ /**
200
+ * Import memories from file or another project
201
+ */
202
+ async function importFromAction(source: string, options: CommandOptions): Promise<void> {
203
+ if (!source) {
204
+ console.error(chalk.red('Error: Source is required'));
205
+ console.error(chalk.gray('Usage: ccw core-memory import-from <source>'));
206
+ console.error(chalk.gray(' source: file.json or project-id'));
207
+ process.exit(1);
208
+ }
209
+
210
+ try {
211
+ const result = importMemories(getProjectPath(), source, {
212
+ overwrite: options.overwrite,
213
+ prefix: options.prefix
214
+ });
215
+
216
+ console.log(chalk.green(`✓ Import complete`));
217
+ console.log(chalk.white(` Imported: ${result.imported}`));
218
+ console.log(chalk.white(` Skipped: ${result.skipped} (already exist)`));
219
+
220
+ if (result.imported > 0) {
221
+ notifyRefreshRequired('memory').catch(() => { /* ignore */ });
222
+ }
223
+
224
+ } catch (error) {
225
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
226
+ process.exit(1);
227
+ }
228
+ }
229
+
230
+ /**
231
+ * List memories from another project
232
+ */
233
+ async function listFromAction(projectId: string, options: CommandOptions): Promise<void> {
234
+ if (!projectId) {
235
+ console.error(chalk.red('Error: Project ID is required'));
236
+ console.error(chalk.gray('Usage: ccw core-memory list-from <project-id>'));
237
+ console.error(chalk.gray(' Use "ccw core-memory projects" to see available projects'));
238
+ process.exit(1);
239
+ }
240
+
241
+ try {
242
+ const memories = getMemoriesFromProject(projectId);
243
+
244
+ if (options.json) {
245
+ console.log(JSON.stringify(memories, null, 2));
246
+ return;
247
+ }
248
+
249
+ console.log(chalk.bold.cyan(`\n Memories from ${projectId}\n`));
250
+
251
+ if (memories.length === 0) {
252
+ console.log(chalk.yellow(' No memories found\n'));
253
+ return;
254
+ }
255
+
256
+ console.log(chalk.gray(' ─────────────────────────────────────────────────────────────────'));
257
+
258
+ for (const memory of memories) {
259
+ const date = new Date(memory.updated_at).toLocaleString();
260
+ const archived = memory.archived ? chalk.gray(' [archived]') : '';
261
+ console.log(chalk.cyan(` ${memory.id}`) + archived);
262
+ console.log(chalk.white(` ${memory.summary || memory.content.substring(0, 80)}${memory.content.length > 80 ? '...' : ''}`));
263
+ console.log(chalk.gray(` Updated: ${date}`));
264
+ console.log(chalk.gray(' ─────────────────────────────────────────────────────────────────'));
265
+ }
266
+
267
+ console.log(chalk.gray(`\n Total: ${memories.length}\n`));
268
+
269
+ } catch (error) {
270
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
271
+ process.exit(1);
272
+ }
273
+ }
274
+
275
+ /**
276
+ * Generate summary for a memory
277
+ */
278
+ async function summaryAction(options: CommandOptions): Promise<void> {
279
+ const { id, tool = 'gemini' } = options;
280
+
281
+ if (!id) {
282
+ console.error(chalk.red('Error: --id is required'));
283
+ console.error(chalk.gray('Usage: ccw core-memory summary --id <id> [--tool gemini|qwen]'));
284
+ process.exit(1);
285
+ }
286
+
287
+ try {
288
+ const store = getCoreMemoryStore(getProjectPath());
289
+ const memory = store.getMemory(id);
290
+
291
+ if (!memory) {
292
+ console.error(chalk.red(`Error: Memory "${id}" not found`));
293
+ process.exit(1);
294
+ }
295
+
296
+ console.log(chalk.cyan(`Generating summary using ${tool}...`));
297
+
298
+ const summary = await store.generateSummary(id, tool);
299
+
300
+ console.log(chalk.green('\n✓ Summary generated:\n'));
301
+ console.log(chalk.white(` ${summary}\n`));
302
+
303
+ // Notify dashboard
304
+ notifyRefreshRequired('memory').catch(() => { /* ignore */ });
305
+
306
+ } catch (error) {
307
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
308
+ process.exit(1);
309
+ }
310
+ }
311
+
312
+ /**
313
+ * List all clusters
314
+ */
315
+ async function clustersAction(options: CommandOptions): Promise<void> {
316
+ try {
317
+ const store = getCoreMemoryStore(getProjectPath());
318
+ const clusters = store.listClusters(options.status);
319
+
320
+ if (options.json) {
321
+ console.log(JSON.stringify(clusters, null, 2));
322
+ return;
323
+ }
324
+
325
+ if (clusters.length === 0) {
326
+ console.log(chalk.yellow('\n No clusters found. Run "ccw core-memory cluster --auto" to create clusters.\n'));
327
+ return;
328
+ }
329
+
330
+ console.log(chalk.bold.cyan('\n 📦 Session Clusters\n'));
331
+ console.log(chalk.gray(' ─────────────────────────────────────────────────────────────────'));
332
+
333
+ for (const cluster of clusters) {
334
+ const members = store.getClusterMembers(cluster.id);
335
+ console.log(chalk.cyan(` ● ${cluster.name}`) + chalk.gray(` (${cluster.id})`));
336
+ console.log(chalk.white(` Status: ${cluster.status} | Sessions: ${members.length}`));
337
+ console.log(chalk.gray(` Updated: ${cluster.updated_at}`));
338
+ if (cluster.intent) console.log(chalk.white(` Intent: ${cluster.intent}`));
339
+ console.log(chalk.gray(' ─────────────────────────────────────────────────────────────────'));
340
+ }
341
+
342
+ console.log(chalk.gray(`\n Total: ${clusters.length}\n`));
343
+
344
+ } catch (error) {
345
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
346
+ process.exit(1);
347
+ }
348
+ }
349
+
350
+ /**
351
+ * View cluster details or create new cluster
352
+ */
353
+ async function clusterAction(clusterId: string | undefined, options: CommandOptions): Promise<void> {
354
+ try {
355
+ const store = getCoreMemoryStore(getProjectPath());
356
+
357
+ // Auto clustering
358
+ if (options.auto) {
359
+ const { SessionClusteringService } = await import('../core/session-clustering-service.js');
360
+ const service = new SessionClusteringService(getProjectPath());
361
+
362
+ console.log(chalk.cyan('🔄 Running auto-clustering...'));
363
+ const scope: 'all' | 'recent' | 'unclustered' =
364
+ options.scope === 'all' || options.scope === 'recent' || options.scope === 'unclustered'
365
+ ? options.scope
366
+ : 'recent';
367
+ const result = await service.autocluster({ scope });
368
+
369
+ console.log(chalk.green(`✓ Created ${result.clustersCreated} clusters`));
370
+ console.log(chalk.white(` Processed ${result.sessionsProcessed} sessions`));
371
+ console.log(chalk.white(` Clustered ${result.sessionsClustered} sessions`));
372
+
373
+ // Notify dashboard
374
+ notifyRefreshRequired('memory').catch(() => { /* ignore */ });
375
+ return;
376
+ }
377
+
378
+ // Deduplicate clusters
379
+ if (options.dedup) {
380
+ const { SessionClusteringService } = await import('../core/session-clustering-service.js');
381
+ const service = new SessionClusteringService(getProjectPath());
382
+
383
+ console.log(chalk.cyan('🔄 Deduplicating clusters...'));
384
+ const result = await service.deduplicateClusters();
385
+
386
+ console.log(chalk.green(`✓ Deduplication complete`));
387
+ console.log(chalk.white(` Merged: ${result.merged} clusters`));
388
+ console.log(chalk.white(` Deleted: ${result.deleted} empty clusters`));
389
+ console.log(chalk.white(` Remaining: ${result.remaining} clusters`));
390
+
391
+ // Notify dashboard
392
+ notifyRefreshRequired('memory').catch(() => { /* ignore */ });
393
+ return;
394
+ }
395
+
396
+ // Delete cluster
397
+ if (options.delete && clusterId) {
398
+ const cluster = store.getCluster(clusterId);
399
+ if (!cluster) {
400
+ console.error(chalk.red(`Cluster not found: ${clusterId}`));
401
+ process.exit(1);
402
+ }
403
+
404
+ const deleted = store.deleteCluster(clusterId);
405
+ if (deleted) {
406
+ console.log(chalk.green(`✓ Deleted cluster: ${clusterId}`));
407
+ notifyRefreshRequired('memory').catch(() => { /* ignore */ });
408
+ } else {
409
+ console.error(chalk.red(`Failed to delete cluster: ${clusterId}`));
410
+ process.exit(1);
411
+ }
412
+ return;
413
+ }
414
+
415
+ // Merge clusters
416
+ if (options.merge && clusterId) {
417
+ const targetCluster = store.getCluster(clusterId);
418
+ if (!targetCluster) {
419
+ console.error(chalk.red(`Target cluster not found: ${clusterId}`));
420
+ process.exit(1);
421
+ }
422
+
423
+ const sourceIds = options.merge.split(',').map(s => s.trim());
424
+ console.log(chalk.cyan(`🔄 Merging ${sourceIds.length} clusters into ${clusterId}...`));
425
+
426
+ try {
427
+ const membersMoved = store.mergeClusters(clusterId, sourceIds);
428
+ console.log(chalk.green(`✓ Merged successfully`));
429
+ console.log(chalk.white(` Members moved: ${membersMoved}`));
430
+ console.log(chalk.white(` Clusters deleted: ${sourceIds.length}`));
431
+ notifyRefreshRequired('memory').catch(() => { /* ignore */ });
432
+ } catch (error) {
433
+ console.error(chalk.red(`Failed to merge: ${(error as Error).message}`));
434
+ process.exit(1);
435
+ }
436
+ return;
437
+ }
438
+
439
+ // Create new cluster
440
+ if (options.create) {
441
+ if (!options.name) {
442
+ console.error(chalk.red('Error: --name is required for --create'));
443
+ process.exit(1);
444
+ }
445
+
446
+ const cluster = store.createCluster({ name: options.name });
447
+ console.log(chalk.green(`✓ Created cluster: ${cluster.id}`));
448
+
449
+ // Add members if specified
450
+ if (options.members) {
451
+ const memberIds = options.members.split(',').map(s => s.trim());
452
+ for (const memberId of memberIds) {
453
+ // Detect session type from ID
454
+ let sessionType = 'core_memory';
455
+ if (memberId.startsWith('WFS-')) sessionType = 'workflow';
456
+ else if (memberId.includes('-gemini') || memberId.includes('-qwen') || memberId.includes('-codex')) {
457
+ sessionType = 'cli_history';
458
+ }
459
+
460
+ store.addClusterMember({
461
+ cluster_id: cluster.id,
462
+ session_id: memberId,
463
+ session_type: sessionType as any,
464
+ sequence_order: memberIds.indexOf(memberId) + 1,
465
+ relevance_score: 1.0
466
+ });
467
+ }
468
+ console.log(chalk.white(` Added ${memberIds.length} members`));
469
+ }
470
+
471
+ // Notify dashboard
472
+ notifyRefreshRequired('memory').catch(() => { /* ignore */ });
473
+ return;
474
+ }
475
+
476
+ // View cluster details
477
+ if (clusterId) {
478
+ const cluster = store.getCluster(clusterId);
479
+ if (!cluster) {
480
+ console.error(chalk.red(`Cluster not found: ${clusterId}`));
481
+ process.exit(1);
482
+ }
483
+
484
+ const members = store.getClusterMembers(clusterId);
485
+ const relations = store.getClusterRelations(clusterId);
486
+
487
+ console.log(chalk.bold.cyan(`\n 📦 Cluster: ${cluster.name}\n`));
488
+ console.log(chalk.white(` ID: ${cluster.id}`));
489
+ console.log(chalk.white(` Status: ${cluster.status}`));
490
+ if (cluster.description) console.log(chalk.white(` Description: ${cluster.description}`));
491
+ if (cluster.intent) console.log(chalk.white(` Intent: ${cluster.intent}`));
492
+
493
+ if (members.length > 0) {
494
+ console.log(chalk.bold.white('\n 📋 Sessions:'));
495
+ for (const member of members) {
496
+ const meta = store.getSessionMetadata(member.session_id);
497
+ console.log(chalk.cyan(` ${member.sequence_order}. ${member.session_id}`) + chalk.gray(` (${member.session_type})`));
498
+ if (meta?.title) console.log(chalk.white(` ${meta.title}`));
499
+ if (meta?.token_estimate) console.log(chalk.gray(` ~${meta.token_estimate} tokens`));
500
+ }
501
+ }
502
+
503
+ if (relations.length > 0) {
504
+ console.log(chalk.bold.white('\n 🔗 Relations:'));
505
+ for (const rel of relations) {
506
+ console.log(chalk.white(` → ${rel.relation_type} ${rel.target_cluster_id}`));
507
+ }
508
+ }
509
+
510
+ console.log();
511
+ return;
512
+ }
513
+
514
+ // No action specified - show usage
515
+ console.log(chalk.yellow('Usage: ccw core-memory cluster <id> or --auto or --create --name <name>'));
516
+
517
+ } catch (error) {
518
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
519
+ process.exit(1);
520
+ }
521
+ }
522
+
523
+ /**
524
+ * Get progressive disclosure context
525
+ */
526
+ async function contextAction(options: CommandOptions): Promise<void> {
527
+ try {
528
+ const { SessionClusteringService } = await import('../core/session-clustering-service.js');
529
+ const service = new SessionClusteringService(getProjectPath());
530
+
531
+ // Default to session-start for CLI usage
532
+ const index = await service.getProgressiveIndex({
533
+ type: 'session-start'
534
+ });
535
+
536
+ if (options.format === 'json') {
537
+ console.log(JSON.stringify({ index }, null, 2));
538
+ } else {
539
+ console.log(index);
540
+ }
541
+
542
+ } catch (error) {
543
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
544
+ process.exit(1);
545
+ }
546
+ }
547
+
548
+ /**
549
+ * Load cluster context
550
+ */
551
+ async function loadClusterAction(clusterId: string, options: CommandOptions): Promise<void> {
552
+ if (!clusterId) {
553
+ console.error(chalk.red('Error: Cluster ID is required'));
554
+ console.error(chalk.gray('Usage: ccw core-memory load-cluster <id> [--level metadata|keyFiles|full]'));
555
+ process.exit(1);
556
+ }
557
+
558
+ try {
559
+ const store = getCoreMemoryStore(getProjectPath());
560
+
561
+ const cluster = store.getCluster(clusterId);
562
+ if (!cluster) {
563
+ console.error(chalk.red(`Cluster not found: ${clusterId}`));
564
+ process.exit(1);
565
+ }
566
+
567
+ const members = store.getClusterMembers(clusterId);
568
+ const level = options.level || 'metadata';
569
+
570
+ console.log(chalk.bold.cyan(`\n# Cluster: ${cluster.name}\n`));
571
+ if (cluster.intent) console.log(chalk.white(`Intent: ${cluster.intent}\n`));
572
+
573
+ console.log(chalk.bold.white('## Sessions\n'));
574
+
575
+ for (const member of members) {
576
+ const meta = store.getSessionMetadata(member.session_id);
577
+
578
+ console.log(chalk.bold.cyan(`### ${member.sequence_order}. ${member.session_id}`));
579
+ console.log(chalk.white(`Type: ${member.session_type}`));
580
+
581
+ if (meta) {
582
+ if (meta.title) console.log(chalk.white(`Title: ${meta.title}`));
583
+
584
+ if (level === 'metadata') {
585
+ if (meta.summary) console.log(chalk.white(`Summary: ${meta.summary}`));
586
+ } else if (level === 'keyFiles' || level === 'full') {
587
+ if (meta.summary) console.log(chalk.white(`Summary: ${meta.summary}`));
588
+ if (meta.file_patterns) {
589
+ const patterns = JSON.parse(meta.file_patterns as any);
590
+ console.log(chalk.white(`Files: ${patterns.join(', ')}`));
591
+ }
592
+ if (meta.keywords) {
593
+ const keywords = JSON.parse(meta.keywords as any);
594
+ console.log(chalk.white(`Keywords: ${keywords.join(', ')}`));
595
+ }
596
+ }
597
+
598
+ if (level === 'full') {
599
+ // Load full content based on session type
600
+ if (member.session_type === 'core_memory') {
601
+ const memory = store.getMemory(member.session_id);
602
+ if (memory) {
603
+ console.log(chalk.white('\nContent:'));
604
+ console.log(chalk.gray(memory.content));
605
+ }
606
+ }
607
+ }
608
+ }
609
+ console.log();
610
+ }
611
+
612
+ } catch (error) {
613
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
614
+ process.exit(1);
615
+ }
616
+ }
617
+
618
+ /**
619
+ * Search sessions by keyword
620
+ */
621
+ async function searchAction(keyword: string, options: CommandOptions): Promise<void> {
622
+ if (!keyword || keyword.trim() === '') {
623
+ console.error(chalk.red('Error: Keyword is required'));
624
+ console.error(chalk.gray('Usage: ccw core-memory search <keyword> [--type core|workflow|cli|all]'));
625
+ process.exit(1);
626
+ }
627
+
628
+ try {
629
+ const store = getCoreMemoryStore(getProjectPath());
630
+
631
+ const results = store.searchSessionsByKeyword(keyword);
632
+
633
+ if (results.length === 0) {
634
+ console.log(chalk.yellow(`\n No sessions found for: "${keyword}"\n`));
635
+ return;
636
+ }
637
+
638
+ // Filter by type if specified
639
+ let filtered = results;
640
+ if (options.type && options.type !== 'all') {
641
+ const typeMap: Record<string, string> = {
642
+ core: 'core_memory',
643
+ workflow: 'workflow',
644
+ cli: 'cli_history'
645
+ };
646
+ filtered = results.filter(r => r.session_type === typeMap[options.type!]);
647
+ }
648
+
649
+ console.log(chalk.bold.cyan(`\n 🔍 Found ${filtered.length} sessions for "${keyword}"\n`));
650
+ console.log(chalk.gray(' ─────────────────────────────────────────────────────────────────'));
651
+
652
+ for (const result of filtered) {
653
+ console.log(chalk.cyan(` ● ${result.session_id}`) + chalk.gray(` (${result.session_type})`));
654
+ if (result.title) console.log(chalk.white(` ${result.title}`));
655
+ if (result.token_estimate) console.log(chalk.gray(` ~${result.token_estimate} tokens`));
656
+ console.log(chalk.gray(' ─────────────────────────────────────────────────────────────────'));
657
+ }
658
+
659
+ console.log();
660
+
661
+ } catch (error) {
662
+ console.error(chalk.red(`Error: ${(error as Error).message}`));
663
+ process.exit(1);
664
+ }
665
+ }
666
+
667
+ /**
668
+ * Core Memory command entry point
669
+ */
670
+ export async function coreMemoryCommand(
671
+ subcommand: string,
672
+ args: string | string[],
673
+ options: CommandOptions
674
+ ): Promise<void> {
675
+ const argsArray = Array.isArray(args) ? args : (args ? [args] : []);
676
+ const textArg = argsArray.join(' ');
677
+
678
+ switch (subcommand) {
679
+ case 'list':
680
+ await listAction();
681
+ break;
682
+
683
+ case 'import':
684
+ await importAction(textArg);
685
+ break;
686
+
687
+ case 'export':
688
+ await exportAction(options);
689
+ break;
690
+
691
+ case 'summary':
692
+ await summaryAction(options);
693
+ break;
694
+
695
+ case 'clusters':
696
+ await clustersAction(options);
697
+ break;
698
+
699
+ case 'cluster':
700
+ await clusterAction(argsArray[0], options);
701
+ break;
702
+
703
+ case 'context':
704
+ await contextAction(options);
705
+ break;
706
+
707
+ case 'load-cluster':
708
+ await loadClusterAction(textArg, options);
709
+ break;
710
+
711
+ case 'search':
712
+ await searchAction(textArg, options);
713
+ break;
714
+
715
+ case 'projects':
716
+ await projectsAction(options);
717
+ break;
718
+
719
+ case 'import-from':
720
+ await importFromAction(textArg, options);
721
+ break;
722
+
723
+ case 'list-from':
724
+ await listFromAction(textArg, options);
725
+ break;
726
+
727
+ default:
728
+ console.log(chalk.bold.cyan('\n CCW Core Memory\n'));
729
+ console.log(' Manage core memory entries and session clusters.\n');
730
+ console.log(chalk.bold(' Basic Commands:'));
731
+ console.log(chalk.white(' list ') + chalk.gray('List all memories'));
732
+ console.log(chalk.white(' import "<text>" ') + chalk.gray('Import text as new memory'));
733
+ console.log(chalk.white(' export --id <id> ') + chalk.gray('Export memory (searches all projects)'));
734
+ console.log(chalk.white(' summary --id <id> ') + chalk.gray('Generate AI summary'));
735
+ console.log();
736
+ console.log(chalk.bold(' Cross-Workspace Commands:'));
737
+ console.log(chalk.white(' projects ') + chalk.gray('List all CCW projects'));
738
+ console.log(chalk.white(' list-from <project-id> ') + chalk.gray('List memories from another project'));
739
+ console.log();
740
+ console.log(chalk.bold(' Clustering Commands:'));
741
+ console.log(chalk.white(' clusters [--status] ') + chalk.gray('List all clusters'));
742
+ console.log(chalk.white(' cluster [id] ') + chalk.gray('View cluster details'));
743
+ console.log(chalk.white(' cluster --auto ') + chalk.gray('Run auto-clustering'));
744
+ console.log(chalk.white(' cluster --dedup ') + chalk.gray('Deduplicate similar clusters'));
745
+ console.log(chalk.white(' cluster <id> --delete ') + chalk.gray('Delete a cluster'));
746
+ console.log(chalk.white(' cluster <id> --merge <ids> ') + chalk.gray('Merge clusters into target'));
747
+ console.log(chalk.white(' cluster --create --name ') + chalk.gray('Create new cluster'));
748
+ console.log(chalk.white(' context ') + chalk.gray('Get progressive index'));
749
+ console.log(chalk.white(' load-cluster <id> ') + chalk.gray('Load cluster context'));
750
+ console.log(chalk.white(' search <keyword> ') + chalk.gray('Search sessions'));
751
+ console.log();
752
+ console.log(chalk.bold(' Options:'));
753
+ console.log(chalk.gray(' --id <id> Memory ID (for export/summary)'));
754
+ console.log(chalk.gray(' --tool gemini|qwen AI tool for summary (default: gemini)'));
755
+ console.log(chalk.gray(' --json Output as JSON'));
756
+ console.log(chalk.gray(' --scope <scope> Auto-cluster scope (all/recent/unclustered)'));
757
+ console.log(chalk.gray(' --dedup Deduplicate similar clusters'));
758
+ console.log(chalk.gray(' --delete Delete a cluster'));
759
+ console.log(chalk.gray(' --merge <ids> Merge source clusters into target'));
760
+ console.log();
761
+ console.log(chalk.bold(' Examples:'));
762
+ console.log(chalk.gray(' ccw core-memory list'));
763
+ console.log(chalk.gray(' ccw core-memory export --id CMEM-xxx # Searches all projects'));
764
+ console.log(chalk.gray(' ccw core-memory projects # List all projects'));
765
+ console.log(chalk.gray(' ccw core-memory list-from d--other-project'));
766
+ console.log(chalk.gray(' ccw core-memory cluster --auto'));
767
+ console.log(chalk.gray(' ccw core-memory cluster --dedup'));
768
+ console.log();
769
+ }
770
+ }