claude-code-workflow 6.2.2 → 6.2.4

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 (346) hide show
  1. package/ccw/dist/cli.d.ts +2 -0
  2. package/ccw/dist/cli.d.ts.map +1 -0
  3. package/ccw/dist/cli.js +219 -0
  4. package/ccw/dist/cli.js.map +1 -0
  5. package/ccw/dist/commands/cli.d.ts +32 -0
  6. package/ccw/dist/commands/cli.d.ts.map +1 -0
  7. package/ccw/dist/commands/cli.js +619 -0
  8. package/ccw/dist/commands/cli.js.map +1 -0
  9. package/ccw/dist/commands/core-memory.d.ts +32 -0
  10. package/ccw/dist/commands/core-memory.d.ts.map +1 -0
  11. package/ccw/dist/commands/core-memory.js +640 -0
  12. package/ccw/dist/commands/core-memory.js.map +1 -0
  13. package/ccw/dist/commands/hook.d.ts +16 -0
  14. package/ccw/dist/commands/hook.d.ts.map +1 -0
  15. package/ccw/dist/commands/hook.js +276 -0
  16. package/ccw/dist/commands/hook.js.map +1 -0
  17. package/ccw/dist/commands/install.d.ts +12 -0
  18. package/ccw/dist/commands/install.d.ts.map +1 -0
  19. package/ccw/dist/commands/install.js +443 -0
  20. package/ccw/dist/commands/install.js.map +1 -0
  21. package/ccw/dist/commands/list.d.ts +5 -0
  22. package/ccw/dist/commands/list.d.ts.map +1 -0
  23. package/ccw/dist/commands/list.js +32 -0
  24. package/ccw/dist/commands/list.js.map +1 -0
  25. package/ccw/dist/commands/memory.d.ts +57 -0
  26. package/ccw/dist/commands/memory.d.ts.map +1 -0
  27. package/ccw/dist/commands/memory.js +890 -0
  28. package/ccw/dist/commands/memory.js.map +1 -0
  29. package/ccw/dist/commands/serve.d.ts +12 -0
  30. package/ccw/dist/commands/serve.d.ts.map +1 -0
  31. package/ccw/dist/commands/serve.js +63 -0
  32. package/ccw/dist/commands/serve.js.map +1 -0
  33. package/ccw/dist/commands/session-path-resolver.d.ts +45 -0
  34. package/ccw/dist/commands/session-path-resolver.d.ts.map +1 -0
  35. package/ccw/dist/commands/session-path-resolver.js +302 -0
  36. package/ccw/dist/commands/session-path-resolver.js.map +1 -0
  37. package/ccw/dist/commands/session.d.ts +12 -0
  38. package/ccw/dist/commands/session.d.ts.map +1 -0
  39. package/ccw/dist/commands/session.js +954 -0
  40. package/ccw/dist/commands/session.js.map +1 -0
  41. package/ccw/dist/commands/stop.d.ts +11 -0
  42. package/ccw/dist/commands/stop.d.ts.map +1 -0
  43. package/ccw/dist/commands/stop.js +96 -0
  44. package/ccw/dist/commands/stop.js.map +1 -0
  45. package/ccw/dist/commands/tool.d.ts +29 -0
  46. package/ccw/dist/commands/tool.d.ts.map +1 -0
  47. package/ccw/dist/commands/tool.js +173 -0
  48. package/ccw/dist/commands/tool.js.map +1 -0
  49. package/ccw/dist/commands/uninstall.d.ts +9 -0
  50. package/ccw/dist/commands/uninstall.d.ts.map +1 -0
  51. package/ccw/dist/commands/uninstall.js +239 -0
  52. package/ccw/dist/commands/uninstall.js.map +1 -0
  53. package/ccw/dist/commands/upgrade.d.ts +10 -0
  54. package/ccw/dist/commands/upgrade.d.ts.map +1 -0
  55. package/ccw/dist/commands/upgrade.js +288 -0
  56. package/ccw/dist/commands/upgrade.js.map +1 -0
  57. package/ccw/dist/commands/view.d.ts +14 -0
  58. package/ccw/dist/commands/view.d.ts.map +1 -0
  59. package/ccw/dist/commands/view.js +100 -0
  60. package/ccw/dist/commands/view.js.map +1 -0
  61. package/ccw/dist/config/storage-paths.d.ts +184 -0
  62. package/ccw/dist/config/storage-paths.d.ts.map +1 -0
  63. package/ccw/dist/config/storage-paths.js +536 -0
  64. package/ccw/dist/config/storage-paths.js.map +1 -0
  65. package/ccw/dist/core/cache-manager.d.ts +80 -0
  66. package/ccw/dist/core/cache-manager.d.ts.map +1 -0
  67. package/ccw/dist/core/cache-manager.js +260 -0
  68. package/ccw/dist/core/cache-manager.js.map +1 -0
  69. package/ccw/dist/core/claude-freshness.d.ts +53 -0
  70. package/ccw/dist/core/claude-freshness.d.ts.map +1 -0
  71. package/ccw/dist/core/claude-freshness.js +232 -0
  72. package/ccw/dist/core/claude-freshness.js.map +1 -0
  73. package/ccw/dist/core/core-memory-store.d.ts +320 -0
  74. package/ccw/dist/core/core-memory-store.d.ts.map +1 -0
  75. package/ccw/dist/core/core-memory-store.js +1177 -0
  76. package/ccw/dist/core/core-memory-store.js.map +1 -0
  77. package/ccw/dist/core/dashboard-generator-patch.d.ts +2 -0
  78. package/ccw/dist/core/dashboard-generator-patch.d.ts.map +1 -0
  79. package/ccw/dist/core/dashboard-generator-patch.js +48 -0
  80. package/ccw/dist/core/dashboard-generator-patch.js.map +1 -0
  81. package/ccw/dist/core/dashboard-generator.d.ts +8 -0
  82. package/ccw/dist/core/dashboard-generator.d.ts.map +1 -0
  83. package/ccw/dist/core/dashboard-generator.js +695 -0
  84. package/ccw/dist/core/dashboard-generator.js.map +1 -0
  85. package/ccw/dist/core/data-aggregator.d.ts +145 -0
  86. package/ccw/dist/core/data-aggregator.d.ts.map +1 -0
  87. package/ccw/dist/core/data-aggregator.js +416 -0
  88. package/ccw/dist/core/data-aggregator.js.map +1 -0
  89. package/ccw/dist/core/history-importer.d.ts +102 -0
  90. package/ccw/dist/core/history-importer.d.ts.map +1 -0
  91. package/ccw/dist/core/history-importer.js +493 -0
  92. package/ccw/dist/core/history-importer.js.map +1 -0
  93. package/ccw/dist/core/lite-scanner-complete.d.ts +81 -0
  94. package/ccw/dist/core/lite-scanner-complete.d.ts.map +1 -0
  95. package/ccw/dist/core/lite-scanner-complete.js +368 -0
  96. package/ccw/dist/core/lite-scanner-complete.js.map +1 -0
  97. package/ccw/dist/core/lite-scanner.d.ts +81 -0
  98. package/ccw/dist/core/lite-scanner.d.ts.map +1 -0
  99. package/ccw/dist/core/lite-scanner.js +368 -0
  100. package/ccw/dist/core/lite-scanner.js.map +1 -0
  101. package/ccw/dist/core/manifest.d.ts +88 -0
  102. package/ccw/dist/core/manifest.d.ts.map +1 -0
  103. package/ccw/dist/core/manifest.js +214 -0
  104. package/ccw/dist/core/manifest.js.map +1 -0
  105. package/ccw/dist/core/memory-embedder-bridge.d.ts +83 -0
  106. package/ccw/dist/core/memory-embedder-bridge.d.ts.map +1 -0
  107. package/ccw/dist/core/memory-embedder-bridge.js +181 -0
  108. package/ccw/dist/core/memory-embedder-bridge.js.map +1 -0
  109. package/ccw/dist/core/memory-store.d.ts +249 -0
  110. package/ccw/dist/core/memory-store.d.ts.map +1 -0
  111. package/ccw/dist/core/memory-store.js +781 -0
  112. package/ccw/dist/core/memory-store.js.map +1 -0
  113. package/ccw/dist/core/routes/ccw-routes.d.ts +20 -0
  114. package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -0
  115. package/ccw/dist/core/routes/ccw-routes.js +70 -0
  116. package/ccw/dist/core/routes/ccw-routes.js.map +1 -0
  117. package/ccw/dist/core/routes/claude-routes.d.ts +19 -0
  118. package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -0
  119. package/ccw/dist/core/routes/claude-routes.js +1017 -0
  120. package/ccw/dist/core/routes/claude-routes.js.map +1 -0
  121. package/ccw/dist/core/routes/cli-routes.d.ts +20 -0
  122. package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -0
  123. package/ccw/dist/core/routes/cli-routes.js +468 -0
  124. package/ccw/dist/core/routes/cli-routes.js.map +1 -0
  125. package/ccw/dist/core/routes/codexlens-routes.d.ts +20 -0
  126. package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -0
  127. package/ccw/dist/core/routes/codexlens-routes.js +754 -0
  128. package/ccw/dist/core/routes/codexlens-routes.js.map +1 -0
  129. package/ccw/dist/core/routes/core-memory-routes.d.ts +21 -0
  130. package/ccw/dist/core/routes/core-memory-routes.d.ts.map +1 -0
  131. package/ccw/dist/core/routes/core-memory-routes.js +520 -0
  132. package/ccw/dist/core/routes/core-memory-routes.js.map +1 -0
  133. package/ccw/dist/core/routes/files-routes.d.ts +20 -0
  134. package/ccw/dist/core/routes/files-routes.d.ts.map +1 -0
  135. package/ccw/dist/core/routes/files-routes.js +374 -0
  136. package/ccw/dist/core/routes/files-routes.js.map +1 -0
  137. package/ccw/dist/core/routes/graph-routes.d.ts +20 -0
  138. package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -0
  139. package/ccw/dist/core/routes/graph-routes.js +517 -0
  140. package/ccw/dist/core/routes/graph-routes.js.map +1 -0
  141. package/ccw/dist/core/routes/help-routes.d.ts +20 -0
  142. package/ccw/dist/core/routes/help-routes.d.ts.map +1 -0
  143. package/ccw/dist/core/routes/help-routes.js +250 -0
  144. package/ccw/dist/core/routes/help-routes.js.map +1 -0
  145. package/ccw/dist/core/routes/hooks-routes.d.ts +21 -0
  146. package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -0
  147. package/ccw/dist/core/routes/hooks-routes.js +346 -0
  148. package/ccw/dist/core/routes/hooks-routes.js.map +1 -0
  149. package/ccw/dist/core/routes/mcp-routes.d.ts +20 -0
  150. package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -0
  151. package/ccw/dist/core/routes/mcp-routes.js +1129 -0
  152. package/ccw/dist/core/routes/mcp-routes.js.map +1 -0
  153. package/ccw/dist/core/routes/mcp-templates-db.d.ts +54 -0
  154. package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -0
  155. package/ccw/dist/core/routes/mcp-templates-db.js +226 -0
  156. package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -0
  157. package/ccw/dist/core/routes/memory-routes.d.ts +21 -0
  158. package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -0
  159. package/ccw/dist/core/routes/memory-routes.js +1095 -0
  160. package/ccw/dist/core/routes/memory-routes.js.map +1 -0
  161. package/ccw/dist/core/routes/rules-routes.d.ts +20 -0
  162. package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -0
  163. package/ccw/dist/core/routes/rules-routes.js +442 -0
  164. package/ccw/dist/core/routes/rules-routes.js.map +1 -0
  165. package/ccw/dist/core/routes/session-routes.d.ts +20 -0
  166. package/ccw/dist/core/routes/session-routes.d.ts.map +1 -0
  167. package/ccw/dist/core/routes/session-routes.js +423 -0
  168. package/ccw/dist/core/routes/session-routes.js.map +1 -0
  169. package/ccw/dist/core/routes/skills-routes.d.ts +20 -0
  170. package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -0
  171. package/ccw/dist/core/routes/skills-routes.js +533 -0
  172. package/ccw/dist/core/routes/skills-routes.js.map +1 -0
  173. package/ccw/dist/core/routes/status-routes.d.ts +20 -0
  174. package/ccw/dist/core/routes/status-routes.d.ts.map +1 -0
  175. package/ccw/dist/core/routes/status-routes.js +38 -0
  176. package/ccw/dist/core/routes/status-routes.js.map +1 -0
  177. package/ccw/dist/core/routes/system-routes.d.ts +22 -0
  178. package/ccw/dist/core/routes/system-routes.d.ts.map +1 -0
  179. package/ccw/dist/core/routes/system-routes.js +354 -0
  180. package/ccw/dist/core/routes/system-routes.js.map +1 -0
  181. package/ccw/dist/core/server.d.ts +17 -0
  182. package/ccw/dist/core/server.d.ts.map +1 -0
  183. package/ccw/dist/core/server.js +386 -0
  184. package/ccw/dist/core/server.js.map +1 -0
  185. package/ccw/dist/core/session-clustering-service.d.ts +153 -0
  186. package/ccw/dist/core/session-clustering-service.d.ts.map +1 -0
  187. package/ccw/dist/core/session-clustering-service.js +1065 -0
  188. package/ccw/dist/core/session-clustering-service.js.map +1 -0
  189. package/ccw/dist/core/session-scanner.d.ts +32 -0
  190. package/ccw/dist/core/session-scanner.d.ts.map +1 -0
  191. package/ccw/dist/core/session-scanner.js +253 -0
  192. package/ccw/dist/core/session-scanner.js.map +1 -0
  193. package/ccw/dist/core/websocket.d.ts +23 -0
  194. package/ccw/dist/core/websocket.d.ts.map +1 -0
  195. package/ccw/dist/core/websocket.js +168 -0
  196. package/ccw/dist/core/websocket.js.map +1 -0
  197. package/ccw/dist/index.d.ts +10 -0
  198. package/ccw/dist/index.d.ts.map +1 -0
  199. package/ccw/dist/index.js +10 -0
  200. package/ccw/dist/index.js.map +1 -0
  201. package/ccw/dist/mcp-server/index.d.ts +7 -0
  202. package/ccw/dist/mcp-server/index.d.ts.map +1 -0
  203. package/ccw/dist/mcp-server/index.js +157 -0
  204. package/ccw/dist/mcp-server/index.js.map +1 -0
  205. package/ccw/dist/tools/classify-folders.d.ts +26 -0
  206. package/ccw/dist/tools/classify-folders.d.ts.map +1 -0
  207. package/ccw/dist/tools/classify-folders.js +201 -0
  208. package/ccw/dist/tools/classify-folders.js.map +1 -0
  209. package/ccw/dist/tools/cli-config-manager.d.ts +62 -0
  210. package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -0
  211. package/ccw/dist/tools/cli-config-manager.js +221 -0
  212. package/ccw/dist/tools/cli-config-manager.js.map +1 -0
  213. package/ccw/dist/tools/cli-executor.d.ts +373 -0
  214. package/ccw/dist/tools/cli-executor.d.ts.map +1 -0
  215. package/ccw/dist/tools/cli-executor.js +1625 -0
  216. package/ccw/dist/tools/cli-executor.js.map +1 -0
  217. package/ccw/dist/tools/cli-history-store.d.ts +330 -0
  218. package/ccw/dist/tools/cli-history-store.d.ts.map +1 -0
  219. package/ccw/dist/tools/cli-history-store.js +916 -0
  220. package/ccw/dist/tools/cli-history-store.js.map +1 -0
  221. package/ccw/dist/tools/codex-lens.d.ts +118 -0
  222. package/ccw/dist/tools/codex-lens.d.ts.map +1 -0
  223. package/ccw/dist/tools/codex-lens.js +962 -0
  224. package/ccw/dist/tools/codex-lens.js.map +1 -0
  225. package/ccw/dist/tools/convert-tokens-to-css.d.ts +14 -0
  226. package/ccw/dist/tools/convert-tokens-to-css.d.ts.map +1 -0
  227. package/ccw/dist/tools/convert-tokens-to-css.js +244 -0
  228. package/ccw/dist/tools/convert-tokens-to-css.js.map +1 -0
  229. package/ccw/dist/tools/core-memory.d.ts +66 -0
  230. package/ccw/dist/tools/core-memory.d.ts.map +1 -0
  231. package/ccw/dist/tools/core-memory.js +324 -0
  232. package/ccw/dist/tools/core-memory.js.map +1 -0
  233. package/ccw/dist/tools/detect-changed-modules.d.ts +24 -0
  234. package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -0
  235. package/ccw/dist/tools/detect-changed-modules.js +277 -0
  236. package/ccw/dist/tools/detect-changed-modules.js.map +1 -0
  237. package/ccw/dist/tools/discover-design-files.d.ts +36 -0
  238. package/ccw/dist/tools/discover-design-files.d.ts.map +1 -0
  239. package/ccw/dist/tools/discover-design-files.js +147 -0
  240. package/ccw/dist/tools/discover-design-files.js.map +1 -0
  241. package/ccw/dist/tools/edit-file.d.ts +28 -0
  242. package/ccw/dist/tools/edit-file.d.ts.map +1 -0
  243. package/ccw/dist/tools/edit-file.js +479 -0
  244. package/ccw/dist/tools/edit-file.js.map +1 -0
  245. package/ccw/dist/tools/generate-module-docs.d.ts +22 -0
  246. package/ccw/dist/tools/generate-module-docs.d.ts.map +1 -0
  247. package/ccw/dist/tools/generate-module-docs.js +379 -0
  248. package/ccw/dist/tools/generate-module-docs.js.map +1 -0
  249. package/ccw/dist/tools/get-modules-by-depth.d.ts +15 -0
  250. package/ccw/dist/tools/get-modules-by-depth.d.ts.map +1 -0
  251. package/ccw/dist/tools/get-modules-by-depth.js +296 -0
  252. package/ccw/dist/tools/get-modules-by-depth.js.map +1 -0
  253. package/ccw/dist/tools/index.d.ts +55 -0
  254. package/ccw/dist/tools/index.d.ts.map +1 -0
  255. package/ccw/dist/tools/index.js +304 -0
  256. package/ccw/dist/tools/index.js.map +1 -0
  257. package/ccw/dist/tools/native-session-discovery.d.ts +97 -0
  258. package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -0
  259. package/ccw/dist/tools/native-session-discovery.js +700 -0
  260. package/ccw/dist/tools/native-session-discovery.js.map +1 -0
  261. package/ccw/dist/tools/notifier.d.ts +50 -0
  262. package/ccw/dist/tools/notifier.d.ts.map +1 -0
  263. package/ccw/dist/tools/notifier.js +90 -0
  264. package/ccw/dist/tools/notifier.js.map +1 -0
  265. package/ccw/dist/tools/read-file.d.ts +32 -0
  266. package/ccw/dist/tools/read-file.d.ts.map +1 -0
  267. package/ccw/dist/tools/read-file.js +329 -0
  268. package/ccw/dist/tools/read-file.js.map +1 -0
  269. package/ccw/dist/tools/resume-strategy.d.ts +48 -0
  270. package/ccw/dist/tools/resume-strategy.d.ts.map +1 -0
  271. package/ccw/dist/tools/resume-strategy.js +248 -0
  272. package/ccw/dist/tools/resume-strategy.js.map +1 -0
  273. package/ccw/dist/tools/session-content-parser.d.ts +58 -0
  274. package/ccw/dist/tools/session-content-parser.d.ts.map +1 -0
  275. package/ccw/dist/tools/session-content-parser.js +420 -0
  276. package/ccw/dist/tools/session-content-parser.js.map +1 -0
  277. package/ccw/dist/tools/session-manager.d.ts +9 -0
  278. package/ccw/dist/tools/session-manager.d.ts.map +1 -0
  279. package/ccw/dist/tools/session-manager.js +834 -0
  280. package/ccw/dist/tools/session-manager.js.map +1 -0
  281. package/ccw/dist/tools/smart-context.d.ts +35 -0
  282. package/ccw/dist/tools/smart-context.d.ts.map +1 -0
  283. package/ccw/dist/tools/smart-context.js +182 -0
  284. package/ccw/dist/tools/smart-context.js.map +1 -0
  285. package/ccw/dist/tools/smart-search.d.ts +105 -0
  286. package/ccw/dist/tools/smart-search.d.ts.map +1 -0
  287. package/ccw/dist/tools/smart-search.js +1753 -0
  288. package/ccw/dist/tools/smart-search.js.map +1 -0
  289. package/ccw/dist/tools/storage-manager.d.ts +114 -0
  290. package/ccw/dist/tools/storage-manager.d.ts.map +1 -0
  291. package/ccw/dist/tools/storage-manager.js +392 -0
  292. package/ccw/dist/tools/storage-manager.js.map +1 -0
  293. package/ccw/dist/tools/ui-generate-preview.d.ts +39 -0
  294. package/ccw/dist/tools/ui-generate-preview.d.ts.map +1 -0
  295. package/ccw/dist/tools/ui-generate-preview.js +300 -0
  296. package/ccw/dist/tools/ui-generate-preview.js.map +1 -0
  297. package/ccw/dist/tools/ui-instantiate-prototypes.d.ts +75 -0
  298. package/ccw/dist/tools/ui-instantiate-prototypes.d.ts.map +1 -0
  299. package/ccw/dist/tools/ui-instantiate-prototypes.js +256 -0
  300. package/ccw/dist/tools/ui-instantiate-prototypes.js.map +1 -0
  301. package/ccw/dist/tools/update-module-claude.d.ts +80 -0
  302. package/ccw/dist/tools/update-module-claude.d.ts.map +1 -0
  303. package/ccw/dist/tools/update-module-claude.js +351 -0
  304. package/ccw/dist/tools/update-module-claude.js.map +1 -0
  305. package/ccw/dist/tools/write-file.d.ts +19 -0
  306. package/ccw/dist/tools/write-file.d.ts.map +1 -0
  307. package/ccw/dist/tools/write-file.js +193 -0
  308. package/ccw/dist/tools/write-file.js.map +1 -0
  309. package/ccw/dist/types/config.d.ts +11 -0
  310. package/ccw/dist/types/config.d.ts.map +1 -0
  311. package/ccw/dist/types/config.js +2 -0
  312. package/ccw/dist/types/config.js.map +1 -0
  313. package/ccw/dist/types/index.d.ts +4 -0
  314. package/ccw/dist/types/index.d.ts.map +1 -0
  315. package/ccw/dist/types/index.js +4 -0
  316. package/ccw/dist/types/index.js.map +1 -0
  317. package/ccw/dist/types/session.d.ts +20 -0
  318. package/ccw/dist/types/session.d.ts.map +1 -0
  319. package/ccw/dist/types/session.js +2 -0
  320. package/ccw/dist/types/session.js.map +1 -0
  321. package/ccw/dist/types/tool.d.ts +36 -0
  322. package/ccw/dist/types/tool.d.ts.map +1 -0
  323. package/ccw/dist/types/tool.js +11 -0
  324. package/ccw/dist/types/tool.js.map +1 -0
  325. package/ccw/dist/utils/browser-launcher.d.ts +13 -0
  326. package/ccw/dist/utils/browser-launcher.d.ts.map +1 -0
  327. package/ccw/dist/utils/browser-launcher.js +60 -0
  328. package/ccw/dist/utils/browser-launcher.js.map +1 -0
  329. package/ccw/dist/utils/file-utils.d.ts +25 -0
  330. package/ccw/dist/utils/file-utils.d.ts.map +1 -0
  331. package/ccw/dist/utils/file-utils.js +48 -0
  332. package/ccw/dist/utils/file-utils.js.map +1 -0
  333. package/ccw/dist/utils/path-resolver.d.ts +80 -0
  334. package/ccw/dist/utils/path-resolver.d.ts.map +1 -0
  335. package/ccw/dist/utils/path-resolver.js +260 -0
  336. package/ccw/dist/utils/path-resolver.js.map +1 -0
  337. package/ccw/dist/utils/path-validator.d.ts +49 -0
  338. package/ccw/dist/utils/path-validator.d.ts.map +1 -0
  339. package/ccw/dist/utils/path-validator.js +123 -0
  340. package/ccw/dist/utils/path-validator.js.map +1 -0
  341. package/ccw/dist/utils/ui.d.ts +62 -0
  342. package/ccw/dist/utils/ui.d.ts.map +1 -0
  343. package/ccw/dist/utils/ui.js +129 -0
  344. package/ccw/dist/utils/ui.js.map +1 -0
  345. package/ccw/package.json +1 -1
  346. package/package.json +5 -2
