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,713 @@
1
+ // Prompt History View
2
+ // Displays prompt history and optimization insights
3
+
4
+ // ========== State ==========
5
+ var promptHistoryData = [];
6
+ var promptInsights = null;
7
+ var promptHistorySearch = '';
8
+ var promptHistoryDateFilter = null;
9
+ var promptHistoryProjectFilter = null;
10
+ var selectedPromptId = null;
11
+ var promptInsightsHistory = []; // Insights analysis history
12
+ var selectedPromptInsight = null; // Currently selected insight for detail view
13
+
14
+ // ========== Data Loading ==========
15
+ async function loadPromptHistory() {
16
+ try {
17
+ // Use native Claude history.jsonl as primary source
18
+ var response = await fetch('/api/memory/native-history?path=' + encodeURIComponent(projectPath) + '&limit=200');
19
+ if (!response.ok) throw new Error('Failed to load prompt history');
20
+ var data = await response.json();
21
+ promptHistoryData = data.prompts || [];
22
+ console.log('[PromptHistory] Loaded', promptHistoryData.length, 'prompts from native history');
23
+ return promptHistoryData;
24
+ } catch (err) {
25
+ console.error('Failed to load prompt history:', err);
26
+ promptHistoryData = [];
27
+ return [];
28
+ }
29
+ }
30
+
31
+ async function loadPromptInsights() {
32
+ try {
33
+ var response = await fetch('/api/memory/insights?path=' + encodeURIComponent(projectPath));
34
+ if (!response.ok) throw new Error('Failed to load insights');
35
+ var data = await response.json();
36
+ promptInsights = data.insights || null;
37
+ return promptInsights;
38
+ } catch (err) {
39
+ console.error('Failed to load insights:', err);
40
+ promptInsights = null;
41
+ return null;
42
+ }
43
+ }
44
+
45
+ async function loadPromptInsightsHistory() {
46
+ try {
47
+ var response = await fetch('/api/memory/insights?limit=20&path=' + encodeURIComponent(projectPath));
48
+ if (!response.ok) throw new Error('Failed to load insights history');
49
+ var data = await response.json();
50
+ promptInsightsHistory = data.insights || [];
51
+ return promptInsightsHistory;
52
+ } catch (err) {
53
+ console.error('Failed to load insights history:', err);
54
+ promptInsightsHistory = [];
55
+ return [];
56
+ }
57
+ }
58
+
59
+ // ========== Rendering ==========
60
+ async function renderPromptHistoryView() {
61
+ var container = document.getElementById('mainContent');
62
+ if (!container) return;
63
+
64
+ // Hide stats grid and search
65
+ var statsGrid = document.getElementById('statsGrid');
66
+ var searchInput = document.getElementById('searchInput');
67
+ if (statsGrid) statsGrid.style.display = 'none';
68
+ if (searchInput) searchInput.parentElement.style.display = 'none';
69
+
70
+ // Load data
71
+ await Promise.all([loadPromptHistory(), loadPromptInsights(), loadPromptInsightsHistory()]);
72
+
73
+ // Calculate stats
74
+ var totalPrompts = promptHistoryData.length;
75
+ var intentDistribution = calculateIntentDistribution(promptHistoryData);
76
+ var avgLength = calculateAverageLength(promptHistoryData);
77
+ var qualityDistribution = calculateQualityDistribution(promptHistoryData);
78
+
79
+ container.innerHTML = '<div class="prompt-history-view">' +
80
+ '<div class="prompt-history-header">' +
81
+ renderStatsSection(totalPrompts, intentDistribution, avgLength, qualityDistribution) +
82
+ '</div>' +
83
+ '<div class="prompt-history-content">' +
84
+ '<div class="prompt-history-left">' +
85
+ renderPromptTimeline() +
86
+ '</div>' +
87
+ '<div class="prompt-history-right">' +
88
+ renderInsightsPanel() +
89
+ '</div>' +
90
+ '</div>' +
91
+ '</div>';
92
+
93
+ if (window.lucide) lucide.createIcons();
94
+ }
95
+
96
+ function renderStatsSection(totalPrompts, intentDist, avgLength, qualityDist) {
97
+ var topIntent = intentDist.length > 0 ? intentDist[0].intent : 'N/A';
98
+ var topIntentCount = intentDist.length > 0 ? intentDist[0].count : 0;
99
+ var intentLabel = t('prompt.intent.' + topIntent) || topIntent;
100
+
101
+ return '<div class="prompt-stats-grid">' +
102
+ '<div class="prompt-stat-card">' +
103
+ '<div class="stat-icon"><i data-lucide="message-square" class="w-5 h-5"></i></div>' +
104
+ '<div class="stat-content">' +
105
+ '<div class="stat-value">' + totalPrompts + '</div>' +
106
+ '<div class="stat-label">' + (isZh() ? '总提示词' : 'Total Prompts') + '</div>' +
107
+ '</div>' +
108
+ '</div>' +
109
+ '<div class="prompt-stat-card">' +
110
+ '<div class="stat-icon"><i data-lucide="target" class="w-5 h-5"></i></div>' +
111
+ '<div class="stat-content">' +
112
+ '<div class="stat-value">' + intentLabel + '</div>' +
113
+ '<div class="stat-label">' + (isZh() ? '主要意图' : 'Top Intent') + ' (' + topIntentCount + ')</div>' +
114
+ '</div>' +
115
+ '</div>' +
116
+ '<div class="prompt-stat-card">' +
117
+ '<div class="stat-icon"><i data-lucide="align-left" class="w-5 h-5"></i></div>' +
118
+ '<div class="stat-content">' +
119
+ '<div class="stat-value">' + avgLength + '</div>' +
120
+ '<div class="stat-label">' + (isZh() ? '平均长度' : 'Avg Length') + '</div>' +
121
+ '</div>' +
122
+ '</div>' +
123
+ '<div class="prompt-stat-card">' +
124
+ '<div class="stat-icon"><i data-lucide="bar-chart-2" class="w-5 h-5"></i></div>' +
125
+ '<div class="stat-content">' +
126
+ '<div class="stat-value">' + renderQualityBadge(qualityDist.average) + '</div>' +
127
+ '<div class="stat-label">' + t('prompt.quality') + '</div>' +
128
+ '</div>' +
129
+ '</div>' +
130
+ '</div>';
131
+ }
132
+
133
+ function renderPromptTimeline() {
134
+ var filteredPrompts = filterPrompts(promptHistoryData);
135
+ var groupedBySession = groupPromptsBySession(filteredPrompts);
136
+
137
+ var html = '<div class="prompt-timeline-header">' +
138
+ '<h3><i data-lucide="clock" class="w-4 h-4"></i> ' + t('prompt.timeline') + '</h3>' +
139
+ '<div class="prompt-timeline-filters">' +
140
+ '<div class="prompt-search-wrapper">' +
141
+ '<i data-lucide="search" class="w-4 h-4"></i>' +
142
+ '<input type="text" class="prompt-search-input" placeholder="' + t('prompt.searchPlaceholder') + '" ' +
143
+ 'value="' + escapeHtml(promptHistorySearch) + '" ' +
144
+ 'oninput="searchPrompts(this.value)">' +
145
+ '</div>' +
146
+ '<button class="btn-icon" onclick="refreshPromptHistory()" title="' + t('common.refresh') + '">' +
147
+ '<i data-lucide="refresh-cw" class="w-4 h-4"></i>' +
148
+ '</button>' +
149
+ '</div>' +
150
+ '</div>';
151
+
152
+ if (filteredPrompts.length === 0) {
153
+ html += '<div class="prompt-empty-state">' +
154
+ '<i data-lucide="message-circle-off" class="w-12 h-12"></i>' +
155
+ '<h3>' + t('prompt.noPromptsFound') + '</h3>' +
156
+ '<p>' + t('prompt.noPromptsText') + '</p>' +
157
+ '</div>';
158
+ } else {
159
+ html += '<div class="prompt-timeline-list">';
160
+ for (var sessionId in groupedBySession) {
161
+ html += renderSessionGroup(sessionId, groupedBySession[sessionId]);
162
+ }
163
+ html += '</div>';
164
+ }
165
+
166
+ return html;
167
+ }
168
+
169
+ function renderSessionGroup(sessionId, prompts) {
170
+ var sessionDate = new Date(prompts[0].timestamp).toLocaleDateString();
171
+ var shortSessionId = sessionId.substring(0, 8);
172
+
173
+ var html = '<div class="prompt-session-group">' +
174
+ '<div class="prompt-session-header">' +
175
+ '<span class="prompt-session-id">' +
176
+ '<i data-lucide="layers" class="w-3.5 h-3.5"></i> ' +
177
+ shortSessionId +
178
+ '</span>' +
179
+ '<span class="prompt-session-date">' + sessionDate + '</span>' +
180
+ '<span class="prompt-session-count">' + prompts.length + ' prompt' + (prompts.length > 1 ? 's' : '') + '</span>' +
181
+ '</div>' +
182
+ '<div class="prompt-session-items">';
183
+
184
+ for (var i = 0; i < prompts.length; i++) {
185
+ html += renderPromptItem(prompts[i]);
186
+ }
187
+
188
+ html += '</div></div>';
189
+ return html;
190
+ }
191
+
192
+ function renderPromptItem(prompt) {
193
+ var isExpanded = selectedPromptId === prompt.id;
194
+ var timeAgo = getTimeAgo(new Date(prompt.timestamp));
195
+ var preview = prompt.text.substring(0, 120) + (prompt.text.length > 120 ? '...' : '');
196
+ var qualityClass = getQualityClass(prompt.quality_score);
197
+
198
+ var html = '<div class="prompt-item' + (isExpanded ? ' prompt-item-expanded' : '') + '" ' +
199
+ 'onclick="togglePromptExpand(\'' + prompt.id + '\')">' +
200
+ '<div class="prompt-item-header">' +
201
+ '<span class="prompt-intent-tag">' + (prompt.intent || 'unknown') + '</span>' +
202
+ '<span class="prompt-quality-badge ' + qualityClass + '">' +
203
+ '<i data-lucide="sparkles" class="w-3 h-3"></i> ' + (prompt.quality_score || 0) +
204
+ '</span>' +
205
+ '<span class="prompt-time">' + timeAgo + '</span>' +
206
+ '</div>' +
207
+ '<div class="prompt-item-preview">' + escapeHtml(preview) + '</div>';
208
+
209
+ if (isExpanded) {
210
+ html += '<div class="prompt-item-full">' +
211
+ '<div class="prompt-full-text">' + escapeHtml(prompt.text) + '</div>' +
212
+ '<div class="prompt-item-meta">' +
213
+ '<span><i data-lucide="type" class="w-3 h-3"></i> ' + prompt.text.length + ' chars</span>' +
214
+ (prompt.project ? '<span><i data-lucide="folder" class="w-3 h-3"></i> ' + escapeHtml(prompt.project) + '</span>' : '') +
215
+ '</div>' +
216
+ '<div class="prompt-item-actions-full">' +
217
+ '<button class="btn btn-sm btn-outline" onclick="event.stopPropagation(); copyPrompt(\'' + prompt.id + '\')">' +
218
+ '<i data-lucide="copy" class="w-3.5 h-3.5"></i> ' + t('common.copy') +
219
+ '</button>' +
220
+ '</div>' +
221
+ '</div>';
222
+ }
223
+
224
+ html += '</div>';
225
+ return html;
226
+ }
227
+
228
+ function renderInsightsPanel() {
229
+ var html = '<div class="insights-panel-header">' +
230
+ '<h3><i data-lucide="lightbulb" class="w-4 h-4"></i> ' + t('prompt.insights') + '</h3>' +
231
+ '<div class="insights-actions">' +
232
+ '<select id="insightsTool" class="insights-tool-select">' +
233
+ '<option value="gemini">Gemini</option>' +
234
+ '<option value="qwen">Qwen</option>' +
235
+ '</select>' +
236
+ '<button class="btn btn-sm btn-primary" onclick="triggerCliInsightsAnalysis()" id="analyzeBtn">' +
237
+ '<i data-lucide="sparkles" class="w-3.5 h-3.5"></i> ' + t('prompt.analyze') +
238
+ '</button>' +
239
+ '</div>' +
240
+ '</div>';
241
+
242
+ // Show loading state
243
+ if (window.insightsAnalyzing) {
244
+ html += '<div class="insights-loading">' +
245
+ '<div class="loading-spinner"><i data-lucide="loader-2" class="w-6 h-6 animate-spin"></i></div>' +
246
+ '<p>' + t('prompt.loadingInsights') + '</p>' +
247
+ '</div>';
248
+ return html;
249
+ }
250
+
251
+ // Show insights history cards
252
+ html += '<div class="insights-history-container">' +
253
+ renderPromptInsightsHistory() +
254
+ '</div>';
255
+
256
+ // Show detail panel if an insight is selected
257
+ if (selectedPromptInsight) {
258
+ html += '<div class="insight-detail-panel" id="promptInsightDetailPanel">' +
259
+ renderPromptInsightDetail(selectedPromptInsight) +
260
+ '</div>';
261
+ }
262
+
263
+ return html;
264
+ }
265
+
266
+ function renderPromptInsightsHistory() {
267
+ if (!promptInsightsHistory || promptInsightsHistory.length === 0) {
268
+ return '<div class="insights-empty-state">' +
269
+ '<i data-lucide="brain" class="w-10 h-10"></i>' +
270
+ '<p>' + t('prompt.noInsights') + '</p>' +
271
+ '<p class="insights-hint">' + t('prompt.noInsightsText') + '</p>' +
272
+ '</div>';
273
+ }
274
+
275
+ return '<div class="insights-history-cards">' +
276
+ promptInsightsHistory.map(function(insight) {
277
+ var patternCount = (insight.patterns || []).length;
278
+ var suggestionCount = (insight.suggestions || []).length;
279
+ var severity = getPromptInsightSeverity(insight.patterns);
280
+ var timeAgo = formatPromptTimestamp(insight.created_at);
281
+
282
+ return '<div class="insight-history-card ' + severity + '" onclick="showPromptInsightDetail(\'' + insight.id + '\')">' +
283
+ '<div class="insight-card-header">' +
284
+ '<div class="insight-card-tool">' +
285
+ '<i data-lucide="' + getPromptToolIcon(insight.tool) + '" class="w-4 h-4"></i>' +
286
+ '<span>' + (insight.tool || 'CLI') + '</span>' +
287
+ '</div>' +
288
+ '<div class="insight-card-time">' + timeAgo + '</div>' +
289
+ '</div>' +
290
+ '<div class="insight-card-stats">' +
291
+ '<div class="insight-stat">' +
292
+ '<span class="insight-stat-value">' + patternCount + '</span>' +
293
+ '<span class="insight-stat-label">' + (isZh() ? '模式' : 'Patterns') + '</span>' +
294
+ '</div>' +
295
+ '<div class="insight-stat">' +
296
+ '<span class="insight-stat-value">' + suggestionCount + '</span>' +
297
+ '<span class="insight-stat-label">' + (isZh() ? '建议' : 'Suggestions') + '</span>' +
298
+ '</div>' +
299
+ '<div class="insight-stat">' +
300
+ '<span class="insight-stat-value">' + (insight.prompt_count || 0) + '</span>' +
301
+ '<span class="insight-stat-label">' + (isZh() ? '提示' : 'Prompts') + '</span>' +
302
+ '</div>' +
303
+ '</div>' +
304
+ (insight.patterns && insight.patterns.length > 0 ?
305
+ '<div class="insight-card-preview">' +
306
+ '<div class="pattern-preview ' + (insight.patterns[0].severity || 'low') + '">' +
307
+ '<span class="pattern-type">' + escapeHtml(insight.patterns[0].type || 'pattern') + '</span>' +
308
+ '<span class="pattern-desc">' + escapeHtml((insight.patterns[0].description || '').substring(0, 60)) + '...</span>' +
309
+ '</div>' +
310
+ '</div>' : '') +
311
+ '</div>';
312
+ }).join('') +
313
+ '</div>';
314
+ }
315
+
316
+ function getPromptInsightSeverity(patterns) {
317
+ if (!patterns || patterns.length === 0) return 'low';
318
+ var hasHigh = patterns.some(function(p) { return p.severity === 'high'; });
319
+ var hasMedium = patterns.some(function(p) { return p.severity === 'medium'; });
320
+ return hasHigh ? 'high' : (hasMedium ? 'medium' : 'low');
321
+ }
322
+
323
+ function getPromptToolIcon(tool) {
324
+ switch(tool) {
325
+ case 'gemini': return 'sparkles';
326
+ case 'qwen': return 'bot';
327
+ case 'codex': return 'code-2';
328
+ default: return 'cpu';
329
+ }
330
+ }
331
+
332
+ function formatPromptTimestamp(timestamp) {
333
+ if (!timestamp) return '';
334
+ var date = new Date(timestamp);
335
+ var now = new Date();
336
+ var diff = now - date;
337
+ var minutes = Math.floor(diff / 60000);
338
+ var hours = Math.floor(diff / 3600000);
339
+ var days = Math.floor(diff / 86400000);
340
+
341
+ if (minutes < 1) return isZh() ? '刚刚' : 'Just now';
342
+ if (minutes < 60) return minutes + (isZh() ? ' 分钟前' : 'm ago');
343
+ if (hours < 24) return hours + (isZh() ? ' 小时前' : 'h ago');
344
+ if (days < 7) return days + (isZh() ? ' 天前' : 'd ago');
345
+ return date.toLocaleDateString();
346
+ }
347
+
348
+ async function showPromptInsightDetail(insightId) {
349
+ try {
350
+ var response = await fetch('/api/memory/insights/' + insightId);
351
+ if (!response.ok) throw new Error('Failed to load insight detail');
352
+ var data = await response.json();
353
+ selectedPromptInsight = data.insight;
354
+ renderPromptHistoryView();
355
+ } catch (err) {
356
+ console.error('Failed to load insight detail:', err);
357
+ if (window.showToast) {
358
+ showToast(isZh() ? '加载洞察详情失败' : 'Failed to load insight detail', 'error');
359
+ }
360
+ }
361
+ }
362
+
363
+ function closePromptInsightDetail() {
364
+ selectedPromptInsight = null;
365
+ renderPromptHistoryView();
366
+ }
367
+
368
+ function renderPromptInsightDetail(insight) {
369
+ if (!insight) return '';
370
+
371
+ var html = '<div class="insight-detail">' +
372
+ '<div class="insight-detail-header">' +
373
+ '<h4><i data-lucide="lightbulb" class="w-4 h-4"></i> ' + (isZh() ? '洞察详情' : 'Insight Detail') + '</h4>' +
374
+ '<button class="btn-icon" onclick="closePromptInsightDetail()" title="' + t('common.close') + '">' +
375
+ '<i data-lucide="x" class="w-4 h-4"></i>' +
376
+ '</button>' +
377
+ '</div>' +
378
+ '<div class="insight-detail-meta">' +
379
+ '<span><i data-lucide="' + getPromptToolIcon(insight.tool) + '" class="w-3 h-3"></i> ' + (insight.tool || 'CLI') + '</span>' +
380
+ '<span><i data-lucide="clock" class="w-3 h-3"></i> ' + formatPromptTimestamp(insight.created_at) + '</span>' +
381
+ '<span><i data-lucide="file-text" class="w-3 h-3"></i> ' + (insight.prompt_count || 0) + ' ' + (isZh() ? '个提示已分析' : 'prompts analyzed') + '</span>' +
382
+ '</div>';
383
+
384
+ // Patterns
385
+ if (insight.patterns && insight.patterns.length > 0) {
386
+ html += '<div class="insight-patterns">' +
387
+ '<h5><i data-lucide="alert-triangle" class="w-3.5 h-3.5"></i> ' + (isZh() ? '发现的模式' : 'Patterns Found') + ' (' + insight.patterns.length + ')</h5>' +
388
+ '<div class="patterns-list">' +
389
+ insight.patterns.map(function(p) {
390
+ return '<div class="pattern-item ' + (p.severity || 'low') + '">' +
391
+ '<div class="pattern-header">' +
392
+ '<span class="pattern-type-badge">' + escapeHtml(p.type || 'pattern') + '</span>' +
393
+ '<span class="pattern-severity">' + (p.severity || 'low') + '</span>' +
394
+ (p.occurrences ? '<span class="pattern-occurrences">' + p.occurrences + 'x</span>' : '') +
395
+ '</div>' +
396
+ '<div class="pattern-description">' + escapeHtml(p.description || '') + '</div>' +
397
+ (p.suggestion ? '<div class="pattern-suggestion"><i data-lucide="arrow-right" class="w-3 h-3"></i> ' + escapeHtml(p.suggestion) + '</div>' : '') +
398
+ '</div>';
399
+ }).join('') +
400
+ '</div>' +
401
+ '</div>';
402
+ }
403
+
404
+ // Suggestions
405
+ if (insight.suggestions && insight.suggestions.length > 0) {
406
+ html += '<div class="insight-suggestions">' +
407
+ '<h5><i data-lucide="lightbulb" class="w-3.5 h-3.5"></i> ' + (isZh() ? '提供的建议' : 'Suggestions') + ' (' + insight.suggestions.length + ')</h5>' +
408
+ '<div class="suggestions-list">' +
409
+ insight.suggestions.map(function(s) {
410
+ return '<div class="suggestion-item">' +
411
+ '<div class="suggestion-title">' + escapeHtml(s.title || '') + '</div>' +
412
+ '<div class="suggestion-description">' + escapeHtml(s.description || '') + '</div>' +
413
+ (s.example ? '<div class="suggestion-example"><code>' + escapeHtml(s.example) + '</code></div>' : '') +
414
+ '</div>';
415
+ }).join('') +
416
+ '</div>' +
417
+ '</div>';
418
+ }
419
+
420
+ html += '<div class="insight-detail-actions">' +
421
+ '<button class="btn btn-sm btn-danger" onclick="deletePromptInsight(\'' + insight.id + '\')">' +
422
+ '<i data-lucide="trash-2" class="w-3.5 h-3.5"></i> ' + t('common.delete') +
423
+ '</button>' +
424
+ '</div>' +
425
+ '</div>';
426
+
427
+ return html;
428
+ }
429
+
430
+ async function deletePromptInsight(insightId) {
431
+ if (!confirm(isZh() ? '确定要删除这条洞察记录吗?' : 'Are you sure you want to delete this insight?')) return;
432
+
433
+ try {
434
+ var response = await fetch('/api/memory/insights/' + insightId, { method: 'DELETE' });
435
+ if (!response.ok) throw new Error('Failed to delete insight');
436
+
437
+ selectedPromptInsight = null;
438
+ await loadPromptInsightsHistory();
439
+ renderPromptHistoryView();
440
+
441
+ if (window.showToast) {
442
+ showToast(isZh() ? '洞察已删除' : 'Insight deleted', 'success');
443
+ }
444
+ } catch (err) {
445
+ console.error('Failed to delete insight:', err);
446
+ if (window.showToast) {
447
+ showToast(isZh() ? '删除洞察失败' : 'Failed to delete insight', 'error');
448
+ }
449
+ }
450
+ }
451
+
452
+ function renderPatternCard(pattern) {
453
+ var iconMap = {
454
+ 'vague': 'help-circle',
455
+ 'correction': 'rotate-ccw',
456
+ 'repetitive': 'repeat',
457
+ 'incomplete': 'alert-triangle'
458
+ };
459
+ var icon = iconMap[pattern.type] || 'info';
460
+ var severityClass = pattern.severity || 'medium';
461
+
462
+ return '<div class="pattern-card pattern-' + severityClass + '">' +
463
+ '<div class="pattern-header">' +
464
+ '<i data-lucide="' + icon + '" class="w-4 h-4"></i>' +
465
+ '<span class="pattern-type">' + (pattern.type || 'Unknown') + '</span>' +
466
+ '<span class="pattern-count">' + (pattern.occurrences || 0) + 'x</span>' +
467
+ '</div>' +
468
+ '<div class="pattern-description">' + escapeHtml(pattern.description || '') + '</div>' +
469
+ '<div class="pattern-suggestion">' +
470
+ '<i data-lucide="arrow-right" class="w-3 h-3"></i> ' +
471
+ escapeHtml(pattern.suggestion || '') +
472
+ '</div>' +
473
+ '</div>';
474
+ }
475
+
476
+ function renderSuggestionCard(suggestion) {
477
+ return '<div class="suggestion-card">' +
478
+ '<div class="suggestion-title">' +
479
+ '<i data-lucide="sparkle" class="w-3.5 h-3.5"></i> ' +
480
+ escapeHtml(suggestion.title || 'Suggestion') +
481
+ '</div>' +
482
+ '<div class="suggestion-description">' + escapeHtml(suggestion.description || '') + '</div>' +
483
+ (suggestion.example ?
484
+ '<div class="suggestion-example">' +
485
+ '<div class="suggestion-example-label">Example:</div>' +
486
+ '<code>' + escapeHtml(suggestion.example) + '</code>' +
487
+ '</div>' : '') +
488
+ '</div>';
489
+ }
490
+
491
+ function renderSimilarPromptCard(prompt) {
492
+ var similarity = Math.round((prompt.similarity || 0) * 100);
493
+ var preview = prompt.text.substring(0, 80) + (prompt.text.length > 80 ? '...' : '');
494
+
495
+ return '<div class="similar-prompt-card" onclick="showPromptDetail(\'' + prompt.id + '\')">' +
496
+ '<div class="similar-prompt-header">' +
497
+ '<span class="similar-prompt-similarity">' + similarity + '% match</span>' +
498
+ '<span class="similar-prompt-intent">' + (prompt.intent || 'unknown') + '</span>' +
499
+ '</div>' +
500
+ '<div class="similar-prompt-preview">' + escapeHtml(preview) + '</div>' +
501
+ '<div class="similar-prompt-meta">' +
502
+ '<span class="similar-prompt-quality">' +
503
+ '<i data-lucide="star" class="w-3 h-3"></i> ' + (prompt.quality_score || 0) +
504
+ '</span>' +
505
+ '</div>' +
506
+ '</div>';
507
+ }
508
+
509
+ function renderProjectOptions() {
510
+ var projects = getUniqueProjects(promptHistoryData);
511
+ var html = '';
512
+ for (var i = 0; i < projects.length; i++) {
513
+ var selected = projects[i] === promptHistoryProjectFilter ? 'selected' : '';
514
+ html += '<option value="' + escapeHtml(projects[i]) + '" ' + selected + '>' +
515
+ escapeHtml(projects[i]) + '</option>';
516
+ }
517
+ return html;
518
+ }
519
+
520
+ function renderQualityBadge(score) {
521
+ if (score >= 80) return '<span class="quality-badge high">' + score + '</span>';
522
+ if (score >= 60) return '<span class="quality-badge medium">' + score + '</span>';
523
+ return '<span class="quality-badge low">' + score + '</span>';
524
+ }
525
+
526
+ // ========== Helper Functions ==========
527
+ function calculateIntentDistribution(prompts) {
528
+ var distribution = {};
529
+ for (var i = 0; i < prompts.length; i++) {
530
+ var intent = prompts[i].intent || 'unknown';
531
+ distribution[intent] = (distribution[intent] || 0) + 1;
532
+ }
533
+
534
+ var result = [];
535
+ for (var key in distribution) {
536
+ result.push({ intent: key, count: distribution[key] });
537
+ }
538
+ result.sort(function(a, b) { return b.count - a.count; });
539
+ return result;
540
+ }
541
+
542
+ function calculateAverageLength(prompts) {
543
+ if (prompts.length === 0) return 0;
544
+ var total = 0;
545
+ for (var i = 0; i < prompts.length; i++) {
546
+ total += (prompts[i].text || '').length;
547
+ }
548
+ return Math.round(total / prompts.length);
549
+ }
550
+
551
+ function calculateQualityDistribution(prompts) {
552
+ if (prompts.length === 0) return { average: 0, distribution: {} };
553
+
554
+ var total = 0;
555
+ var distribution = { high: 0, medium: 0, low: 0 };
556
+
557
+ for (var i = 0; i < prompts.length; i++) {
558
+ var score = prompts[i].quality_score || 0;
559
+ total += score;
560
+
561
+ if (score >= 80) distribution.high++;
562
+ else if (score >= 60) distribution.medium++;
563
+ else distribution.low++;
564
+ }
565
+
566
+ return {
567
+ average: Math.round(total / prompts.length),
568
+ distribution: distribution
569
+ };
570
+ }
571
+
572
+ function getQualityClass(score) {
573
+ if (score >= 80) return 'quality-high';
574
+ if (score >= 60) return 'quality-medium';
575
+ return 'quality-low';
576
+ }
577
+
578
+ function filterPrompts(prompts) {
579
+ return prompts.filter(function(prompt) {
580
+ var matchesSearch = !promptHistorySearch ||
581
+ prompt.text.toLowerCase().includes(promptHistorySearch.toLowerCase());
582
+ var matchesProject = !promptHistoryProjectFilter ||
583
+ prompt.project === promptHistoryProjectFilter;
584
+ var matchesDate = !promptHistoryDateFilter ||
585
+ isSameDay(new Date(prompt.timestamp), promptHistoryDateFilter);
586
+
587
+ return matchesSearch && matchesProject && matchesDate;
588
+ });
589
+ }
590
+
591
+ function groupPromptsBySession(prompts) {
592
+ var grouped = {};
593
+ for (var i = 0; i < prompts.length; i++) {
594
+ var sessionId = prompts[i].session_id || 'unknown';
595
+ if (!grouped[sessionId]) grouped[sessionId] = [];
596
+ grouped[sessionId].push(prompts[i]);
597
+ }
598
+ return grouped;
599
+ }
600
+
601
+ function getUniqueProjects(prompts) {
602
+ var projects = {};
603
+ for (var i = 0; i < prompts.length; i++) {
604
+ if (prompts[i].project) projects[prompts[i].project] = true;
605
+ }
606
+ return Object.keys(projects).sort();
607
+ }
608
+
609
+ function isSameDay(date1, date2) {
610
+ return date1.getFullYear() === date2.getFullYear() &&
611
+ date1.getMonth() === date2.getMonth() &&
612
+ date1.getDate() === date2.getDate();
613
+ }
614
+
615
+ // ========== Actions ==========
616
+ function searchPrompts(query) {
617
+ promptHistorySearch = query;
618
+ renderPromptHistoryView();
619
+ }
620
+
621
+ function filterByProject(project) {
622
+ promptHistoryProjectFilter = project || null;
623
+ renderPromptHistoryView();
624
+ }
625
+
626
+ function togglePromptExpand(promptId) {
627
+ if (selectedPromptId === promptId) {
628
+ selectedPromptId = null;
629
+ } else {
630
+ selectedPromptId = promptId;
631
+ }
632
+ renderPromptHistoryView();
633
+ }
634
+
635
+ function copyPrompt(promptId) {
636
+ var prompt = promptHistoryData.find(function(p) { return p.id === promptId; });
637
+ if (!prompt) return;
638
+
639
+ if (navigator.clipboard) {
640
+ navigator.clipboard.writeText(prompt.text).then(function() {
641
+ showRefreshToast('Prompt copied to clipboard', 'success');
642
+ }).catch(function() {
643
+ showRefreshToast('Failed to copy prompt', 'error');
644
+ });
645
+ }
646
+ }
647
+
648
+
649
+ function showPromptDetail(promptId) {
650
+ togglePromptExpand(promptId);
651
+ }
652
+
653
+ async function refreshPromptHistory() {
654
+ await Promise.all([loadPromptHistory(), loadPromptInsights()]);
655
+ renderPromptHistoryView();
656
+ showRefreshToast('Prompt history refreshed', 'success');
657
+ }
658
+
659
+ // ========== CLI-based Insights Analysis ==========
660
+ async function triggerCliInsightsAnalysis() {
661
+ if (promptHistoryData.length === 0) {
662
+ showRefreshToast(t('prompt.noPromptsFound'), 'error');
663
+ return;
664
+ }
665
+
666
+ var toolSelect = document.getElementById('insightsTool');
667
+ var tool = toolSelect ? toolSelect.value : 'gemini';
668
+ var analyzeBtn = document.getElementById('analyzeBtn');
669
+
670
+ // Show loading state
671
+ window.insightsAnalyzing = true;
672
+ if (analyzeBtn) {
673
+ analyzeBtn.disabled = true;
674
+ analyzeBtn.innerHTML = '<i data-lucide="loader-2" class="w-3.5 h-3.5 animate-spin"></i> ' + t('prompt.analyzing');
675
+ }
676
+ renderPromptHistoryView();
677
+
678
+ try {
679
+ var response = await fetch('/api/memory/insights/analyze', {
680
+ method: 'POST',
681
+ headers: { 'Content-Type': 'application/json' },
682
+ body: JSON.stringify({
683
+ path: projectPath,
684
+ tool: tool,
685
+ lang: getLang(), // Send current language preference
686
+ prompts: promptHistoryData.slice(0, 50) // Send top 50 prompts for analysis
687
+ })
688
+ });
689
+
690
+ var data = await response.json();
691
+
692
+ if (data.error) {
693
+ throw new Error(data.error);
694
+ }
695
+
696
+ // Update insights with CLI analysis results
697
+ if (data.insights) {
698
+ promptInsights = data.insights;
699
+ console.log('[PromptHistory] Insights parsed:', promptInsights);
700
+ }
701
+
702
+ // Reload insights history to show the new analysis result
703
+ await loadPromptInsightsHistory();
704
+
705
+ showRefreshToast(t('toast.completed') + ' (' + tool + ')', 'success');
706
+ } catch (err) {
707
+ console.error('CLI insights analysis failed:', err);
708
+ showRefreshToast(t('prompt.insightsError') + ': ' + err.message, 'error');
709
+ } finally {
710
+ window.insightsAnalyzing = false;
711
+ renderPromptHistoryView();
712
+ }
713
+ }