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
@@ -11,10 +11,11 @@ async function renderHookManager() {
11
11
  if (statsGrid) statsGrid.style.display = 'none';
12
12
  if (searchInput) searchInput.parentElement.style.display = 'none';
13
13
 
14
- // Load hook config if not already loaded
15
- if (!hookConfig.global.hooks && !hookConfig.project.hooks) {
16
- await loadHookConfig();
17
- }
14
+ // Always reload hook config and available skills to get latest data
15
+ await Promise.all([
16
+ loadHookConfig(),
17
+ loadAvailableSkills()
18
+ ]);
18
19
 
19
20
  const globalHooks = hookConfig.global?.hooks || {};
20
21
  const projectHooks = hookConfig.project?.hooks || {};
@@ -29,21 +30,21 @@ async function renderHookManager() {
29
30
  <div class="hook-section mb-6">
30
31
  <div class="flex items-center justify-between mb-4">
31
32
  <div class="flex items-center gap-3">
32
- <h3 class="text-lg font-semibold text-foreground">Project Hooks</h3>
33
- <span class="badge px-2 py-0.5 text-xs font-semibold rounded-full bg-primary-light text-primary">.claude/settings.json</span>
33
+ <h3 class="text-lg font-semibold text-foreground">${t('hook.projectHooks')}</h3>
34
+ <span class="badge px-2 py-0.5 text-xs font-semibold rounded-full bg-primary-light text-primary">${t('hook.projectFile')}</span>
34
35
  <button class="px-3 py-1.5 text-sm bg-primary text-primary-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1"
35
36
  onclick="openHookCreateModal()">
36
- <span>+</span> New Hook
37
+ <span>+</span> ${t('hook.newHook')}
37
38
  </button>
38
39
  </div>
39
- <span class="text-sm text-muted-foreground">${projectHookCount} hooks configured</span>
40
+ <span class="text-sm text-muted-foreground">${projectHookCount} ${t('hook.hooksConfigured')}</span>
40
41
  </div>
41
42
 
42
43
  ${projectHookCount === 0 ? `
43
44
  <div class="hook-empty-state bg-card border border-border rounded-lg p-6 text-center">
44
45
  <div class="text-muted-foreground mb-3"><i data-lucide="webhook" class="w-10 h-10 mx-auto"></i></div>
45
- <p class="text-muted-foreground">No hooks configured for this project</p>
46
- <p class="text-sm text-muted-foreground mt-1">Create a hook to automate actions on tool usage</p>
46
+ <p class="text-muted-foreground">${t('empty.noHooks')}</p>
47
+ <p class="text-sm text-muted-foreground mt-1">${t('empty.createHookHint')}</p>
47
48
  </div>
48
49
  ` : `
49
50
  <div class="hook-grid grid gap-3">
@@ -56,16 +57,16 @@ async function renderHookManager() {
56
57
  <div class="hook-section mb-6">
57
58
  <div class="flex items-center justify-between mb-4">
58
59
  <div class="flex items-center gap-3">
59
- <h3 class="text-lg font-semibold text-foreground">Global Hooks</h3>
60
- <span class="badge px-2 py-0.5 text-xs font-semibold rounded-full bg-muted text-muted-foreground">~/.claude/settings.json</span>
60
+ <h3 class="text-lg font-semibold text-foreground">${t('hook.globalHooks')}</h3>
61
+ <span class="badge px-2 py-0.5 text-xs font-semibold rounded-full bg-muted text-muted-foreground">${t('hook.globalFile')}</span>
61
62
  </div>
62
- <span class="text-sm text-muted-foreground">${globalHookCount} hooks configured</span>
63
+ <span class="text-sm text-muted-foreground">${globalHookCount} ${t('hook.hooksConfigured')}</span>
63
64
  </div>
64
65
 
65
66
  ${globalHookCount === 0 ? `
66
67
  <div class="hook-empty-state bg-card border border-border rounded-lg p-6 text-center">
67
- <p class="text-muted-foreground">No global hooks configured</p>
68
- <p class="text-sm text-muted-foreground mt-1">Global hooks apply to all Claude Code sessions</p>
68
+ <p class="text-muted-foreground">${t('empty.noGlobalHooks')}</p>
69
+ <p class="text-sm text-muted-foreground mt-1">${t('empty.globalHooksHint')}</p>
69
70
  </div>
70
71
  ` : `
71
72
  <div class="hook-grid grid gap-3">
@@ -74,25 +75,44 @@ async function renderHookManager() {
74
75
  `}
75
76
  </div>
76
77
 
78
+ <!-- Hook Wizards -->
79
+ <div class="hook-section mb-6">
80
+ <div class="flex items-center justify-between mb-4">
81
+ <div class="flex items-center gap-3">
82
+ <h3 class="text-lg font-semibold text-foreground">${t('hook.wizards')}</h3>
83
+ <span class="badge px-2 py-0.5 text-xs font-semibold rounded-full bg-success/20 text-success">${t('hook.guidedSetup')}</span>
84
+ </div>
85
+ <span class="text-sm text-muted-foreground">${t('hook.wizardsDesc')}</span>
86
+ </div>
87
+
88
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
89
+ ${renderWizardCard('memory-update')}
90
+ ${renderWizardCard('memory-setup')}
91
+ ${renderWizardCard('skill-context')}
92
+ </div>
93
+ </div>
94
+
77
95
  <!-- Quick Install Templates -->
78
96
  <div class="hook-section">
79
97
  <div class="flex items-center justify-between mb-4">
80
- <h3 class="text-lg font-semibold text-foreground">Quick Install Templates</h3>
81
- <span class="text-sm text-muted-foreground">One-click hook installation</span>
98
+ <h3 class="text-lg font-semibold text-foreground">${t('hook.quickInstall')}</h3>
99
+ <span class="text-sm text-muted-foreground">${t('hook.oneClick')}</span>
82
100
  </div>
83
101
 
84
102
  <div class="hook-templates-grid grid grid-cols-1 md:grid-cols-2 gap-4">
85
- ${renderQuickInstallCard('ccw-notify', 'CCW Dashboard Notify', 'Notify CCW dashboard when files are written', 'PostToolUse', 'Write')}
86
- ${renderQuickInstallCard('log-tool', 'Tool Usage Logger', 'Log all tool executions to a file', 'PostToolUse', 'All')}
87
- ${renderQuickInstallCard('lint-check', 'Auto Lint Check', 'Run ESLint on JavaScript/TypeScript files after write', 'PostToolUse', 'Write')}
88
- ${renderQuickInstallCard('git-add', 'Auto Git Stage', 'Automatically stage written files to git', 'PostToolUse', 'Write')}
103
+ ${renderQuickInstallCard('session-context', t('hook.tpl.sessionContext'), t('hook.tpl.sessionContextDesc'), 'UserPromptSubmit', '')}
104
+ ${renderQuickInstallCard('codexlens-update', t('hook.tpl.codexlensSync'), t('hook.tpl.codexlensSyncDesc'), 'PostToolUse', 'Write|Edit')}
105
+ ${renderQuickInstallCard('ccw-notify', t('hook.tpl.ccwDashboardNotify'), t('hook.tpl.ccwDashboardNotifyDesc'), 'PostToolUse', 'Write')}
106
+ ${renderQuickInstallCard('log-tool', t('hook.tpl.toolLogger'), t('hook.tpl.toolLoggerDesc'), 'PostToolUse', 'All')}
107
+ ${renderQuickInstallCard('lint-check', t('hook.tpl.autoLint'), t('hook.tpl.autoLintDesc'), 'PostToolUse', 'Write')}
108
+ ${renderQuickInstallCard('git-add', t('hook.tpl.autoGitStage'), t('hook.tpl.autoGitStageDesc'), 'PostToolUse', 'Write')}
89
109
  </div>
90
110
  </div>
91
111
 
92
112
  <!-- Hook Environment Variables Reference -->
93
113
  <div class="hook-section mt-6">
94
114
  <div class="flex items-center justify-between mb-4">
95
- <h3 class="text-lg font-semibold text-foreground">Environment Variables Reference</h3>
115
+ <h3 class="text-lg font-semibold text-foreground">${t('hook.envVarsRef')}</h3>
96
116
  </div>
97
117
 
98
118
  <div class="bg-card border border-border rounded-lg p-4">
@@ -100,29 +120,29 @@ async function renderHookManager() {
100
120
  <div class="space-y-2">
101
121
  <div class="flex items-start gap-2">
102
122
  <code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_FILE_PATHS</code>
103
- <span class="text-muted-foreground">Space-separated file paths affected</span>
123
+ <span class="text-muted-foreground">${t('hook.filePaths')}</span>
104
124
  </div>
105
125
  <div class="flex items-start gap-2">
106
126
  <code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_TOOL_NAME</code>
107
- <span class="text-muted-foreground">Name of the tool being executed</span>
127
+ <span class="text-muted-foreground">${t('hook.toolName')}</span>
108
128
  </div>
109
129
  <div class="flex items-start gap-2">
110
130
  <code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_TOOL_INPUT</code>
111
- <span class="text-muted-foreground">JSON input passed to the tool</span>
131
+ <span class="text-muted-foreground">${t('hook.toolInput')}</span>
112
132
  </div>
113
133
  </div>
114
134
  <div class="space-y-2">
115
135
  <div class="flex items-start gap-2">
116
136
  <code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_SESSION_ID</code>
117
- <span class="text-muted-foreground">Current Claude session ID</span>
137
+ <span class="text-muted-foreground">${t('hook.sessionId')}</span>
118
138
  </div>
119
139
  <div class="flex items-start gap-2">
120
140
  <code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_PROJECT_DIR</code>
121
- <span class="text-muted-foreground">Current project directory path</span>
141
+ <span class="text-muted-foreground">${t('hook.projectDir')}</span>
122
142
  </div>
123
143
  <div class="flex items-start gap-2">
124
144
  <code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_WORKING_DIR</code>
125
- <span class="text-muted-foreground">Current working directory</span>
145
+ <span class="text-muted-foreground">${t('hook.workingDir')}</span>
126
146
  </div>
127
147
  </div>
128
148
  </div>
@@ -133,9 +153,164 @@ async function renderHookManager() {
133
153
 
134
154
  // Attach event listeners
135
155
  attachHookEventListeners();
136
-
156
+
137
157
  // Initialize Lucide icons
138
158
  if (typeof lucide !== 'undefined') lucide.createIcons();
159
+
160
+ // Load available SKILLs for skill-context wizard
161
+ loadAvailableSkills();
162
+ }
163
+
164
+ // Load available SKILLs for skill-context wizard
165
+ async function loadAvailableSkills() {
166
+ try {
167
+ const response = await fetch(`/api/skills?path=${encodeURIComponent(projectPath)}`);
168
+ if (!response.ok) throw new Error('Failed to load skills');
169
+ const data = await response.json();
170
+
171
+ const container = document.getElementById('skill-discovery-skill-context');
172
+ if (container && data.skills) {
173
+ if (data.skills.length === 0) {
174
+ container.innerHTML = `
175
+ <span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.availableSkills')}</span>
176
+ <span class="text-muted-foreground ml-2">${t('hook.wizard.noSkillsFound').split('.')[0]}</span>
177
+ `;
178
+ } else {
179
+ const skillBadges = data.skills.map(skill => `
180
+ <span class="px-2 py-0.5 bg-emerald-500/10 text-emerald-500 rounded" title="${escapeHtml(skill.description)}">${escapeHtml(skill.name)}</span>
181
+ `).join('');
182
+ container.innerHTML = `
183
+ <span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.availableSkills')}</span>
184
+ <div class="flex flex-wrap gap-1 mt-1">${skillBadges}</div>
185
+ `;
186
+ }
187
+ }
188
+
189
+ // Store skills for wizard use
190
+ window.availableSkills = data.skills || [];
191
+ } catch (err) {
192
+ console.error('Failed to load skills:', err);
193
+ const container = document.getElementById('skill-discovery-skill-context');
194
+ if (container) {
195
+ container.innerHTML = `
196
+ <span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.availableSkills')}</span>
197
+ <span class="text-destructive ml-2">${t('toast.loadFailed', { error: err.message })}</span>
198
+ `;
199
+ }
200
+ }
201
+ }
202
+
203
+ // Call loadAvailableSkills after rendering hook manager
204
+ const originalRenderHookManager = typeof renderHookManager === 'function' ? renderHookManager : null;
205
+
206
+ function renderWizardCard(wizardId) {
207
+ const wizard = WIZARD_TEMPLATES[wizardId];
208
+ if (!wizard) return '';
209
+
210
+ // Get translated wizard name and description
211
+ const wizardName = wizardId === 'memory-update' ? t('hook.wizard.memoryUpdate') :
212
+ wizardId === 'memory-setup' ? t('hook.wizard.memorySetup') :
213
+ wizardId === 'skill-context' ? t('hook.wizard.skillContext') : wizard.name;
214
+ const wizardDesc = wizardId === 'memory-update' ? t('hook.wizard.memoryUpdateDesc') :
215
+ wizardId === 'memory-setup' ? t('hook.wizard.memorySetupDesc') :
216
+ wizardId === 'skill-context' ? t('hook.wizard.skillContextDesc') : wizard.description;
217
+
218
+ // Translate options
219
+ const getOptionName = (wizardId, optId) => {
220
+ if (wizardId === 'memory-update') {
221
+ if (optId === 'on-stop') return t('hook.wizard.onSessionEnd');
222
+ if (optId === 'periodic') return t('hook.wizard.periodicUpdate');
223
+ if (optId === 'count-based') return t('hook.wizard.countBasedUpdate');
224
+ }
225
+ if (wizardId === 'memory-setup') {
226
+ if (optId === 'file-read') return t('hook.wizard.fileReadTracker');
227
+ if (optId === 'file-write') return t('hook.wizard.fileWriteTracker');
228
+ if (optId === 'prompts') return t('hook.wizard.promptTracker');
229
+ }
230
+ if (wizardId === 'skill-context') {
231
+ if (optId === 'keyword') return t('hook.wizard.keywordMatching');
232
+ if (optId === 'auto') return t('hook.wizard.autoDetection');
233
+ }
234
+ return wizard.options.find(o => o.id === optId)?.name || '';
235
+ };
236
+
237
+ const getOptionDesc = (wizardId, optId) => {
238
+ if (wizardId === 'memory-update') {
239
+ if (optId === 'on-stop') return t('hook.wizard.onSessionEndDesc');
240
+ if (optId === 'periodic') return t('hook.wizard.periodicUpdateDesc');
241
+ if (optId === 'count-based') return t('hook.wizard.countBasedUpdateDesc');
242
+ }
243
+ if (wizardId === 'memory-setup') {
244
+ if (optId === 'file-read') return t('hook.wizard.fileReadTrackerDesc');
245
+ if (optId === 'file-write') return t('hook.wizard.fileWriteTrackerDesc');
246
+ if (optId === 'prompts') return t('hook.wizard.promptTrackerDesc');
247
+ }
248
+ if (wizardId === 'skill-context') {
249
+ if (optId === 'keyword') return t('hook.wizard.keywordMatchingDesc');
250
+ if (optId === 'auto') return t('hook.wizard.autoDetectionDesc');
251
+ }
252
+ return wizard.options.find(o => o.id === optId)?.description || '';
253
+ };
254
+
255
+ // Determine what to show in the tools/skills section
256
+ let toolsSection = '';
257
+ if (wizard.requiresSkillDiscovery) {
258
+ toolsSection = `
259
+ <div class="flex items-center gap-2 text-xs text-muted-foreground mb-4">
260
+ <span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.event')}</span>
261
+ <span class="px-2 py-0.5 bg-amber-500/10 text-amber-500 rounded">UserPromptSubmit</span>
262
+ </div>
263
+ <div id="skill-discovery-${wizardId}" class="text-xs text-muted-foreground mb-4">
264
+ <span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.availableSkills')}</span>
265
+ <span class="text-muted-foreground ml-2">${t('hook.wizard.loading')}</span>
266
+ </div>
267
+ `;
268
+ } else if (wizard.multiSelect) {
269
+ // memory-setup: lightweight tracking, no CLI tools
270
+ toolsSection = '';
271
+ } else {
272
+ toolsSection = `
273
+ <div class="flex items-center gap-2 text-xs text-muted-foreground mb-4">
274
+ <span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.cliTools')}</span>
275
+ <span class="px-2 py-0.5 bg-blue-500/10 text-blue-500 rounded">gemini</span>
276
+ <span class="px-2 py-0.5 bg-purple-500/10 text-purple-500 rounded">qwen</span>
277
+ <span class="px-2 py-0.5 bg-green-500/10 text-green-500 rounded">codex</span>
278
+ </div>
279
+ `;
280
+ }
281
+
282
+ return `
283
+ <div class="hook-wizard-card bg-gradient-to-br from-primary/5 to-primary/10 border border-primary/20 rounded-lg p-5 hover:shadow-lg transition-all">
284
+ <div class="flex items-start justify-between mb-4">
285
+ <div class="flex items-center gap-3">
286
+ <div class="p-2.5 bg-primary/10 rounded-lg">
287
+ <i data-lucide="${wizard.icon}" class="w-6 h-6 text-primary"></i>
288
+ </div>
289
+ <div>
290
+ <h4 class="font-semibold text-foreground">${escapeHtml(wizardName)}</h4>
291
+ <p class="text-sm text-muted-foreground">${escapeHtml(wizardDesc)}</p>
292
+ </div>
293
+ </div>
294
+ </div>
295
+
296
+ <div class="space-y-2 mb-4">
297
+ ${wizard.options.map(opt => `
298
+ <div class="flex items-center gap-2 text-sm text-muted-foreground">
299
+ <i data-lucide="check" class="w-4 h-4 text-success"></i>
300
+ <span>${escapeHtml(getOptionName(wizardId, opt.id))}: ${escapeHtml(getOptionDesc(wizardId, opt.id))}</span>
301
+ </div>
302
+ `).join('')}
303
+ </div>
304
+
305
+ ${toolsSection}
306
+
307
+ <button class="w-full px-4 py-2.5 text-sm bg-primary text-primary-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center justify-center gap-2"
308
+ onclick="openHookWizardModal('${wizardId}')">
309
+ <i data-lucide="wand-2" class="w-4 h-4"></i>
310
+ ${t('hook.openWizard')}
311
+ </button>
312
+ </div>
313
+ `;
139
314
  }
140
315
 
141
316
  function countHooks(hooks) {
@@ -156,8 +331,10 @@ function renderHooksByEvent(hooks, scope) {
156
331
 
157
332
  return hookList.map((hook, index) => {
158
333
  const matcher = hook.matcher || 'All tools';
159
- const command = hook.command || 'N/A';
334
+ // Support both old format (hook.command) and new Claude Code format (hook.hooks[0].command)
335
+ const command = hook.hooks?.[0]?.command || hook.command || 'N/A';
160
336
  const args = hook.args || [];
337
+ const timeout = hook.hooks?.[0]?.timeout || hook.timeout;
161
338
 
162
339
  return `
163
340
  <div class="hook-card bg-card border border-border rounded-lg p-4 hover:shadow-md transition-all">
@@ -194,9 +371,9 @@ function renderHooksByEvent(hooks, scope) {
194
371
  <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">matcher</span>
195
372
  <span class="text-muted-foreground">${escapeHtml(matcher)}</span>
196
373
  </div>
197
- <div class="flex items-center gap-2">
374
+ <div class="flex items-start gap-2">
198
375
  <span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">command</span>
199
- <span class="font-mono text-xs text-foreground">${escapeHtml(command)}</span>
376
+ <span class="font-mono text-xs text-foreground break-all line-clamp-3 overflow-hidden" title="${escapeHtml(command)}">${escapeHtml(command)}</span>
200
377
  </div>
201
378
  ${args.length > 0 ? `
202
379
  <div class="flex items-start gap-2">
@@ -213,6 +390,9 @@ function renderHooksByEvent(hooks, scope) {
213
390
 
214
391
  function renderQuickInstallCard(templateId, title, description, event, matcher) {
215
392
  const isInstalled = isHookTemplateInstalled(templateId);
393
+ const template = HOOK_TEMPLATES[templateId];
394
+ const category = template?.category || 'general';
395
+ const categoryTranslated = t(`hook.category.${category}`) || category;
216
396
 
217
397
  return `
218
398
  <div class="hook-template-card bg-card border border-border rounded-lg p-4 hover:shadow-md transition-all ${isInstalled ? 'border-success bg-success-light/30' : ''}">
@@ -224,6 +404,11 @@ function renderQuickInstallCard(templateId, title, description, event, matcher)
224
404
  <p class="text-xs text-muted-foreground">${escapeHtml(description)}</p>
225
405
  </div>
226
406
  </div>
407
+ <button class="p-1.5 text-muted-foreground hover:text-foreground hover:bg-hover rounded transition-colors"
408
+ onclick="viewTemplateDetails('${templateId}')"
409
+ title="${t('hook.viewDetails')}">
410
+ <i data-lucide="eye" class="w-4 h-4"></i>
411
+ </button>
227
412
  </div>
228
413
 
229
414
  <div class="hook-template-meta text-xs text-muted-foreground mb-3 flex items-center gap-3">
@@ -231,8 +416,9 @@ function renderQuickInstallCard(templateId, title, description, event, matcher)
231
416
  <span class="font-mono bg-muted px-1 py-0.5 rounded">${event}</span>
232
417
  </span>
233
418
  <span class="flex items-center gap-1">
234
- Matches: <span class="font-medium">${matcher}</span>
419
+ ${t('hook.wizard.matches')} <span class="font-medium">${matcher}</span>
235
420
  </span>
421
+ <span class="px-1.5 py-0.5 bg-primary/10 text-primary rounded text-xs">${categoryTranslated}</span>
236
422
  </div>
237
423
 
238
424
  <div class="flex items-center gap-2">
@@ -240,18 +426,18 @@ function renderQuickInstallCard(templateId, title, description, event, matcher)
240
426
  <button class="flex-1 px-3 py-1.5 text-sm bg-destructive/10 text-destructive rounded hover:bg-destructive/20 transition-colors"
241
427
  data-template="${templateId}"
242
428
  data-action="uninstall">
243
- Uninstall
429
+ ${t('hook.uninstall')}
244
430
  </button>
245
431
  ` : `
246
432
  <button class="flex-1 px-3 py-1.5 text-sm bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity"
247
433
  data-template="${templateId}"
248
434
  data-action="install-project">
249
- Install (Project)
435
+ ${t('hook.installProject')}
250
436
  </button>
251
437
  <button class="px-3 py-1.5 text-sm bg-muted text-foreground rounded hover:bg-hover transition-colors"
252
438
  data-template="${templateId}"
253
439
  data-action="install-global">
254
- Global
440
+ ${t('hook.installGlobal')}
255
441
  </button>
256
442
  `}
257
443
  </div>
@@ -263,18 +449,43 @@ function isHookTemplateInstalled(templateId) {
263
449
  const template = HOOK_TEMPLATES[templateId];
264
450
  if (!template) return false;
265
451
 
452
+ // Define unique patterns for each template type (more specific than just command)
453
+ const uniquePatterns = {
454
+ 'session-context': 'hook session-context',
455
+ 'codexlens-update': 'codexlens update',
456
+ 'ccw-notify': 'api/hook',
457
+ 'log-tool': 'tool-usage.log',
458
+ 'lint-check': 'eslint',
459
+ 'git-add': 'git add',
460
+ 'memory-file-read': 'memory track --type file --action read',
461
+ 'memory-file-write': 'memory track --type file --action write',
462
+ 'memory-prompt-track': 'memory track --type topic',
463
+ 'skill-context-auto': 'skill-context-auto'
464
+ };
465
+
466
+ // Use unique pattern if defined, otherwise fall back to command + args
467
+ const searchPattern = uniquePatterns[templateId] ||
468
+ (template.command + (template.args ? ' ' + template.args.join(' ') : ''));
469
+
266
470
  // Check project hooks
267
471
  const projectHooks = hookConfig.project?.hooks?.[template.event];
268
472
  if (projectHooks) {
269
473
  const hookList = Array.isArray(projectHooks) ? projectHooks : [projectHooks];
270
- if (hookList.some(h => h.command === template.command)) return true;
474
+ if (hookList.some(h => {
475
+ // Check both old format (h.command) and new format (h.hooks[0].command)
476
+ const cmd = h.hooks?.[0]?.command || h.command || '';
477
+ return cmd.includes(searchPattern);
478
+ })) return true;
271
479
  }
272
480
 
273
481
  // Check global hooks
274
482
  const globalHooks = hookConfig.global?.hooks?.[template.event];
275
483
  if (globalHooks) {
276
484
  const hookList = Array.isArray(globalHooks) ? globalHooks : [globalHooks];
277
- if (hookList.some(h => h.command === template.command)) return true;
485
+ if (hookList.some(h => {
486
+ const cmd = h.hooks?.[0]?.command || h.command || '';
487
+ return cmd.includes(searchPattern);
488
+ })) return true;
278
489
  }
279
490
 
280
491
  return false;
@@ -287,6 +498,12 @@ async function installHookTemplate(templateId, scope) {
287
498
  return;
288
499
  }
289
500
 
501
+ // Check if already installed
502
+ if (isHookTemplateInstalled(templateId)) {
503
+ showRefreshToast('Hook already installed', 'info');
504
+ return;
505
+ }
506
+
290
507
  const hookData = {
291
508
  command: template.command,
292
509
  args: template.args
@@ -303,11 +520,37 @@ async function uninstallHookTemplate(templateId) {
303
520
  const template = HOOK_TEMPLATES[templateId];
304
521
  if (!template) return;
305
522
 
523
+ // Extract unique identifier from template args for matching
524
+ // Template args format: ['-c', 'actual command...']
525
+ const templateArgs = template.args || [];
526
+ const templateFullCmd = templateArgs.length > 0 ? templateArgs.join(' ') : '';
527
+
528
+ // Define unique patterns for each template type
529
+ const uniquePatterns = {
530
+ 'session-context': 'hook session-context',
531
+ 'codexlens-update': 'codexlens update',
532
+ 'ccw-notify': 'api/hook',
533
+ 'log-tool': 'tool-usage.log',
534
+ 'lint-check': 'eslint',
535
+ 'git-add': 'git add',
536
+ 'memory-file-read': 'memory track',
537
+ 'memory-file-write': 'memory track',
538
+ 'memory-prompt-track': 'memory track'
539
+ };
540
+
541
+ const uniquePattern = uniquePatterns[templateId] || template.command;
542
+
543
+ // Helper to check if a hook matches the template
544
+ const matchesTemplate = (h) => {
545
+ const hookCmd = h.hooks?.[0]?.command || h.command || '';
546
+ return hookCmd.includes(uniquePattern);
547
+ };
548
+
306
549
  // Find and remove from project hooks
307
550
  const projectHooks = hookConfig.project?.hooks?.[template.event];
308
551
  if (projectHooks) {
309
552
  const hookList = Array.isArray(projectHooks) ? projectHooks : [projectHooks];
310
- const index = hookList.findIndex(h => h.command === template.command);
553
+ const index = hookList.findIndex(matchesTemplate);
311
554
  if (index !== -1) {
312
555
  await removeHook('project', template.event, index);
313
556
  return;
@@ -318,12 +561,14 @@ async function uninstallHookTemplate(templateId) {
318
561
  const globalHooks = hookConfig.global?.hooks?.[template.event];
319
562
  if (globalHooks) {
320
563
  const hookList = Array.isArray(globalHooks) ? globalHooks : [globalHooks];
321
- const index = hookList.findIndex(h => h.command === template.command);
564
+ const index = hookList.findIndex(matchesTemplate);
322
565
  if (index !== -1) {
323
566
  await removeHook('global', template.event, index);
324
567
  return;
325
568
  }
326
569
  }
570
+
571
+ showRefreshToast('Hook not found', 'error');
327
572
  }
328
573
 
329
574
  function attachHookEventListeners() {
@@ -340,13 +585,36 @@ function attachHookEventListeners() {
340
585
  const hook = hookList[index];
341
586
 
342
587
  if (hook) {
588
+ // Support both Claude Code format (hooks[0].command) and legacy format (command + args)
589
+ let command = '';
590
+ let args = [];
591
+
592
+ if (hook.hooks && hook.hooks[0]) {
593
+ // Claude Code format: { hooks: [{ type: "command", command: "bash -c '...'" }] }
594
+ const fullCommand = hook.hooks[0].command || '';
595
+ // Try to split command and args for bash -c commands
596
+ const bashMatch = fullCommand.match(/^(bash|sh|cmd)\s+(-c)\s+(.+)$/s);
597
+ if (bashMatch) {
598
+ command = bashMatch[1];
599
+ args = [bashMatch[2], bashMatch[3]];
600
+ } else {
601
+ // For other commands, put the whole thing as command
602
+ command = fullCommand;
603
+ args = [];
604
+ }
605
+ } else {
606
+ // Legacy format: { command: "bash", args: ["-c", "..."] }
607
+ command = hook.command || '';
608
+ args = hook.args || [];
609
+ }
610
+
343
611
  openHookCreateModal({
344
612
  scope: scope,
345
613
  event: event,
346
614
  index: index,
347
615
  matcher: hook.matcher || '',
348
- command: hook.command,
349
- args: hook.args || []
616
+ command: command,
617
+ args: args
350
618
  });
351
619
  }
352
620
  });
@@ -360,7 +628,7 @@ function attachHookEventListeners() {
360
628
  const event = button.dataset.event;
361
629
  const index = parseInt(button.dataset.index);
362
630
 
363
- if (confirm(`Remove this ${event} hook?`)) {
631
+ if (confirm(t('hook.deleteConfirm', { event: event }))) {
364
632
  await removeHook(scope, event, index);
365
633
  }
366
634
  });