@@ -0,0 +1,250 @@
1
+ import { readFileSync, existsSync, watch } from 'fs';
2
+ import { join } from 'path';
3
+ import { homedir } from 'os';
4
+ const cache = new Map();
5
+ const CACHE_TTL = 300000; // 5 minutes
6
+ /**
7
+ * Get cached data or load from file
8
+ */
9
+ function getCachedData(key, filePath) {
10
+ const now = Date.now();
11
+ const cached = cache.get(key);
12
+ // Return cached data if valid
13
+ if (cached && (now - cached.timestamp) < CACHE_TTL) {
14
+ return cached.data;
15
+ }
16
+ // Load fresh data
17
+ try {
18
+ if (!existsSync(filePath)) {
19
+ console.error(`Help data file not found: ${filePath}`);
20
+ return null;
21
+ }
22
+ const content = readFileSync(filePath, 'utf8');
23
+ const data = JSON.parse(content);
24
+ // Update cache
25
+ cache.set(key, { data, timestamp: now });
26
+ return data;
27
+ }
28
+ catch (error) {
29
+ console.error(`Failed to load help data from ${filePath}:`, error);
30
+ return null;
31
+ }
32
+ }
33
+ /**
34
+ * Invalidate cache for a specific key
35
+ */
36
+ function invalidateCache(key) {
37
+ cache.delete(key);
38
+ console.log(`Cache invalidated: ${key}`);
39
+ }
40
+ // ========== File Watchers ==========
41
+ let watchersInitialized = false;
42
+ /**
43
+ * Initialize file watchers for JSON indexes
44
+ */
45
+ function initializeFileWatchers() {
46
+ if (watchersInitialized)
47
+ return;
48
+ const indexDir = join(homedir(), '.claude', 'skills', 'command-guide', 'index');
49
+ if (!existsSync(indexDir)) {
50
+ console.warn(`Command guide index directory not found: ${indexDir}`);
51
+ return;
52
+ }
53
+ try {
54
+ // Watch all JSON files in index directory
55
+ const watcher = watch(indexDir, { recursive: false }, (eventType, filename) => {
56
+ if (!filename || !filename.endsWith('.json'))
57
+ return;
58
+ console.log(`File change detected: ${filename} (${eventType})`);
59
+ // Invalidate relevant cache entries
60
+ if (filename === 'all-commands.json') {
61
+ invalidateCache('all-commands');
62
+ }
63
+ else if (filename === 'command-relationships.json') {
64
+ invalidateCache('command-relationships');
65
+ }
66
+ else if (filename === 'by-category.json') {
67
+ invalidateCache('by-category');
68
+ }
69
+ });
70
+ watchersInitialized = true;
71
+ console.log(`File watchers initialized for: ${indexDir}`);
72
+ }
73
+ catch (error) {
74
+ console.error('Failed to initialize file watchers:', error);
75
+ }
76
+ }
77
+ // ========== Helper Functions ==========
78
+ /**
79
+ * Filter commands by search query
80
+ */
81
+ function filterCommands(commands, query) {
82
+ if (!query)
83
+ return commands;
84
+ const lowerQuery = query.toLowerCase();
85
+ return commands.filter(cmd => cmd.name?.toLowerCase().includes(lowerQuery) ||
86
+ cmd.command?.toLowerCase().includes(lowerQuery) ||
87
+ cmd.description?.toLowerCase().includes(lowerQuery) ||
88
+ cmd.category?.toLowerCase().includes(lowerQuery));
89
+ }
90
+ /**
91
+ * Group commands by category with subcategories
92
+ */
93
+ function groupCommandsByCategory(commands) {
94
+ const grouped = {};
95
+ for (const cmd of commands) {
96
+ const category = cmd.category || 'general';
97
+ const subcategory = cmd.subcategory || null;
98
+ if (!grouped[category]) {
99
+ grouped[category] = {
100
+ name: category,
101
+ commands: [],
102
+ subcategories: {}
103
+ };
104
+ }
105
+ if (subcategory) {
106
+ if (!grouped[category].subcategories[subcategory]) {
107
+ grouped[category].subcategories[subcategory] = [];
108
+ }
109
+ grouped[category].subcategories[subcategory].push(cmd);
110
+ }
111
+ else {
112
+ grouped[category].commands.push(cmd);
113
+ }
114
+ }
115
+ return grouped;
116
+ }
117
+ // ========== API Routes ==========
118
+ /**
119
+ * Handle Help routes
120
+ * @returns true if route was handled, false otherwise
121
+ */
122
+ export async function handleHelpRoutes(ctx) {
123
+ const { pathname, url, req, res } = ctx;
124
+ // Initialize file watchers on first request
125
+ initializeFileWatchers();
126
+ const indexDir = join(homedir(), '.claude', 'skills', 'command-guide', 'index');
127
+ // API: Get all commands with optional search
128
+ if (pathname === '/api/help/commands') {
129
+ const searchQuery = url.searchParams.get('q') || '';
130
+ const filePath = join(indexDir, 'all-commands.json');
131
+ let commands = getCachedData('all-commands', filePath);
132
+ if (!commands) {
133
+ res.writeHead(404, { 'Content-Type': 'application/json' });
134
+ res.end(JSON.stringify({ error: 'Commands data not found' }));
135
+ return true;
136
+ }
137
+ // Filter by search query if provided
138
+ if (searchQuery) {
139
+ commands = filterCommands(commands, searchQuery);
140
+ }
141
+ // Group by category
142
+ const grouped = groupCommandsByCategory(commands);
143
+ res.writeHead(200, { 'Content-Type': 'application/json' });
144
+ res.end(JSON.stringify({
145
+ commands: commands,
146
+ grouped: grouped,
147
+ total: commands.length
148
+ }));
149
+ return true;
150
+ }
151
+ // API: Get workflow command relationships
152
+ if (pathname === '/api/help/workflows') {
153
+ const filePath = join(indexDir, 'command-relationships.json');
154
+ const relationships = getCachedData('command-relationships', filePath);
155
+ if (!relationships) {
156
+ res.writeHead(404, { 'Content-Type': 'application/json' });
157
+ res.end(JSON.stringify({ error: 'Workflow relationships not found' }));
158
+ return true;
159
+ }
160
+ res.writeHead(200, { 'Content-Type': 'application/json' });
161
+ res.end(JSON.stringify(relationships));
162
+ return true;
163
+ }
164
+ // API: Get commands by category
165
+ if (pathname === '/api/help/commands/by-category') {
166
+ const filePath = join(indexDir, 'by-category.json');
167
+ const byCategory = getCachedData('by-category', filePath);
168
+ if (!byCategory) {
169
+ res.writeHead(404, { 'Content-Type': 'application/json' });
170
+ res.end(JSON.stringify({ error: 'Category data not found' }));
171
+ return true;
172
+ }
173
+ res.writeHead(200, { 'Content-Type': 'application/json' });
174
+ res.end(JSON.stringify(byCategory));
175
+ return true;
176
+ }
177
+ // API: Get CodexLens documentation metadata
178
+ if (pathname === '/api/help/codexlens') {
179
+ // Return CodexLens quick-start guide data
180
+ const codexLensData = {
181
+ title: 'CodexLens Quick Start',
182
+ description: 'Fast code indexing and semantic search for large codebases',
183
+ sections: [
184
+ {
185
+ title: 'Key Concepts',
186
+ items: [
187
+ {
188
+ name: 'Indexing',
189
+ description: 'CodexLens builds a semantic index of your codebase for fast retrieval',
190
+ command: 'codex_lens(action="init", path=".")'
191
+ },
192
+ {
193
+ name: 'Search Modes',
194
+ description: 'Text search for exact matches, semantic search for concept-based queries',
195
+ command: 'codex_lens(action="search", query="authentication logic", mode="semantic")'
196
+ },
197
+ {
198
+ name: 'Symbol Navigation',
199
+ description: 'Extract and navigate code symbols (functions, classes, interfaces)',
200
+ command: 'codex_lens(action="symbol", file="path/to/file.py")'
201
+ }
202
+ ]
203
+ },
204
+ {
205
+ title: 'Common Commands',
206
+ items: [
207
+ {
208
+ name: 'Initialize Index',
209
+ command: 'codex_lens(action="init", path=".")',
210
+ description: 'Index the current directory'
211
+ },
212
+ {
213
+ name: 'Text Search',
214
+ command: 'codex_lens(action="search", query="function name", path=".")',
215
+ description: 'Search for exact text matches'
216
+ },
217
+ {
218
+ name: 'Semantic Search',
219
+ command: 'codex_lens(action="search", query="user authentication", mode="semantic")',
220
+ description: 'Search by concept or meaning'
221
+ },
222
+ {
223
+ name: 'Check Status',
224
+ command: 'codex_lens(action="status")',
225
+ description: 'View indexing status for all projects'
226
+ }
227
+ ]
228
+ },
229
+ {
230
+ title: 'Best Practices',
231
+ items: [
232
+ { description: 'Index large codebases (>500 files) for optimal performance' },
233
+ { description: 'Use semantic search for exploratory tasks' },
234
+ { description: 'Combine with smart_search for medium-sized projects' },
235
+ { description: 'Re-index after major code changes' }
236
+ ]
237
+ }
238
+ ],
239
+ links: [
240
+ { text: 'Full Documentation', url: 'https://github.com/yourusername/codex-lens' },
241
+ { text: 'Tool Selection Guide', url: '/.claude/rules/tool-selection.md' }
242
+ ]
243
+ };
244
+ res.writeHead(200, { 'Content-Type': 'application/json' });
245
+ res.end(JSON.stringify(codexLensData));
246
+ return true;
247
+ }
248
+ return false;
249
+ }
250
+ //# sourceMappingURL=help-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"help-routes.js","sourceRoot":"","sources":["../../../src/core/routes/help-routes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Hooks Routes Module
3
+ * Handles all hooks-related API endpoints
4
+ */
5
+ import type { IncomingMessage, ServerResponse } from 'http';
6
+ export interface RouteContext {
7
+ pathname: string;
8
+ url: URL;
9
+ req: IncomingMessage;
10
+ res: ServerResponse;
11
+ initialPath: string;
12
+ handlePostRequest: (req: IncomingMessage, res: ServerResponse, handler: (body: unknown) => Promise<any>) => void;
13
+ broadcastToClients: (data: unknown) => void;
14
+ extractSessionIdFromPath: (filePath: string) => string | null;
15
+ }
16
+ /**
17
+ * Handle hooks routes
18
+ * @returns true if route was handled, false otherwise
19
+ */
20
+ export declare function handleHooksRoutes(ctx: RouteContext): Promise<boolean>;
21
+ //# sourceMappingURL=hooks-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-routes.d.ts","sourceRoot":"","sources":["../../../src/core/routes/hooks-routes.ts"],"names":[],"mappings":"AACA;;;GAGG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAK5D,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,GAAG,CAAC;IACT,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,EAAE,cAAc,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IACjH,kBAAkB,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,wBAAwB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;CAC/D;AAgMD;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CA6L3E"}
@@ -0,0 +1,346 @@
1
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { homedir } from 'os';
4
+ // ========================================
5
+ // Helper Functions
6
+ // ========================================
7
+ const GLOBAL_SETTINGS_PATH = join(homedir(), '.claude', 'settings.json');
8
+ /**
9
+ * Get project settings path
10
+ * @param {string} projectPath
11
+ * @returns {string}
12
+ */
13
+ function getProjectSettingsPath(projectPath) {
14
+ const normalizedPath = projectPath.replace(/\//g, '\\').replace(/^\\([a-zA-Z])\\/, '$1:\\');
15
+ return join(normalizedPath, '.claude', 'settings.json');
16
+ }
17
+ /**
18
+ * Read settings file safely
19
+ * @param {string} filePath
20
+ * @returns {Object}
21
+ */
22
+ function readSettingsFile(filePath) {
23
+ try {
24
+ if (!existsSync(filePath)) {
25
+ return {};
26
+ }
27
+ const content = readFileSync(filePath, 'utf8');
28
+ return JSON.parse(content);
29
+ }
30
+ catch (error) {
31
+ console.error(`Error reading settings file ${filePath}:`, error);
32
+ return {};
33
+ }
34
+ }
35
+ /**
36
+ * Get hooks configuration from global and project settings
37
+ * @param {string} projectPath
38
+ * @returns {Object}
39
+ */
40
+ function getHooksConfig(projectPath) {
41
+ const globalSettings = readSettingsFile(GLOBAL_SETTINGS_PATH);
42
+ const projectSettingsPath = projectPath ? getProjectSettingsPath(projectPath) : null;
43
+ const projectSettings = projectSettingsPath ? readSettingsFile(projectSettingsPath) : {};
44
+ return {
45
+ global: {
46
+ path: GLOBAL_SETTINGS_PATH,
47
+ hooks: globalSettings.hooks || {}
48
+ },
49
+ project: {
50
+ path: projectSettingsPath,
51
+ hooks: projectSettings.hooks || {}
52
+ }
53
+ };
54
+ }
55
+ /**
56
+ * Save a hook to settings file
57
+ * @param {string} projectPath
58
+ * @param {string} scope - 'global' or 'project'
59
+ * @param {string} event - Hook event type
60
+ * @param {Object} hookData - Hook configuration
61
+ * @returns {Object}
62
+ */
63
+ function saveHookToSettings(projectPath, scope, event, hookData) {
64
+ try {
65
+ const filePath = scope === 'global' ? GLOBAL_SETTINGS_PATH : getProjectSettingsPath(projectPath);
66
+ const settings = readSettingsFile(filePath);
67
+ // Ensure hooks object exists
68
+ if (!settings.hooks) {
69
+ settings.hooks = {};
70
+ }
71
+ // Ensure the event array exists
72
+ if (!settings.hooks[event]) {
73
+ settings.hooks[event] = [];
74
+ }
75
+ // Ensure it's an array
76
+ if (!Array.isArray(settings.hooks[event])) {
77
+ settings.hooks[event] = [settings.hooks[event]];
78
+ }
79
+ // Check if we're replacing an existing hook
80
+ if (hookData.replaceIndex !== undefined) {
81
+ const index = hookData.replaceIndex;
82
+ delete hookData.replaceIndex;
83
+ if (index >= 0 && index < settings.hooks[event].length) {
84
+ settings.hooks[event][index] = hookData;
85
+ }
86
+ }
87
+ else {
88
+ // Add new hook
89
+ settings.hooks[event].push(hookData);
90
+ }
91
+ // Ensure directory exists and write file
92
+ const dirPath = dirname(filePath);
93
+ if (!existsSync(dirPath)) {
94
+ mkdirSync(dirPath, { recursive: true });
95
+ }
96
+ writeFileSync(filePath, JSON.stringify(settings, null, 2), 'utf8');
97
+ return {
98
+ success: true,
99
+ event,
100
+ hookData
101
+ };
102
+ }
103
+ catch (error) {
104
+ console.error('Error saving hook:', error);
105
+ return { error: error.message };
106
+ }
107
+ }
108
+ /**
109
+ * Delete a hook from settings file
110
+ * @param {string} projectPath
111
+ * @param {string} scope - 'global' or 'project'
112
+ * @param {string} event - Hook event type
113
+ * @param {number} hookIndex - Index of hook to delete
114
+ * @returns {Object}
115
+ */
116
+ function deleteHookFromSettings(projectPath, scope, event, hookIndex) {
117
+ try {
118
+ const filePath = scope === 'global' ? GLOBAL_SETTINGS_PATH : getProjectSettingsPath(projectPath);
119
+ const settings = readSettingsFile(filePath);
120
+ if (!settings.hooks || !settings.hooks[event]) {
121
+ return { error: 'Hook not found' };
122
+ }
123
+ // Ensure it's an array
124
+ if (!Array.isArray(settings.hooks[event])) {
125
+ settings.hooks[event] = [settings.hooks[event]];
126
+ }
127
+ if (hookIndex < 0 || hookIndex >= settings.hooks[event].length) {
128
+ return { error: 'Invalid hook index' };
129
+ }
130
+ // Remove the hook
131
+ settings.hooks[event].splice(hookIndex, 1);
132
+ // Remove empty event arrays
133
+ if (settings.hooks[event].length === 0) {
134
+ delete settings.hooks[event];
135
+ }
136
+ writeFileSync(filePath, JSON.stringify(settings, null, 2), 'utf8');
137
+ return {
138
+ success: true,
139
+ event,
140
+ hookIndex
141
+ };
142
+ }
143
+ catch (error) {
144
+ console.error('Error deleting hook:', error);
145
+ return { error: error.message };
146
+ }
147
+ }
148
+ // ========================================
149
+ // Session State Tracking (for progressive disclosure)
150
+ // ========================================
151
+ // Track sessions that have received startup context
152
+ // Key: sessionId, Value: timestamp of first context load
153
+ const sessionContextState = new Map();
154
+ // Cleanup old sessions (older than 24 hours)
155
+ function cleanupOldSessions() {
156
+ const cutoff = Date.now() - 24 * 60 * 60 * 1000;
157
+ for (const [sessionId, state] of sessionContextState.entries()) {
158
+ if (new Date(state.firstLoad).getTime() < cutoff) {
159
+ sessionContextState.delete(sessionId);
160
+ }
161
+ }
162
+ }
163
+ // Run cleanup every hour
164
+ setInterval(cleanupOldSessions, 60 * 60 * 1000);
165
+ // ========================================
166
+ // Route Handler
167
+ // ========================================
168
+ /**
169
+ * Handle hooks routes
170
+ * @returns true if route was handled, false otherwise
171
+ */
172
+ export async function handleHooksRoutes(ctx) {
173
+ const { pathname, url, req, res, initialPath, handlePostRequest, broadcastToClients, extractSessionIdFromPath } = ctx;
174
+ // API: Hook endpoint for Claude Code notifications
175
+ if (pathname === '/api/hook' && req.method === 'POST') {
176
+ handlePostRequest(req, res, async (body) => {
177
+ const { type, filePath, sessionId, ...extraData } = body;
178
+ // Determine session ID from file path if not provided
179
+ let resolvedSessionId = sessionId;
180
+ if (!resolvedSessionId && filePath) {
181
+ resolvedSessionId = extractSessionIdFromPath(filePath);
182
+ }
183
+ // Handle context hooks (session-start, context)
184
+ if (type === 'session-start' || type === 'context') {
185
+ try {
186
+ const projectPath = url.searchParams.get('path') || initialPath;
187
+ const { SessionClusteringService } = await import('../session-clustering-service.js');
188
+ const clusteringService = new SessionClusteringService(projectPath);
189
+ const format = url.searchParams.get('format') || 'markdown';
190
+ // Pass type and prompt to getProgressiveIndex
191
+ // session-start: returns recent sessions by time
192
+ // context: returns intent-matched sessions based on prompt
193
+ const index = await clusteringService.getProgressiveIndex({
194
+ type: type,
195
+ sessionId: resolvedSessionId,
196
+ prompt: extraData.prompt // Pass user prompt for intent matching
197
+ });
198
+ // Return context directly
199
+ return {
200
+ success: true,
201
+ type: 'context',
202
+ format,
203
+ content: index,
204
+ sessionId: resolvedSessionId
205
+ };
206
+ }
207
+ catch (error) {
208
+ console.error('[Hooks] Failed to generate context:', error);
209
+ // Return empty content on failure (fail silently)
210
+ return {
211
+ success: true,
212
+ type: 'context',
213
+ format: 'markdown',
214
+ content: '',
215
+ sessionId: resolvedSessionId,
216
+ error: error.message
217
+ };
218
+ }
219
+ }
220
+ // Broadcast to all connected WebSocket clients
221
+ const notification = {
222
+ type: type || 'session_updated',
223
+ payload: {
224
+ sessionId: resolvedSessionId,
225
+ filePath: filePath,
226
+ timestamp: new Date().toISOString(),
227
+ ...extraData // Pass through toolName, status, result, params, error, etc.
228
+ }
229
+ };
230
+ broadcastToClients(notification);
231
+ return { success: true, notification };
232
+ });
233
+ return true;
234
+ }
235
+ // API: Unified Session Context endpoint (Progressive Disclosure)
236
+ // Automatically detects first prompt vs subsequent prompts
237
+ // - First prompt: returns cluster-based session overview
238
+ // - Subsequent prompts: returns intent-matched sessions based on prompt
239
+ if (pathname === '/api/hook/session-context' && req.method === 'POST') {
240
+ handlePostRequest(req, res, async (body) => {
241
+ const { sessionId, prompt } = body;
242
+ if (!sessionId) {
243
+ return {
244
+ success: true,
245
+ content: '',
246
+ error: 'sessionId is required'
247
+ };
248
+ }
249
+ try {
250
+ const projectPath = url.searchParams.get('path') || initialPath;
251
+ const { SessionClusteringService } = await import('../session-clustering-service.js');
252
+ const clusteringService = new SessionClusteringService(projectPath);
253
+ // Check if this is the first prompt for this session
254
+ const existingState = sessionContextState.get(sessionId);
255
+ const isFirstPrompt = !existingState;
256
+ // Update session state
257
+ if (isFirstPrompt) {
258
+ sessionContextState.set(sessionId, {
259
+ firstLoad: new Date().toISOString(),
260
+ loadCount: 1,
261
+ lastPrompt: prompt
262
+ });
263
+ }
264
+ else {
265
+ existingState.loadCount++;
266
+ existingState.lastPrompt = prompt;
267
+ }
268
+ // Determine which type of context to return
269
+ let contextType;
270
+ let content;
271
+ if (isFirstPrompt) {
272
+ // First prompt: return session overview with clusters
273
+ contextType = 'session-start';
274
+ content = await clusteringService.getProgressiveIndex({
275
+ type: 'session-start',
276
+ sessionId
277
+ });
278
+ }
279
+ else if (prompt && prompt.trim().length > 0) {
280
+ // Subsequent prompts with content: return intent-matched sessions
281
+ contextType = 'context';
282
+ content = await clusteringService.getProgressiveIndex({
283
+ type: 'context',
284
+ sessionId,
285
+ prompt
286
+ });
287
+ }
288
+ else {
289
+ // Subsequent prompts without content: return minimal context
290
+ contextType = 'context';
291
+ content = ''; // No context needed for empty prompts
292
+ }
293
+ return {
294
+ success: true,
295
+ type: contextType,
296
+ isFirstPrompt,
297
+ loadCount: sessionContextState.get(sessionId)?.loadCount || 1,
298
+ content,
299
+ sessionId
300
+ };
301
+ }
302
+ catch (error) {
303
+ console.error('[Hooks] Failed to generate session context:', error);
304
+ return {
305
+ success: true,
306
+ content: '',
307
+ sessionId,
308
+ error: error.message
309
+ };
310
+ }
311
+ });
312
+ return true;
313
+ }
314
+ // API: Get hooks configuration
315
+ if (pathname === '/api/hooks' && req.method === 'GET') {
316
+ const projectPathParam = url.searchParams.get('path');
317
+ const hooksData = getHooksConfig(projectPathParam);
318
+ res.writeHead(200, { 'Content-Type': 'application/json' });
319
+ res.end(JSON.stringify(hooksData));
320
+ return true;
321
+ }
322
+ // API: Save hook
323
+ if (pathname === '/api/hooks' && req.method === 'POST') {
324
+ handlePostRequest(req, res, async (body) => {
325
+ const { projectPath, scope, event, hookData } = body;
326
+ if (!scope || !event || !hookData) {
327
+ return { error: 'scope, event, and hookData are required', status: 400 };
328
+ }
329
+ return saveHookToSettings(projectPath, scope, event, hookData);
330
+ });
331
+ return true;
332
+ }
333
+ // API: Delete hook
334
+ if (pathname === '/api/hooks' && req.method === 'DELETE') {
335
+ handlePostRequest(req, res, async (body) => {
336
+ const { projectPath, scope, event, hookIndex } = body;
337
+ if (!scope || !event || hookIndex === undefined) {
338
+ return { error: 'scope, event, and hookIndex are required', status: 400 };
339
+ }
340
+ return deleteHookFromSettings(projectPath, scope, event, hookIndex);
341
+ });
342
+ return true;
343
+ }
344
+ return false;
345
+ }
346
+ //# sourceMappingURL=hooks-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-routes.js","sourceRoot":"","sources":["../../../src/core/routes/hooks-routes.ts"],"names":[],"mappings":"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"}