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,740 @@
1
+ /**
2
+ * CLI Command - Unified CLI tool executor command
3
+ * Provides interface for executing Gemini, Qwen, and Codex
4
+ */
5
+
6
+ import chalk from 'chalk';
7
+ import http from 'http';
8
+ import {
9
+ cliExecutorTool,
10
+ getCliToolsStatus,
11
+ getExecutionHistory,
12
+ getExecutionHistoryAsync,
13
+ getExecutionDetail,
14
+ getConversationDetail
15
+ } from '../tools/cli-executor.js';
16
+ import {
17
+ getStorageStats,
18
+ getStorageConfig,
19
+ cleanProjectStorage,
20
+ cleanAllStorage,
21
+ formatBytes,
22
+ formatTimeAgo,
23
+ resolveProjectId,
24
+ projectExists,
25
+ getStorageLocationInstructions
26
+ } from '../tools/storage-manager.js';
27
+
28
+ // Dashboard notification settings
29
+ const DASHBOARD_PORT = process.env.CCW_PORT || 3456;
30
+
31
+ /**
32
+ * Notify dashboard of CLI execution events (fire and forget)
33
+ */
34
+ function notifyDashboard(data: Record<string, unknown>): void {
35
+ const payload = JSON.stringify({
36
+ type: 'cli_execution',
37
+ ...data,
38
+ timestamp: new Date().toISOString()
39
+ });
40
+
41
+ const req = http.request({
42
+ hostname: 'localhost',
43
+ port: Number(DASHBOARD_PORT),
44
+ path: '/api/hook',
45
+ method: 'POST',
46
+ timeout: 2000, // 2 second timeout to prevent hanging
47
+ headers: {
48
+ 'Content-Type': 'application/json',
49
+ 'Content-Length': Buffer.byteLength(payload)
50
+ }
51
+ });
52
+
53
+ // Fire and forget - don't block process exit
54
+ req.on('socket', (socket) => {
55
+ socket.unref(); // Allow process to exit even if socket is open
56
+ });
57
+ req.on('error', (err) => {
58
+ if (process.env.DEBUG) console.error('[Dashboard] CLI notification failed:', err.message);
59
+ });
60
+ req.on('timeout', () => {
61
+ req.destroy();
62
+ if (process.env.DEBUG) console.error('[Dashboard] CLI notification timed out');
63
+ });
64
+ req.write(payload);
65
+ req.end();
66
+ }
67
+
68
+ interface CliExecOptions {
69
+ prompt?: string; // Prompt via --prompt/-p option (preferred for multi-line)
70
+ file?: string; // Read prompt from file
71
+ tool?: string;
72
+ mode?: string;
73
+ model?: string;
74
+ cd?: string;
75
+ includeDirs?: string;
76
+ timeout?: string;
77
+ noStream?: boolean;
78
+ resume?: string | boolean; // true = last, string = execution ID, comma-separated for merge
79
+ id?: string; // Custom execution ID (e.g., IMPL-001-step1)
80
+ noNative?: boolean; // Force prompt concatenation instead of native resume
81
+ }
82
+
83
+ interface HistoryOptions {
84
+ limit?: string;
85
+ tool?: string;
86
+ status?: string;
87
+ }
88
+
89
+ interface StorageOptions {
90
+ all?: boolean;
91
+ project?: string;
92
+ cliHistory?: boolean;
93
+ memory?: boolean;
94
+ cache?: boolean;
95
+ config?: boolean;
96
+ force?: boolean;
97
+ }
98
+
99
+ /**
100
+ * Show storage information and management options
101
+ */
102
+ async function storageAction(subAction: string | undefined, options: StorageOptions): Promise<void> {
103
+ switch (subAction) {
104
+ case 'info':
105
+ case undefined:
106
+ await showStorageInfo();
107
+ break;
108
+ case 'clean':
109
+ await cleanStorage(options);
110
+ break;
111
+ case 'config':
112
+ showStorageConfig();
113
+ break;
114
+ default:
115
+ showStorageHelp();
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Show storage information
121
+ */
122
+ async function showStorageInfo(): Promise<void> {
123
+ console.log(chalk.bold.cyan('\n CCW Storage Information\n'));
124
+
125
+ const config = getStorageConfig();
126
+ const stats = getStorageStats();
127
+
128
+ // Configuration
129
+ console.log(chalk.bold.white(' Location:'));
130
+ console.log(` ${chalk.cyan(stats.rootPath)}`);
131
+ if (config.isCustom) {
132
+ console.log(chalk.gray(` (Custom: CCW_DATA_DIR=${config.envVar})`));
133
+ }
134
+ console.log();
135
+
136
+ // Summary
137
+ console.log(chalk.bold.white(' Summary:'));
138
+ console.log(` Total Size: ${chalk.yellow(formatBytes(stats.totalSize))}`);
139
+ console.log(` Projects: ${chalk.yellow(stats.projectCount.toString())}`);
140
+ console.log(` Global DB: ${stats.globalDb.exists ? chalk.green(formatBytes(stats.globalDb.size)) : chalk.gray('Not created')}`);
141
+ console.log();
142
+
143
+ // Projects breakdown
144
+ if (stats.projects.length > 0) {
145
+ console.log(chalk.bold.white(' Projects:'));
146
+ console.log(chalk.gray(' ID Size History Last Used'));
147
+ console.log(chalk.gray(' ─────────────────────────────────────────────────────'));
148
+
149
+ for (const project of stats.projects) {
150
+ const historyInfo = project.cliHistory.recordCount !== undefined
151
+ ? `${project.cliHistory.recordCount} records`
152
+ : (project.cliHistory.exists ? 'Yes' : '-');
153
+
154
+ console.log(
155
+ ` ${chalk.dim(project.projectId)} ` +
156
+ `${formatBytes(project.totalSize).padStart(8)} ` +
157
+ `${historyInfo.padStart(10)} ` +
158
+ `${chalk.gray(formatTimeAgo(project.lastModified))}`
159
+ );
160
+ }
161
+ console.log();
162
+ }
163
+
164
+ // Usage tips
165
+ console.log(chalk.gray(' Commands:'));
166
+ console.log(chalk.gray(' ccw cli storage clean Clean all storage'));
167
+ console.log(chalk.gray(' ccw cli storage clean --project <path> Clean specific project'));
168
+ console.log(chalk.gray(' ccw cli storage config Show location config'));
169
+ console.log();
170
+ }
171
+
172
+ /**
173
+ * Clean storage
174
+ */
175
+ async function cleanStorage(options: StorageOptions): Promise<void> {
176
+ const { all, project, force, cliHistory, memory, cache, config } = options;
177
+
178
+ // Determine what to clean
179
+ const cleanTypes = {
180
+ cliHistory: cliHistory || (!cliHistory && !memory && !cache && !config),
181
+ memory: memory || (!cliHistory && !memory && !cache && !config),
182
+ cache: cache || (!cliHistory && !memory && !cache && !config),
183
+ config: config || false, // Config requires explicit flag
184
+ all: !cliHistory && !memory && !cache && !config
185
+ };
186
+
187
+ if (project) {
188
+ // Clean specific project
189
+ const projectId = resolveProjectId(project);
190
+
191
+ if (!projectExists(projectId)) {
192
+ console.log(chalk.yellow(`\n No storage found for project: ${project}`));
193
+ console.log(chalk.gray(` (Project ID: ${projectId})\n`));
194
+ return;
195
+ }
196
+
197
+ if (!force) {
198
+ console.log(chalk.bold.yellow('\n Warning: This will delete storage for project:'));
199
+ console.log(` Path: ${project}`);
200
+ console.log(` ID: ${projectId}`);
201
+ console.log(chalk.gray('\n Use --force to confirm deletion.\n'));
202
+ return;
203
+ }
204
+
205
+ console.log(chalk.bold.cyan('\n Cleaning project storage...\n'));
206
+ const result = cleanProjectStorage(projectId, cleanTypes);
207
+
208
+ if (result.success) {
209
+ console.log(chalk.green(` ✓ Cleaned ${formatBytes(result.freedBytes)}`));
210
+ } else {
211
+ console.log(chalk.red(' ✗ Cleanup completed with errors:'));
212
+ for (const err of result.errors) {
213
+ console.log(chalk.red(` - ${err}`));
214
+ }
215
+ }
216
+ } else {
217
+ // Clean all storage
218
+ const stats = getStorageStats();
219
+
220
+ if (stats.projectCount === 0) {
221
+ console.log(chalk.yellow('\n No storage to clean.\n'));
222
+ return;
223
+ }
224
+
225
+ if (!force) {
226
+ console.log(chalk.bold.yellow('\n Warning: This will delete ALL CCW storage:'));
227
+ console.log(` Location: ${stats.rootPath}`);
228
+ console.log(` Projects: ${stats.projectCount}`);
229
+ console.log(` Size: ${formatBytes(stats.totalSize)}`);
230
+ console.log(chalk.gray('\n Use --force to confirm deletion.\n'));
231
+ return;
232
+ }
233
+
234
+ console.log(chalk.bold.cyan('\n Cleaning all storage...\n'));
235
+ const result = cleanAllStorage(cleanTypes);
236
+
237
+ if (result.success) {
238
+ console.log(chalk.green(` ✓ Cleaned ${result.projectsCleaned} projects, freed ${formatBytes(result.freedBytes)}`));
239
+ } else {
240
+ console.log(chalk.yellow(` ⚠ Cleaned ${result.projectsCleaned} projects with some errors:`));
241
+ for (const err of result.errors) {
242
+ console.log(chalk.red(` - ${err}`));
243
+ }
244
+ }
245
+ }
246
+ console.log();
247
+ }
248
+
249
+ /**
250
+ * Show storage configuration
251
+ */
252
+ function showStorageConfig(): void {
253
+ console.log(getStorageLocationInstructions());
254
+ }
255
+
256
+ /**
257
+ * Show storage help
258
+ */
259
+ function showStorageHelp(): void {
260
+ console.log(chalk.bold.cyan('\n CCW Storage Management\n'));
261
+ console.log(' Subcommands:');
262
+ console.log(chalk.gray(' info Show storage information (default)'));
263
+ console.log(chalk.gray(' clean Clean storage'));
264
+ console.log(chalk.gray(' config Show configuration instructions'));
265
+ console.log();
266
+ console.log(' Clean Options:');
267
+ console.log(chalk.gray(' --project <path> Clean specific project storage'));
268
+ console.log(chalk.gray(' --force Confirm deletion'));
269
+ console.log(chalk.gray(' --cli-history Clean only CLI history'));
270
+ console.log(chalk.gray(' --memory Clean only memory store'));
271
+ console.log(chalk.gray(' --cache Clean only cache'));
272
+ console.log(chalk.gray(' --config Clean config (requires explicit flag)'));
273
+ console.log();
274
+ console.log(' Examples:');
275
+ console.log(chalk.gray(' ccw cli storage # Show storage info'));
276
+ console.log(chalk.gray(' ccw cli storage clean --force # Clean all storage'));
277
+ console.log(chalk.gray(' ccw cli storage clean --project . --force # Clean current project'));
278
+ console.log(chalk.gray(' ccw cli storage config # Show config instructions'));
279
+ console.log();
280
+ }
281
+
282
+ /**
283
+ * Test endpoint for debugging multi-line prompt parsing
284
+ * Shows exactly how Commander.js parsed the arguments
285
+ */
286
+ function testParseAction(args: string[], options: CliExecOptions): void {
287
+ console.log(chalk.bold.cyan('\n ═══════════════════════════════════════════════'));
288
+ console.log(chalk.bold.cyan(' │ CLI PARSE TEST ENDPOINT │'));
289
+ console.log(chalk.bold.cyan(' ═══════════════════════════════════════════════\n'));
290
+
291
+ // Show args array parsing
292
+ console.log(chalk.bold.yellow('📦 Positional Arguments (args[]):'));
293
+ console.log(chalk.gray(' Length: ') + chalk.white(args.length));
294
+ if (args.length === 0) {
295
+ console.log(chalk.gray(' (empty)'));
296
+ } else {
297
+ args.forEach((arg, i) => {
298
+ console.log(chalk.gray(` [${i}]: `) + chalk.green(`"${arg}"`));
299
+ // Show if multiline
300
+ if (arg.includes('\n')) {
301
+ console.log(chalk.yellow(` ↳ Contains ${arg.split('\n').length} lines`));
302
+ }
303
+ });
304
+ }
305
+
306
+ console.log();
307
+
308
+ // Show options parsing
309
+ console.log(chalk.bold.yellow('⚙️ Options:'));
310
+ const optionEntries = Object.entries(options).filter(([_, v]) => v !== undefined);
311
+ if (optionEntries.length === 0) {
312
+ console.log(chalk.gray(' (none)'));
313
+ } else {
314
+ optionEntries.forEach(([key, value]) => {
315
+ const displayValue = typeof value === 'string' && value.includes('\n')
316
+ ? `"${value.substring(0, 50)}..." (${value.split('\n').length} lines)`
317
+ : JSON.stringify(value);
318
+ console.log(chalk.gray(` --${key}: `) + chalk.cyan(displayValue));
319
+ });
320
+ }
321
+
322
+ console.log();
323
+
324
+ // Show what would be used as prompt
325
+ console.log(chalk.bold.yellow('🎯 Final Prompt Resolution:'));
326
+ const { prompt: optionPrompt, file } = options;
327
+
328
+ if (file) {
329
+ console.log(chalk.gray(' Source: ') + chalk.magenta('--file/-f option'));
330
+ console.log(chalk.gray(' File: ') + chalk.cyan(file));
331
+ } else if (optionPrompt) {
332
+ console.log(chalk.gray(' Source: ') + chalk.magenta('--prompt/-p option'));
333
+ console.log(chalk.gray(' Value: ') + chalk.green(`"${optionPrompt.substring(0, 100)}${optionPrompt.length > 100 ? '...' : ''}"`));
334
+ if (optionPrompt.includes('\n')) {
335
+ console.log(chalk.yellow(` ↳ Multiline: ${optionPrompt.split('\n').length} lines`));
336
+ }
337
+ } else if (args[0]) {
338
+ console.log(chalk.gray(' Source: ') + chalk.magenta('positional argument (args[0])'));
339
+ console.log(chalk.gray(' Value: ') + chalk.green(`"${args[0].substring(0, 100)}${args[0].length > 100 ? '...' : ''}"`));
340
+ if (args[0].includes('\n')) {
341
+ console.log(chalk.yellow(` ↳ Multiline: ${args[0].split('\n').length} lines`));
342
+ }
343
+ } else {
344
+ console.log(chalk.red(' No prompt found!'));
345
+ }
346
+
347
+ console.log();
348
+
349
+ // Show raw debug info
350
+ console.log(chalk.bold.yellow('🔍 Raw Debug Info:'));
351
+ console.log(chalk.gray(' process.argv:'));
352
+ process.argv.forEach((arg, i) => {
353
+ console.log(chalk.gray(` [${i}]: `) + chalk.dim(arg.length > 60 ? arg.substring(0, 60) + '...' : arg));
354
+ });
355
+
356
+ console.log(chalk.bold.cyan('\n ═══════════════════════════════════════════════\n'));
357
+ }
358
+
359
+ /**
360
+ * Show CLI tool status
361
+ */
362
+ async function statusAction(): Promise<void> {
363
+ console.log(chalk.bold.cyan('\n CLI Tools Status\n'));
364
+
365
+ const status = await getCliToolsStatus();
366
+
367
+ for (const [tool, info] of Object.entries(status)) {
368
+ const statusIcon = info.available ? chalk.green('●') : chalk.red('○');
369
+ const statusText = info.available ? chalk.green('Available') : chalk.red('Not Found');
370
+
371
+ console.log(` ${statusIcon} ${chalk.bold.white(tool.padEnd(10))} ${statusText}`);
372
+ if (info.available && info.path) {
373
+ console.log(chalk.gray(` ${info.path}`));
374
+ }
375
+ }
376
+
377
+ console.log();
378
+ }
379
+
380
+ /**
381
+ * Execute a CLI tool
382
+ * @param {string} prompt - Prompt to execute
383
+ * @param {Object} options - CLI options
384
+ */
385
+ async function execAction(positionalPrompt: string | undefined, options: CliExecOptions): Promise<void> {
386
+ const { prompt: optionPrompt, file, tool = 'gemini', mode = 'analysis', model, cd, includeDirs, timeout, noStream, resume, id, noNative } = options;
387
+
388
+ // Priority: 1. --file, 2. --prompt/-p option, 3. positional argument
389
+ let finalPrompt: string | undefined;
390
+
391
+ if (file) {
392
+ // Read from file
393
+ const { readFileSync, existsSync } = await import('fs');
394
+ const { resolve } = await import('path');
395
+ const filePath = resolve(file);
396
+ if (!existsSync(filePath)) {
397
+ console.error(chalk.red(`Error: File not found: ${filePath}`));
398
+ process.exit(1);
399
+ }
400
+ finalPrompt = readFileSync(filePath, 'utf8').trim();
401
+ if (!finalPrompt) {
402
+ console.error(chalk.red('Error: File is empty'));
403
+ process.exit(1);
404
+ }
405
+ } else if (optionPrompt) {
406
+ // Use --prompt/-p option (preferred for multi-line)
407
+ finalPrompt = optionPrompt;
408
+ } else {
409
+ // Fall back to positional argument
410
+ finalPrompt = positionalPrompt;
411
+ }
412
+
413
+ // Prompt is required unless resuming
414
+ if (!finalPrompt && !resume) {
415
+ console.error(chalk.red('Error: Prompt is required'));
416
+ console.error(chalk.gray('Usage: ccw cli -p "<prompt>" --tool gemini'));
417
+ console.error(chalk.gray(' or: ccw cli -f prompt.txt --tool codex'));
418
+ console.error(chalk.gray(' or: ccw cli --resume --tool gemini'));
419
+ process.exit(1);
420
+ }
421
+
422
+ const prompt_to_use = finalPrompt || '';
423
+
424
+ // Parse resume IDs for merge scenario
425
+ const resumeIds = resume && typeof resume === 'string' ? resume.split(',').map(s => s.trim()).filter(Boolean) : [];
426
+ const isMerge = resumeIds.length > 1;
427
+
428
+ // Show execution mode
429
+ let resumeInfo = '';
430
+ if (isMerge) {
431
+ resumeInfo = ` merging ${resumeIds.length} conversations`;
432
+ } else if (resume) {
433
+ resumeInfo = typeof resume === 'string' ? ` resuming ${resume}` : ' resuming last';
434
+ }
435
+ const nativeMode = noNative ? ' (prompt-concat)' : '';
436
+ const idInfo = id ? ` [${id}]` : '';
437
+ console.log(chalk.cyan(`\n Executing ${tool} (${mode} mode${resumeInfo}${nativeMode})${idInfo}...\n`));
438
+
439
+ // Show merge details
440
+ if (isMerge) {
441
+ console.log(chalk.gray(' Merging conversations:'));
442
+ for (const rid of resumeIds) {
443
+ console.log(chalk.gray(` • ${rid}`));
444
+ }
445
+ console.log();
446
+ }
447
+
448
+ // Notify dashboard: execution started
449
+ notifyDashboard({
450
+ event: 'started',
451
+ tool,
452
+ mode,
453
+ prompt_preview: prompt_to_use.substring(0, 100) + (prompt_to_use.length > 100 ? '...' : ''),
454
+ custom_id: id || null
455
+ });
456
+
457
+ // Streaming output handler
458
+ const onOutput = noStream ? null : (chunk: any) => {
459
+ process.stdout.write(chunk.data);
460
+ };
461
+
462
+ try {
463
+ const result = await cliExecutorTool.execute({
464
+ tool,
465
+ prompt: prompt_to_use,
466
+ mode,
467
+ model,
468
+ cd,
469
+ includeDirs,
470
+ timeout: timeout ? parseInt(timeout, 10) : 300000,
471
+ resume,
472
+ id, // custom execution ID
473
+ noNative
474
+ }, onOutput);
475
+
476
+ // If not streaming, print output now
477
+ if (noStream && result.stdout) {
478
+ console.log(result.stdout);
479
+ }
480
+
481
+ // Print summary with execution ID and turn info
482
+ console.log();
483
+ if (result.success) {
484
+ const turnInfo = result.conversation.turn_count > 1
485
+ ? ` (turn ${result.conversation.turn_count})`
486
+ : '';
487
+ console.log(chalk.green(` ✓ Completed in ${(result.execution.duration_ms / 1000).toFixed(1)}s${turnInfo}`));
488
+ console.log(chalk.gray(` ID: ${result.execution.id}`));
489
+ if (isMerge && !id) {
490
+ // Merge without custom ID: updated all source conversations
491
+ console.log(chalk.gray(` Updated ${resumeIds.length} conversations: ${resumeIds.join(', ')}`));
492
+ } else if (isMerge && id) {
493
+ // Merge with custom ID: created new merged conversation
494
+ console.log(chalk.gray(` Created merged conversation from ${resumeIds.length} sources`));
495
+ }
496
+ if (result.conversation.turn_count > 1) {
497
+ console.log(chalk.gray(` Total: ${result.conversation.turn_count} turns, ${(result.conversation.total_duration_ms / 1000).toFixed(1)}s`));
498
+ }
499
+ console.log(chalk.dim(` Continue: ccw cli -p "..." --resume ${result.execution.id}`));
500
+
501
+ // Notify dashboard: execution completed
502
+ notifyDashboard({
503
+ event: 'completed',
504
+ tool,
505
+ mode,
506
+ execution_id: result.execution.id,
507
+ success: true,
508
+ duration_ms: result.execution.duration_ms,
509
+ turn_count: result.conversation.turn_count
510
+ });
511
+
512
+ // Ensure clean exit after successful execution
513
+ process.exit(0);
514
+ } else {
515
+ console.log(chalk.red(` ✗ Failed (${result.execution.status})`));
516
+ console.log(chalk.gray(` ID: ${result.execution.id}`));
517
+ if (result.stderr) {
518
+ console.error(chalk.red(result.stderr));
519
+ }
520
+
521
+ // Notify dashboard: execution failccw cli -p
522
+ notifyDashboard({
523
+ event: 'completed',
524
+ tool,
525
+ mode,
526
+ execution_id: result.execution.id,
527
+ success: false,
528
+ status: result.execution.status,
529
+ duration_ms: result.execution.duration_ms
530
+ });
531
+
532
+ process.exit(1);
533
+ }
534
+ } catch (error) {
535
+ const err = error as Error;
536
+ console.error(chalk.red(` Error: ${err.message}`));
537
+
538
+ // Notify dashboard: execution error
539
+ notifyDashboard({
540
+ event: 'error',
541
+ tool,
542
+ mode,
543
+ error: err.message
544
+ });
545
+
546
+ process.exit(1);
547
+ }
548
+ }
549
+
550
+ /**
551
+ * Show execution history
552
+ * @param {Object} options - CLI options
553
+ */
554
+ async function historyAction(options: HistoryOptions): Promise<void> {
555
+ const { limit = '20', tool, status } = options;
556
+
557
+ console.log(chalk.bold.cyan('\n CLI Execution History\n'));
558
+
559
+ const history = await getExecutionHistoryAsync(process.cwd(), { limit: parseInt(limit, 10), tool, status });
560
+
561
+ if (history.executions.length === 0) {
562
+ console.log(chalk.gray(' No executions found.\n'));
563
+ return;
564
+ }
565
+
566
+ console.log(chalk.gray(` Total executions: ${history.total}\n`));
567
+
568
+ for (const exec of history.executions) {
569
+ const statusIcon = exec.status === 'success' ? chalk.green('●') :
570
+ exec.status === 'timeout' ? chalk.yellow('●') : chalk.red('●');
571
+ const duration = exec.duration_ms >= 1000
572
+ ? `${(exec.duration_ms / 1000).toFixed(1)}s`
573
+ : `${exec.duration_ms}ms`;
574
+
575
+ const timeAgo = getTimeAgo(new Date(exec.updated_at || exec.timestamp));
576
+ const turnInfo = exec.turn_count && exec.turn_count > 1 ? chalk.cyan(` [${exec.turn_count} turns]`) : '';
577
+
578
+ console.log(` ${statusIcon} ${chalk.bold.white(exec.tool.padEnd(8))} ${chalk.gray(timeAgo.padEnd(12))} ${chalk.gray(duration.padEnd(8))}${turnInfo}`);
579
+ console.log(chalk.gray(` ${exec.prompt_preview}`));
580
+ console.log(chalk.dim(` ID: ${exec.id}`));
581
+ console.log();
582
+ }
583
+ }
584
+
585
+ /**
586
+ * Show conversation detail with all turns
587
+ * @param {string} conversationId - Conversation ID
588
+ */
589
+ async function detailAction(conversationId: string | undefined): Promise<void> {
590
+ if (!conversationId) {
591
+ console.error(chalk.red('Error: Conversation ID is required'));
592
+ console.error(chalk.gray('Usage: ccw cli detail <conversation-id>'));
593
+ process.exit(1);
594
+ }
595
+
596
+ const conversation = getConversationDetail(process.cwd(), conversationId);
597
+
598
+ if (!conversation) {
599
+ console.error(chalk.red(`Error: Conversation not found: ${conversationId}`));
600
+ process.exit(1);
601
+ }
602
+
603
+ console.log(chalk.bold.cyan('\n Conversation Detail\n'));
604
+ console.log(` ${chalk.gray('ID:')} ${conversation.id}`);
605
+ console.log(` ${chalk.gray('Tool:')} ${conversation.tool}`);
606
+ console.log(` ${chalk.gray('Model:')} ${conversation.model}`);
607
+ console.log(` ${chalk.gray('Mode:')} ${conversation.mode}`);
608
+ console.log(` ${chalk.gray('Status:')} ${conversation.latest_status}`);
609
+ console.log(` ${chalk.gray('Turns:')} ${conversation.turn_count}`);
610
+ console.log(` ${chalk.gray('Duration:')} ${(conversation.total_duration_ms / 1000).toFixed(1)}s total`);
611
+ console.log(` ${chalk.gray('Created:')} ${conversation.created_at}`);
612
+ if (conversation.turn_count > 1) {
613
+ console.log(` ${chalk.gray('Updated:')} ${conversation.updated_at}`);
614
+ }
615
+
616
+ // Show all turns
617
+ for (const turn of conversation.turns) {
618
+ console.log(chalk.bold.cyan(`\n ═══ Turn ${turn.turn} ═══`));
619
+ console.log(chalk.gray(` ${turn.timestamp} | ${turn.status} | ${(turn.duration_ms / 1000).toFixed(1)}s`));
620
+
621
+ console.log(chalk.bold.white('\n Prompt:'));
622
+ console.log(chalk.gray(' ' + turn.prompt.split('\n').join('\n ')));
623
+
624
+ if (turn.output.stdout) {
625
+ console.log(chalk.bold.white('\n Output:'));
626
+ console.log(turn.output.stdout);
627
+ }
628
+
629
+ if (turn.output.stderr) {
630
+ console.log(chalk.bold.red('\n Errors:'));
631
+ console.log(turn.output.stderr);
632
+ }
633
+
634
+ if (turn.output.truncated) {
635
+ console.log(chalk.yellow('\n Note: Output was truncated due to size.'));
636
+ }
637
+ }
638
+
639
+ console.log(chalk.dim(`\n Continue: ccw cli -p "..." --resume ${conversation.id}`));
640
+ console.log();
641
+ }
642
+
643
+ /**
644
+ * Get human-readable time ago string
645
+ * @param {Date} date
646
+ * @returns {string}
647
+ */
648
+ function getTimeAgo(date: Date): string {
649
+ const seconds = Math.floor((new Date().getTime() - date.getTime()) / 1000);
650
+
651
+ if (seconds < 60) return 'just now';
652
+ if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;
653
+ if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;
654
+ if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago`;
655
+ return date.toLocaleDateString();
656
+ }
657
+
658
+ /**ccw cli -p
659
+ * CLI command entry point
660
+ * @param {string} subcommand - Subcommand (status, exec, history, detail)
661
+ * @param {string[]} args - Arguments array
662
+ * @param {Object} options - CLI options
663
+ */
664
+ export async function cliCommand(
665
+ subcommand: string,
666
+ args: string | string[],
667
+ options: CliExecOptions | HistoryOptions
668
+ ): Promise<void> {
669
+ const argsArray = Array.isArray(args) ? args : (args ? [args] : []);
670
+
671
+ switch (subcommand) {
672
+ case 'status':
673
+ await statusAction();
674
+ break;
675
+
676
+ case 'history':
677
+ await historyAction(options as HistoryOptions);
678
+ break;
679
+
680
+ case 'detail':
681
+ await detailAction(argsArray[0]);
682
+ break;
683
+
684
+ case 'storage':
685
+ await storageAction(argsArray[0], options as unknown as StorageOptions);
686
+ break;
687
+
688
+ case 'test-parse':
689
+ // Test endpoint to debug multi-line prompt parsing
690
+ testParseAction(argsArray, options as CliExecOptions);
691
+ break;
692
+
693
+ default: {
694
+ const execOptions = options as CliExecOptions;
695
+ // Auto-exec if: has -p/--prompt, has -f/--file, has --resume, or subcommand looks like a prompt
696
+ const hasPromptOption = !!execOptions.prompt;
697
+ const hasFileOption = !!execOptions.file;
698
+ const hasResume = execOptions.resume !== undefined;
699
+ const subcommandIsPrompt = subcommand && !subcommand.startsWith('-');
700
+
701
+ if (hasPromptOption || hasFileOption || hasResume || subcommandIsPrompt) {
702
+ // Treat as exec: use subcommand as positional prompt if no -p/-f option
703
+ const positionalPrompt = subcommandIsPrompt ? subcommand : undefined;
704
+ await execAction(positionalPrompt, execOptions);
705
+ } else {
706
+ // Show help
707
+ console.log(chalk.bold.cyan('\n CCW CLI Tool Executor\n'));
708
+ console.log(' Unified interface for Gemini, Qwen, and Codex CLI tools.\n');
709
+ console.log(' Usage:');
710
+ console.log(chalk.gray(' ccw cli -p "<prompt>" --tool <tool> Execute with prompt'));
711
+ console.log(chalk.gray(' ccw cli -f prompt.txt --tool <tool> Execute from file'));
712
+ console.log();
713
+ console.log(' Subcommands:');
714
+ console.log(chalk.gray(' status Check CLI tools availability'));
715
+ console.log(chalk.gray(' storage [cmd] Manage CCW storage (info/clean/config)'));
716
+ console.log(chalk.gray(' history Show execution history'));
717
+ console.log(chalk.gray(' detail <id> Show execution detail'));
718
+ console.log(chalk.gray(' test-parse [args] Debug CLI argument parsing'));
719
+ console.log();
720
+ console.log(' Options:');
721
+ console.log(chalk.gray(' -p, --prompt <text> Prompt text'));
722
+ console.log(chalk.gray(' -f, --file <file> Read prompt from file'));
723
+ console.log(chalk.gray(' --tool <tool> Tool: gemini, qwen, codex (default: gemini)'));
724
+ console.log(chalk.gray(' --mode <mode> Mode: analysis, write, auto (default: analysis)'));
725
+ console.log(chalk.gray(' --model <model> Model override'));
726
+ console.log(chalk.gray(' --cd <path> Working directory'));
727
+ console.log(chalk.gray(' --includeDirs <dirs> Additional directories'));
728
+ console.log(chalk.gray(' --timeout <ms> Timeout (default: 300000)'));
729
+ console.log(chalk.gray(' --resume [id] Resume previous session'));
730
+ console.log();
731
+ console.log(' Examples:');
732
+ console.log(chalk.gray(' ccw cli -p "Analyze auth module" --tool gemini'));
733
+ console.log(chalk.gray(' ccw cli -f prompt.txt --tool codex --mode write'));
734
+ console.log(chalk.gray(' ccw cli -p "$(cat template.md)" --tool gemini'));
735
+ console.log(chalk.gray(' ccw cli --resume --tool gemini'));
736
+ console.log();
737
+ }
738
+ }
739
+ }
740
+ }