wind-agent-cli 1.37.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 (932) hide show
  1. package/LICENSE +718 -0
  2. package/README.md +26 -0
  3. package/dist/api-docs.html +901 -0
  4. package/dist/assets/CodeEditor-B2Wf7Fg0.js +110 -0
  5. package/dist/assets/FileTree-N2IkkHlv.js +127 -0
  6. package/dist/assets/GitPanel-DZCeuFZ2.js +29 -0
  7. package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  8. package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  9. package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  10. package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  11. package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  12. package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  13. package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  14. package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  15. package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  16. package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  17. package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  18. package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  19. package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  20. package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  21. package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  22. package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  23. package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  24. package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  25. package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  26. package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  27. package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  28. package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  29. package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  30. package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  31. package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  32. package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  33. package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  34. package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  35. package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  36. package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  37. package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  38. package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  39. package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  40. package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  41. package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  42. package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  43. package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  44. package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  45. package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  46. package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  47. package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  48. package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  49. package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  50. package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  51. package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  52. package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  53. package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  54. package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  55. package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  56. package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  57. package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  58. package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  59. package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  60. package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  61. package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  62. package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  63. package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  64. package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  65. package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  66. package/dist/assets/MarkdownPreview-C0tqYnVu.js +41 -0
  67. package/dist/assets/PluginTabContent-Bnuf-fb8.js +1 -0
  68. package/dist/assets/Shell-BfFnMZ-f.js +81 -0
  69. package/dist/assets/Shell-qxJ8_QYu.css +32 -0
  70. package/dist/assets/StandaloneShell-QmyYwNAl.js +1 -0
  71. package/dist/assets/TaskMasterPanel-fMsmvN9L.js +32 -0
  72. package/dist/assets/abnfDiagram-N423BO3Z-DjPU7HLs.js +1 -0
  73. package/dist/assets/arc-Pdq6Tvr3.js +1 -0
  74. package/dist/assets/architectureDiagram-T3A2C74G-D0JnT0Vh.js +36 -0
  75. package/dist/assets/blockDiagram-VBNYF7ZC-DpaEf3mv.js +132 -0
  76. package/dist/assets/c4Diagram-5PPSVZJV-MpqlPGFi.js +10 -0
  77. package/dist/assets/channel-Bm0ZLE4z.js +1 -0
  78. package/dist/assets/chunk-2GRJ4B5K-DoSdNo8u.js +1 -0
  79. package/dist/assets/chunk-2Q5K7J3B-CE7I3uMn.js +1 -0
  80. package/dist/assets/chunk-5RXB4S5H-B4UQ8snD.js +231 -0
  81. package/dist/assets/chunk-5VM5RSS4-B55XgqHZ.js +15 -0
  82. package/dist/assets/chunk-6Q2QTUOP-BS1KpefW.js +88 -0
  83. package/dist/assets/chunk-GF5L2VYU-DkEPedJP.js +206 -0
  84. package/dist/assets/chunk-JWPE2WC7-DOtkNhMm.js +1 -0
  85. package/dist/assets/chunk-KBJHAD2P-BXLjviqM.js +1 -0
  86. package/dist/assets/chunk-RYQCIY6F-C50fjNNz.js +1 -0
  87. package/dist/assets/chunk-XXDRQBXY-QBYqCkb7.js +1 -0
  88. package/dist/assets/classDiagram-JCYQIIEL-DqEOcNxw.js +1 -0
  89. package/dist/assets/classDiagram-v2-OCEON4UE-DqEOcNxw.js +1 -0
  90. package/dist/assets/code-xml-VK1YfShP.js +6 -0
  91. package/dist/assets/cose-bilkent-JH36ORCC-DrVTo1Nh.js +1 -0
  92. package/dist/assets/cynefin-VYW2F7L2-DnJa_OlQ.js +178 -0
  93. package/dist/assets/cynefinDiagram-MW4NZA55-CCxBjw9E.js +62 -0
  94. package/dist/assets/cytoscape.esm-C10L9Icf.js +331 -0
  95. package/dist/assets/dagre-VZM6K2ZE-C_GvE4lu.js +4 -0
  96. package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
  97. package/dist/assets/diagram-7IWD3JNH-pFzs9HEu.js +30 -0
  98. package/dist/assets/diagram-B4RE2ZJO-CcehQC7x.js +3 -0
  99. package/dist/assets/diagram-LBJQPF4R-hfKcrrxe.js +24 -0
  100. package/dist/assets/diagram-Q27KOJAE-C1semJfK.js +24 -0
  101. package/dist/assets/diagram-UB23O5K3-57hvXQXO.js +41 -0
  102. package/dist/assets/ebnfDiagram-BXEA7PRR-9KIAlAVw.js +1 -0
  103. package/dist/assets/erDiagram-JOGREHBK-B7OzJ767.js +85 -0
  104. package/dist/assets/flowDiagram-UKHOOZJN-CJV8fQPR.js +156 -0
  105. package/dist/assets/ganttDiagram-PKOTCBZU-CbMNWWQu.js +292 -0
  106. package/dist/assets/gitGraphDiagram-DS77QQ5N-I_vZ5waO.js +106 -0
  107. package/dist/assets/graph-Cx-EqisW.js +1 -0
  108. package/dist/assets/index-DFnVoqpx.js +1174 -0
  109. package/dist/assets/index-DlSeAkw_.js +11 -0
  110. package/dist/assets/index-GFhXZyl2.js +62 -0
  111. package/dist/assets/index-ZHwIojzi.js +1 -0
  112. package/dist/assets/index-t1w8KNxn.css +1 -0
  113. package/dist/assets/infoDiagram-6WML65LV-Dh20Tsbq.js +2 -0
  114. package/dist/assets/init-Gi6I4Gst.js +1 -0
  115. package/dist/assets/ishikawaDiagram-WSZJBQD7-DH2Sm3ko.js +70 -0
  116. package/dist/assets/journeyDiagram-NVQOT4AX-BNFQqlVu.js +139 -0
  117. package/dist/assets/kanban-definition-27J2QSJJ-B3iL0ztJ.js +89 -0
  118. package/dist/assets/layout-D6BstSzF.js +1 -0
  119. package/dist/assets/linear-Cwe9dEKA.js +1 -0
  120. package/dist/assets/map-CV9uif0g.js +1 -0
  121. package/dist/assets/mermaid.core-BYRQSshi.js +312 -0
  122. package/dist/assets/mindmap-definition-FAOFIHXS-BgfBYMzr.js +96 -0
  123. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  124. package/dist/assets/pegDiagram-VL7TDLO6-CNYpECr8.js +1 -0
  125. package/dist/assets/pieDiagram-7S7Q4E2Y-DeSrxc4I.js +39 -0
  126. package/dist/assets/quadrantDiagram-CIZ2JOQS-BXVVQsa6.js +7 -0
  127. package/dist/assets/railroadDiagram-AXF67PYL-JTroIW8F.js +1 -0
  128. package/dist/assets/requirementDiagram-LRYGKXZP-C1Z_inLz.js +84 -0
  129. package/dist/assets/sankeyDiagram-W5VNT64P-DCJgKFUk.js +40 -0
  130. package/dist/assets/sequenceDiagram-SI44F4Z6-D8Wrx5Vc.js +162 -0
  131. package/dist/assets/sizeCapture-X5ZJPWSS-CXqD68vD.js +1 -0
  132. package/dist/assets/stateDiagram-OKZ733FA-CF0Ekqjo.js +1 -0
  133. package/dist/assets/stateDiagram-v2-UEYNNEHI-DARLpEFJ.js +1 -0
  134. package/dist/assets/swimlanes-SLNWSIFB-DVIax_k4.js +2 -0
  135. package/dist/assets/swimlanesDiagram-ULZ7WXOC-CrgDgaY8.js +8 -0
  136. package/dist/assets/timeline-definition-Z64GVDOM-DSqk3ApG.js +120 -0
  137. package/dist/assets/vendor-react-whEHfigN.js +59 -0
  138. package/dist/assets/vennDiagram-T6HMQDX7-DNbTqyG5.js +34 -0
  139. package/dist/assets/wardleyDiagram-T6FBY63Y-BNCpsFZV.js +78 -0
  140. package/dist/assets/xychartDiagram-ELKLHX3M-XsVZphHr.js +7 -0
  141. package/dist/clear-cache.html +85 -0
  142. package/dist/convert-icons.md +53 -0
  143. package/dist/favicon.png +0 -0
  144. package/dist/favicon.svg +9 -0
  145. package/dist/generate-icons.js +49 -0
  146. package/dist/icons/claude-ai-icon.svg +1 -0
  147. package/dist/icons/codex-white.svg +3 -0
  148. package/dist/icons/codex.svg +3 -0
  149. package/dist/icons/cursor-white.svg +12 -0
  150. package/dist/icons/cursor.svg +1 -0
  151. package/dist/icons/icon-128x128.png +0 -0
  152. package/dist/icons/icon-128x128.svg +12 -0
  153. package/dist/icons/icon-144x144.png +0 -0
  154. package/dist/icons/icon-144x144.svg +12 -0
  155. package/dist/icons/icon-152x152.png +0 -0
  156. package/dist/icons/icon-152x152.svg +12 -0
  157. package/dist/icons/icon-192x192.png +0 -0
  158. package/dist/icons/icon-192x192.svg +12 -0
  159. package/dist/icons/icon-384x384.png +0 -0
  160. package/dist/icons/icon-384x384.svg +12 -0
  161. package/dist/icons/icon-512x512.png +0 -0
  162. package/dist/icons/icon-512x512.svg +12 -0
  163. package/dist/icons/icon-72x72.png +0 -0
  164. package/dist/icons/icon-72x72.svg +12 -0
  165. package/dist/icons/icon-96x96.png +0 -0
  166. package/dist/icons/icon-96x96.svg +12 -0
  167. package/dist/icons/icon-template.svg +12 -0
  168. package/dist/index.html +58 -0
  169. package/dist/logo-128.png +0 -0
  170. package/dist/logo-256.png +0 -0
  171. package/dist/logo-32.png +0 -0
  172. package/dist/logo-512.png +0 -0
  173. package/dist/logo-64.png +0 -0
  174. package/dist/logo.svg +17 -0
  175. package/dist/manifest.json +61 -0
  176. package/dist/screenshots/cli-selection.png +0 -0
  177. package/dist/screenshots/desktop-main.png +0 -0
  178. package/dist/screenshots/mobile-chat.png +0 -0
  179. package/dist/screenshots/new-session.png +0 -0
  180. package/dist/screenshots/tools-modal.png +0 -0
  181. package/dist/sw.js +124 -0
  182. package/dist-server/scripts/fix-codex-sdk-windows-hide.js +47 -0
  183. package/dist-server/scripts/fix-codex-sdk-windows-hide.js.map +1 -0
  184. package/dist-server/server/index.js +339 -0
  185. package/dist-server/server/index.js.map +1 -0
  186. package/dist-server/server/load-env.js +45 -0
  187. package/dist-server/server/load-env.js.map +1 -0
  188. package/dist-server/server/modules/agent/agent.module.js +38 -0
  189. package/dist-server/server/modules/agent/agent.module.js.map +1 -0
  190. package/dist-server/server/modules/agent/agent.routes.js +1161 -0
  191. package/dist-server/server/modules/agent/agent.routes.js.map +1 -0
  192. package/dist-server/server/modules/agent/index.js +3 -0
  193. package/dist-server/server/modules/agent/index.js.map +1 -0
  194. package/dist-server/server/modules/agent/tests/agent.routes.test.js +176 -0
  195. package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -0
  196. package/dist-server/server/modules/assets/assets.routes.js +130 -0
  197. package/dist-server/server/modules/assets/assets.routes.js.map +1 -0
  198. package/dist-server/server/modules/assets/index.js +4 -0
  199. package/dist-server/server/modules/assets/index.js.map +1 -0
  200. package/dist-server/server/modules/assets/services/image-assets.service.js +95 -0
  201. package/dist-server/server/modules/assets/services/image-assets.service.js.map +1 -0
  202. package/dist-server/server/modules/assets/tests/image-assets.service.test.js +56 -0
  203. package/dist-server/server/modules/assets/tests/image-assets.service.test.js.map +1 -0
  204. package/dist-server/server/modules/auth/auth.middleware.js +133 -0
  205. package/dist-server/server/modules/auth/auth.middleware.js.map +1 -0
  206. package/dist-server/server/modules/auth/auth.module.js +29 -0
  207. package/dist-server/server/modules/auth/auth.module.js.map +1 -0
  208. package/dist-server/server/modules/auth/auth.routes.js +45 -0
  209. package/dist-server/server/modules/auth/auth.routes.js.map +1 -0
  210. package/dist-server/server/modules/auth/auth.service.js +113 -0
  211. package/dist-server/server/modules/auth/auth.service.js.map +1 -0
  212. package/dist-server/server/modules/auth/index.js +9 -0
  213. package/dist-server/server/modules/auth/index.js.map +1 -0
  214. package/dist-server/server/modules/auth/tests/auth.service.test.js +80 -0
  215. package/dist-server/server/modules/auth/tests/auth.service.test.js.map +1 -0
  216. package/dist-server/server/modules/browser-use/browser-use-mcp.js +352 -0
  217. package/dist-server/server/modules/browser-use/browser-use-mcp.js.map +1 -0
  218. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js +107 -0
  219. package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js.map +1 -0
  220. package/dist-server/server/modules/browser-use/browser-use-runtime.js +10 -0
  221. package/dist-server/server/modules/browser-use/browser-use-runtime.js.map +1 -0
  222. package/dist-server/server/modules/browser-use/browser-use.routes.js +93 -0
  223. package/dist-server/server/modules/browser-use/browser-use.routes.js.map +1 -0
  224. package/dist-server/server/modules/browser-use/browser-use.service.js +687 -0
  225. package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -0
  226. package/dist-server/server/modules/browser-use/index.js +11 -0
  227. package/dist-server/server/modules/browser-use/index.js.map +1 -0
  228. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +8 -0
  229. package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -0
  230. package/dist-server/server/modules/cli/cli.js +17 -0
  231. package/dist-server/server/modules/cli/cli.js.map +1 -0
  232. package/dist-server/server/modules/cli/cli.module.js +85 -0
  233. package/dist-server/server/modules/cli/cli.module.js.map +1 -0
  234. package/dist-server/server/modules/cli/cli.service.js +225 -0
  235. package/dist-server/server/modules/cli/cli.service.js.map +1 -0
  236. package/dist-server/server/modules/cli/index.js +3 -0
  237. package/dist-server/server/modules/cli/index.js.map +1 -0
  238. package/dist-server/server/modules/cli/sandbox.service.js +332 -0
  239. package/dist-server/server/modules/cli/sandbox.service.js.map +1 -0
  240. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +154 -0
  241. package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -0
  242. package/dist-server/server/modules/cli/tests/cli.service.test.js +82 -0
  243. package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -0
  244. package/dist-server/server/modules/cli/tests/sandbox.service.test.js +56 -0
  245. package/dist-server/server/modules/cli/tests/sandbox.service.test.js.map +1 -0
  246. package/dist-server/server/modules/commands/commands.module.js +20 -0
  247. package/dist-server/server/modules/commands/commands.module.js.map +1 -0
  248. package/dist-server/server/modules/commands/commands.routes.js +547 -0
  249. package/dist-server/server/modules/commands/commands.routes.js.map +1 -0
  250. package/dist-server/server/modules/commands/index.js +3 -0
  251. package/dist-server/server/modules/commands/index.js.map +1 -0
  252. package/dist-server/server/modules/commands/tests/commands.test.js +144 -0
  253. package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
  254. package/dist-server/server/modules/database/connection.js +125 -0
  255. package/dist-server/server/modules/database/connection.js.map +1 -0
  256. package/dist-server/server/modules/database/index.js +18 -0
  257. package/dist-server/server/modules/database/index.js.map +1 -0
  258. package/dist-server/server/modules/database/init-db.js +18 -0
  259. package/dist-server/server/modules/database/init-db.js.map +1 -0
  260. package/dist-server/server/modules/database/migrations.js +434 -0
  261. package/dist-server/server/modules/database/migrations.js.map +1 -0
  262. package/dist-server/server/modules/database/repositories/api-keys.js +72 -0
  263. package/dist-server/server/modules/database/repositories/api-keys.js.map +1 -0
  264. package/dist-server/server/modules/database/repositories/app-config.js +47 -0
  265. package/dist-server/server/modules/database/repositories/app-config.js.map +1 -0
  266. package/dist-server/server/modules/database/repositories/credentials.js +68 -0
  267. package/dist-server/server/modules/database/repositories/credentials.js.map +1 -0
  268. package/dist-server/server/modules/database/repositories/github-tokens.js +54 -0
  269. package/dist-server/server/modules/database/repositories/github-tokens.js.map +1 -0
  270. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +100 -0
  271. package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js.map +1 -0
  272. package/dist-server/server/modules/database/repositories/notification-preferences.js +82 -0
  273. package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -0
  274. package/dist-server/server/modules/database/repositories/projects.db.js +172 -0
  275. package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -0
  276. package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
  277. package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
  278. package/dist-server/server/modules/database/repositories/push-subscriptions.js +49 -0
  279. package/dist-server/server/modules/database/repositories/push-subscriptions.js.map +1 -0
  280. package/dist-server/server/modules/database/repositories/scan-state.db.js +31 -0
  281. package/dist-server/server/modules/database/repositories/scan-state.db.js.map +1 -0
  282. package/dist-server/server/modules/database/repositories/sessions.db.js +375 -0
  283. package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -0
  284. package/dist-server/server/modules/database/repositories/users.js +88 -0
  285. package/dist-server/server/modules/database/repositories/users.js.map +1 -0
  286. package/dist-server/server/modules/database/repositories/vapid-keys.js +38 -0
  287. package/dist-server/server/modules/database/repositories/vapid-keys.js.map +1 -0
  288. package/dist-server/server/modules/database/schema.js +199 -0
  289. package/dist-server/server/modules/database/schema.js.map +1 -0
  290. package/dist-server/server/modules/database/tests/projects.db.integration.test.js +64 -0
  291. package/dist-server/server/modules/database/tests/projects.db.integration.test.js.map +1 -0
  292. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
  293. package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
  294. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +79 -0
  295. package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -0
  296. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +93 -0
  297. package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -0
  298. package/dist-server/server/modules/file-tree/file-tree.module.js +95 -0
  299. package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -0
  300. package/dist-server/server/modules/file-tree/file-tree.routes.js +208 -0
  301. package/dist-server/server/modules/file-tree/file-tree.routes.js.map +1 -0
  302. package/dist-server/server/modules/file-tree/file-tree.service.js +584 -0
  303. package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -0
  304. package/dist-server/server/modules/file-tree/index.js +3 -0
  305. package/dist-server/server/modules/file-tree/index.js.map +1 -0
  306. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js +123 -0
  307. package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js.map +1 -0
  308. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +311 -0
  309. package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -0
  310. package/dist-server/server/modules/git/git-branch.service.js +15 -0
  311. package/dist-server/server/modules/git/git-branch.service.js.map +1 -0
  312. package/dist-server/server/modules/git/git-parsing.service.js +61 -0
  313. package/dist-server/server/modules/git/git-parsing.service.js.map +1 -0
  314. package/dist-server/server/modules/git/git.module.js +14 -0
  315. package/dist-server/server/modules/git/git.module.js.map +1 -0
  316. package/dist-server/server/modules/git/git.routes.js +1348 -0
  317. package/dist-server/server/modules/git/git.routes.js.map +1 -0
  318. package/dist-server/server/modules/git/index.js +3 -0
  319. package/dist-server/server/modules/git/index.js.map +1 -0
  320. package/dist-server/server/modules/git/tests/git-branch.service.test.js +52 -0
  321. package/dist-server/server/modules/git/tests/git-branch.service.test.js.map +1 -0
  322. package/dist-server/server/modules/git/tests/git-init.routes.test.js +177 -0
  323. package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -0
  324. package/dist-server/server/modules/git/tests/git.test.js +80 -0
  325. package/dist-server/server/modules/git/tests/git.test.js.map +1 -0
  326. package/dist-server/server/modules/notifications/index.js +20 -0
  327. package/dist-server/server/modules/notifications/index.js.map +1 -0
  328. package/dist-server/server/modules/notifications/notifications.routes.js +115 -0
  329. package/dist-server/server/modules/notifications/notifications.routes.js.map +1 -0
  330. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js +97 -0
  331. package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js.map +1 -0
  332. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +249 -0
  333. package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -0
  334. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js +44 -0
  335. package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js.map +1 -0
  336. package/dist-server/server/modules/notifications/vapid-keys.service.js +28 -0
  337. package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -0
  338. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js +79 -0
  339. package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js.map +1 -0
  340. package/dist-server/server/modules/plugins/index.js +9 -0
  341. package/dist-server/server/modules/plugins/index.js.map +1 -0
  342. package/dist-server/server/modules/plugins/plugin-process.service.js +191 -0
  343. package/dist-server/server/modules/plugins/plugin-process.service.js.map +1 -0
  344. package/dist-server/server/modules/plugins/plugin-registry.service.js +414 -0
  345. package/dist-server/server/modules/plugins/plugin-registry.service.js.map +1 -0
  346. package/dist-server/server/modules/plugins/plugins.module.js +30 -0
  347. package/dist-server/server/modules/plugins/plugins.module.js.map +1 -0
  348. package/dist-server/server/modules/plugins/plugins.routes.js +70 -0
  349. package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -0
  350. package/dist-server/server/modules/plugins/plugins.service.js +123 -0
  351. package/dist-server/server/modules/plugins/plugins.service.js.map +1 -0
  352. package/dist-server/server/modules/plugins/tests/plugins.service.test.js +28 -0
  353. package/dist-server/server/modules/plugins/tests/plugins.service.test.js.map +1 -0
  354. package/dist-server/server/modules/projects/index.js +9 -0
  355. package/dist-server/server/modules/projects/index.js.map +1 -0
  356. package/dist-server/server/modules/projects/projects.routes.js +205 -0
  357. package/dist-server/server/modules/projects/projects.routes.js.map +1 -0
  358. package/dist-server/server/modules/projects/services/project-clone.service.js +220 -0
  359. package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -0
  360. package/dist-server/server/modules/projects/services/project-delete.service.js +78 -0
  361. package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -0
  362. package/dist-server/server/modules/projects/services/project-management.service.js +90 -0
  363. package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -0
  364. package/dist-server/server/modules/projects/services/project-star.service.js +60 -0
  365. package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -0
  366. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js +167 -0
  367. package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js.map +1 -0
  368. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +188 -0
  369. package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -0
  370. package/dist-server/server/modules/projects/tests/project-clone.service.test.js +126 -0
  371. package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -0
  372. package/dist-server/server/modules/projects/tests/project-management.service.test.js +85 -0
  373. package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -0
  374. package/dist-server/server/modules/projects/tests/project-star.service.test.js +95 -0
  375. package/dist-server/server/modules/projects/tests/project-star.service.test.js.map +1 -0
  376. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js +87 -0
  377. package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js.map +1 -0
  378. package/dist-server/server/modules/providers/index.js +9 -0
  379. package/dist-server/server/modules/providers/index.js.map +1 -0
  380. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +132 -0
  381. package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
  382. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
  383. package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
  384. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +249 -0
  385. package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -0
  386. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js +928 -0
  387. package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -0
  388. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +141 -0
  389. package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -0
  390. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +586 -0
  391. package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
  392. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js +205 -0
  393. package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js.map +1 -0
  394. package/dist-server/server/modules/providers/list/claude/claude.provider.js +21 -0
  395. package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
  396. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +180 -0
  397. package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -0
  398. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
  399. package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
  400. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
  401. package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
  402. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +109 -0
  403. package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -0
  404. package/dist-server/server/modules/providers/list/codex/codex-native-command.service.js +22 -0
  405. package/dist-server/server/modules/providers/list/codex/codex-native-command.service.js.map +1 -0
  406. package/dist-server/server/modules/providers/list/codex/codex-native-runtime.provider.js +473 -0
  407. package/dist-server/server/modules/providers/list/codex/codex-native-runtime.provider.js.map +1 -0
  408. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +462 -0
  409. package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -0
  410. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +145 -0
  411. package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -0
  412. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +822 -0
  413. package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
  414. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +62 -0
  415. package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -0
  416. package/dist-server/server/modules/providers/list/codex/codex.provider.js +21 -0
  417. package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
  418. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
  419. package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
  420. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
  421. package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
  422. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +100 -0
  423. package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -0
  424. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js +303 -0
  425. package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
  426. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +111 -0
  427. package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -0
  428. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +566 -0
  429. package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
  430. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js +35 -0
  431. package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js.map +1 -0
  432. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +21 -0
  433. package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
  434. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js +91 -0
  435. package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js.map +1 -0
  436. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js +181 -0
  437. package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js.map +1 -0
  438. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +177 -0
  439. package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -0
  440. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +368 -0
  441. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
  442. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +225 -0
  443. package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
  444. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +136 -0
  445. package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -0
  446. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +404 -0
  447. package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -0
  448. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js +62 -0
  449. package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js.map +1 -0
  450. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +21 -0
  451. package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -0
  452. package/dist-server/server/modules/providers/provider.registry.js +31 -0
  453. package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
  454. package/dist-server/server/modules/providers/provider.routes.js +651 -0
  455. package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
  456. package/dist-server/server/modules/providers/services/mcp.service.js +84 -0
  457. package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
  458. package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
  459. package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
  460. package/dist-server/server/modules/providers/services/provider-capabilities.service.js +67 -0
  461. package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -0
  462. package/dist-server/server/modules/providers/services/provider-models.service.js +289 -0
  463. package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -0
  464. package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
  465. package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
  466. package/dist-server/server/modules/providers/services/provider-token-usage.service.js +268 -0
  467. package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
  468. package/dist-server/server/modules/providers/services/session-conversations-search.service.js +974 -0
  469. package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -0
  470. package/dist-server/server/modules/providers/services/session-synchronizer.service.js +56 -0
  471. package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -0
  472. package/dist-server/server/modules/providers/services/session-watch-scheduler.js +130 -0
  473. package/dist-server/server/modules/providers/services/session-watch-scheduler.js.map +1 -0
  474. package/dist-server/server/modules/providers/services/sessions-watcher.service.js +310 -0
  475. package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -0
  476. package/dist-server/server/modules/providers/services/sessions.service.js +349 -0
  477. package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
  478. package/dist-server/server/modules/providers/services/skills.service.js +22 -0
  479. package/dist-server/server/modules/providers/services/skills.service.js.map +1 -0
  480. package/dist-server/server/modules/providers/shared/base/abstract.provider.js +13 -0
  481. package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
  482. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
  483. package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
  484. package/dist-server/server/modules/providers/shared/skills/skills.provider.js +207 -0
  485. package/dist-server/server/modules/providers/shared/skills/skills.provider.js.map +1 -0
  486. package/dist-server/server/modules/providers/tests/claude-auth.test.js +122 -0
  487. package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
  488. package/dist-server/server/modules/providers/tests/claude-sessions.test.js +44 -0
  489. package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
  490. package/dist-server/server/modules/providers/tests/codex-app-server.client.test.js +65 -0
  491. package/dist-server/server/modules/providers/tests/codex-app-server.client.test.js.map +1 -0
  492. package/dist-server/server/modules/providers/tests/codex-native-command.service.test.js +192 -0
  493. package/dist-server/server/modules/providers/tests/codex-native-command.service.test.js.map +1 -0
  494. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.js +26 -0
  495. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.js.map +1 -0
  496. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide.test.js +13 -0
  497. package/dist-server/server/modules/providers/tests/codex-sdk-windows-hide.test.js.map +1 -0
  498. package/dist-server/server/modules/providers/tests/codex-sessions.test.js +202 -0
  499. package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -0
  500. package/dist-server/server/modules/providers/tests/mcp.test.js +291 -0
  501. package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
  502. package/dist-server/server/modules/providers/tests/opencode-models.test.js +19 -0
  503. package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -0
  504. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +424 -0
  505. package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -0
  506. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js +205 -0
  507. package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
  508. package/dist-server/server/modules/providers/tests/provider-models.service.test.js +268 -0
  509. package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -0
  510. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +126 -0
  511. package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
  512. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +166 -0
  513. package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
  514. package/dist-server/server/modules/providers/tests/provider.routes.test.js +161 -0
  515. package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -0
  516. package/dist-server/server/modules/providers/tests/session-watch-scheduler.test.js +76 -0
  517. package/dist-server/server/modules/providers/tests/session-watch-scheduler.test.js.map +1 -0
  518. package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
  519. package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
  520. package/dist-server/server/modules/providers/tests/sessions-watcher-filter.test.js +22 -0
  521. package/dist-server/server/modules/providers/tests/sessions-watcher-filter.test.js.map +1 -0
  522. package/dist-server/server/modules/providers/tests/sessions.service.test.js +87 -0
  523. package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -0
  524. package/dist-server/server/modules/providers/tests/skills.test.js +398 -0
  525. package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -0
  526. package/dist-server/server/modules/settings/index.js +3 -0
  527. package/dist-server/server/modules/settings/index.js.map +1 -0
  528. package/dist-server/server/modules/settings/settings.module.js +35 -0
  529. package/dist-server/server/modules/settings/settings.module.js.map +1 -0
  530. package/dist-server/server/modules/settings/settings.routes.js +34 -0
  531. package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
  532. package/dist-server/server/modules/settings/settings.service.js +116 -0
  533. package/dist-server/server/modules/settings/settings.service.js.map +1 -0
  534. package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
  535. package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
  536. package/dist-server/server/modules/system/index.js +3 -0
  537. package/dist-server/server/modules/system/index.js.map +1 -0
  538. package/dist-server/server/modules/system/system.module.js +44 -0
  539. package/dist-server/server/modules/system/system.module.js.map +1 -0
  540. package/dist-server/server/modules/system/system.routes.js +16 -0
  541. package/dist-server/server/modules/system/system.routes.js.map +1 -0
  542. package/dist-server/server/modules/system/system.service.js +45 -0
  543. package/dist-server/server/modules/system/system.service.js.map +1 -0
  544. package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
  545. package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
  546. package/dist-server/server/modules/taskmaster/index.js +3 -0
  547. package/dist-server/server/modules/taskmaster/index.js.map +1 -0
  548. package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
  549. package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
  550. package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
  551. package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
  552. package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
  553. package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
  554. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +132 -0
  555. package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
  556. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
  557. package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
  558. package/dist-server/server/modules/user/index.js +3 -0
  559. package/dist-server/server/modules/user/index.js.map +1 -0
  560. package/dist-server/server/modules/user/tests/user.service.test.js +53 -0
  561. package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
  562. package/dist-server/server/modules/user/user.module.js +47 -0
  563. package/dist-server/server/modules/user/user.module.js.map +1 -0
  564. package/dist-server/server/modules/user/user.routes.js +44 -0
  565. package/dist-server/server/modules/user/user.routes.js.map +1 -0
  566. package/dist-server/server/modules/user/user.service.js +59 -0
  567. package/dist-server/server/modules/user/user.service.js.map +1 -0
  568. package/dist-server/server/modules/voice/index.js +3 -0
  569. package/dist-server/server/modules/voice/index.js.map +1 -0
  570. package/dist-server/server/modules/voice/tests/voice.service.test.js +86 -0
  571. package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
  572. package/dist-server/server/modules/voice/voice.module.js +44 -0
  573. package/dist-server/server/modules/voice/voice.module.js.map +1 -0
  574. package/dist-server/server/modules/voice/voice.routes.js +87 -0
  575. package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
  576. package/dist-server/server/modules/voice/voice.service.js +148 -0
  577. package/dist-server/server/modules/voice/voice.service.js.map +1 -0
  578. package/dist-server/server/modules/websocket/index.js +4 -0
  579. package/dist-server/server/modules/websocket/index.js.map +1 -0
  580. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +266 -0
  581. package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -0
  582. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +105 -0
  583. package/dist-server/server/modules/websocket/services/chat-session-writer.service.js.map +1 -0
  584. package/dist-server/server/modules/websocket/services/chat-websocket.service.js +310 -0
  585. package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -0
  586. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js +52 -0
  587. package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js.map +1 -0
  588. package/dist-server/server/modules/websocket/services/shell-websocket.service.js +570 -0
  589. package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -0
  590. package/dist-server/server/modules/websocket/services/terminal-replay-store.js +161 -0
  591. package/dist-server/server/modules/websocket/services/terminal-replay-store.js.map +1 -0
  592. package/dist-server/server/modules/websocket/services/websocket-auth.service.js +36 -0
  593. package/dist-server/server/modules/websocket/services/websocket-auth.service.js.map +1 -0
  594. package/dist-server/server/modules/websocket/services/websocket-server.service.js +91 -0
  595. package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -0
  596. package/dist-server/server/modules/websocket/services/websocket-state.service.js +14 -0
  597. package/dist-server/server/modules/websocket/services/websocket-state.service.js.map +1 -0
  598. package/dist-server/server/modules/websocket/services/websocket-writer.service.js +32 -0
  599. package/dist-server/server/modules/websocket/services/websocket-writer.service.js.map +1 -0
  600. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js +40 -0
  601. package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
  602. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +249 -0
  603. package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -0
  604. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +346 -0
  605. package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
  606. package/dist-server/server/modules/websocket/tests/terminal-replay-store.test.js +65 -0
  607. package/dist-server/server/modules/websocket/tests/terminal-replay-store.test.js.map +1 -0
  608. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
  609. package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
  610. package/dist-server/server/modules/worktrees/index.js +3 -0
  611. package/dist-server/server/modules/worktrees/index.js.map +1 -0
  612. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
  613. package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
  614. package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
  615. package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
  616. package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
  617. package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
  618. package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
  619. package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
  620. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
  621. package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
  622. package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
  623. package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
  624. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
  625. package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
  626. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
  627. package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
  628. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
  629. package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
  630. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
  631. package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
  632. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
  633. package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
  634. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
  635. package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
  636. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
  637. package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
  638. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
  639. package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
  640. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
  641. package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
  642. package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
  643. package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
  644. package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
  645. package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
  646. package/dist-server/server/shared/claude-cli-path.js +103 -0
  647. package/dist-server/server/shared/claude-cli-path.js.map +1 -0
  648. package/dist-server/server/shared/frontmatter.js +16 -0
  649. package/dist-server/server/shared/frontmatter.js.map +1 -0
  650. package/dist-server/server/shared/image-attachments.js +343 -0
  651. package/dist-server/server/shared/image-attachments.js.map +1 -0
  652. package/dist-server/server/shared/interfaces.js +2 -0
  653. package/dist-server/server/shared/interfaces.js.map +1 -0
  654. package/dist-server/server/shared/tests/claude-cli-path.test.js +45 -0
  655. package/dist-server/server/shared/tests/claude-cli-path.test.js.map +1 -0
  656. package/dist-server/server/shared/tests/image-attachments.test.js +262 -0
  657. package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -0
  658. package/dist-server/server/shared/tests/slice-tail-page.test.js +35 -0
  659. package/dist-server/server/shared/tests/slice-tail-page.test.js.map +1 -0
  660. package/dist-server/server/shared/types.js +2 -0
  661. package/dist-server/server/shared/types.js.map +1 -0
  662. package/dist-server/server/shared/utils.js +966 -0
  663. package/dist-server/server/shared/utils.js.map +1 -0
  664. package/dist-server/shared/networkHosts.js +20 -0
  665. package/dist-server/shared/networkHosts.js.map +1 -0
  666. package/electron/assets/logo-macos.icns +0 -0
  667. package/electron/assets/logo-macos.png +0 -0
  668. package/electron/assets/logo-windows.ico +0 -0
  669. package/electron/cloud.js +260 -0
  670. package/electron/desktopNotifications.js +378 -0
  671. package/electron/desktopWindow.js +766 -0
  672. package/electron/launcher/index.html +14 -0
  673. package/electron/launcher/launcher.css +801 -0
  674. package/electron/launcher/launcher.js +687 -0
  675. package/electron/localServer.js +549 -0
  676. package/electron/main.js +944 -0
  677. package/electron/preload.cjs +60 -0
  678. package/electron/scripts/generate-macos-icon.js +62 -0
  679. package/electron/serverInstaller.js +277 -0
  680. package/electron/tabs.js +87 -0
  681. package/electron/viewHost.js +331 -0
  682. package/package.json +259 -0
  683. package/public/api-docs.html +901 -0
  684. package/scripts/fix-codex-sdk-windows-hide.js +66 -0
  685. package/scripts/fix-node-pty.js +67 -0
  686. package/scripts/promote-dist-server.mjs +50 -0
  687. package/scripts/release/build-server-bundle.js +176 -0
  688. package/scripts/release/prepare-desktop-app.js +152 -0
  689. package/server/index.ts +400 -0
  690. package/server/load-env.ts +47 -0
  691. package/server/modules/agent/agent.module.ts +52 -0
  692. package/server/modules/agent/agent.routes.ts +1287 -0
  693. package/server/modules/agent/index.ts +2 -0
  694. package/server/modules/agent/tests/agent.routes.test.ts +205 -0
  695. package/server/modules/assets/assets.routes.ts +150 -0
  696. package/server/modules/assets/index.ts +3 -0
  697. package/server/modules/assets/services/image-assets.service.ts +127 -0
  698. package/server/modules/assets/tests/image-assets.service.test.ts +74 -0
  699. package/server/modules/auth/auth.middleware.ts +163 -0
  700. package/server/modules/auth/auth.module.ts +38 -0
  701. package/server/modules/auth/auth.routes.ts +57 -0
  702. package/server/modules/auth/auth.service.ts +155 -0
  703. package/server/modules/auth/index.ts +9 -0
  704. package/server/modules/auth/tests/auth.service.test.ts +95 -0
  705. package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -0
  706. package/server/modules/browser-use/browser-use-mcp.ts +386 -0
  707. package/server/modules/browser-use/browser-use-runtime.ts +10 -0
  708. package/server/modules/browser-use/browser-use.routes.ts +96 -0
  709. package/server/modules/browser-use/browser-use.service.ts +836 -0
  710. package/server/modules/browser-use/index.ts +11 -0
  711. package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -0
  712. package/server/modules/cli/cli.module.ts +95 -0
  713. package/server/modules/cli/cli.service.ts +260 -0
  714. package/server/modules/cli/cli.ts +19 -0
  715. package/server/modules/cli/index.ts +2 -0
  716. package/server/modules/cli/sandbox.service.ts +413 -0
  717. package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -0
  718. package/server/modules/cli/tests/cli.service.test.ts +98 -0
  719. package/server/modules/cli/tests/sandbox.service.test.ts +64 -0
  720. package/server/modules/commands/commands.module.ts +22 -0
  721. package/server/modules/commands/commands.routes.ts +655 -0
  722. package/server/modules/commands/index.ts +2 -0
  723. package/server/modules/commands/tests/commands.test.ts +171 -0
  724. package/server/modules/database/connection.ts +143 -0
  725. package/server/modules/database/index.ts +17 -0
  726. package/server/modules/database/init-db.ts +17 -0
  727. package/server/modules/database/migrations.ts +515 -0
  728. package/server/modules/database/repositories/api-keys.ts +119 -0
  729. package/server/modules/database/repositories/app-config.ts +53 -0
  730. package/server/modules/database/repositories/credentials.ts +106 -0
  731. package/server/modules/database/repositories/github-tokens.ts +100 -0
  732. package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -0
  733. package/server/modules/database/repositories/notification-preferences.ts +117 -0
  734. package/server/modules/database/repositories/projects.db.ts +196 -0
  735. package/server/modules/database/repositories/provider-models.ts +168 -0
  736. package/server/modules/database/repositories/push-subscriptions.ts +80 -0
  737. package/server/modules/database/repositories/scan-state.db.ts +42 -0
  738. package/server/modules/database/repositories/sessions.db.ts +524 -0
  739. package/server/modules/database/repositories/users.ts +140 -0
  740. package/server/modules/database/repositories/vapid-keys.ts +57 -0
  741. package/server/modules/database/schema.ts +210 -0
  742. package/server/modules/database/tests/projects.db.integration.test.ts +72 -0
  743. package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
  744. package/server/modules/database/tests/sessions-provider-mapping.test.ts +109 -0
  745. package/server/modules/database/tests/sessions.db.integration.test.ts +116 -0
  746. package/server/modules/file-tree/file-tree.module.ts +116 -0
  747. package/server/modules/file-tree/file-tree.routes.ts +258 -0
  748. package/server/modules/file-tree/file-tree.service.ts +675 -0
  749. package/server/modules/file-tree/index.ts +2 -0
  750. package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
  751. package/server/modules/file-tree/tests/file-tree.service.test.ts +371 -0
  752. package/server/modules/git/git-branch.service.ts +43 -0
  753. package/server/modules/git/git-parsing.service.ts +66 -0
  754. package/server/modules/git/git.module.ts +22 -0
  755. package/server/modules/git/git.routes.ts +1601 -0
  756. package/server/modules/git/index.ts +2 -0
  757. package/server/modules/git/tests/git-branch.service.test.ts +60 -0
  758. package/server/modules/git/tests/git-init.routes.test.ts +179 -0
  759. package/server/modules/git/tests/git.test.ts +106 -0
  760. package/server/modules/notifications/index.ts +24 -0
  761. package/server/modules/notifications/notifications.routes.ts +127 -0
  762. package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -0
  763. package/server/modules/notifications/services/notification-orchestrator.service.js +310 -0
  764. package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
  765. package/server/modules/notifications/vapid-keys.service.ts +38 -0
  766. package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -0
  767. package/server/modules/plugins/index.ts +9 -0
  768. package/server/modules/plugins/plugin-process.service.ts +217 -0
  769. package/server/modules/plugins/plugin-registry.service.ts +459 -0
  770. package/server/modules/plugins/plugins.module.ts +33 -0
  771. package/server/modules/plugins/plugins.routes.ts +66 -0
  772. package/server/modules/plugins/plugins.service.ts +147 -0
  773. package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
  774. package/server/modules/projects/index.ts +11 -0
  775. package/server/modules/projects/projects.routes.ts +273 -0
  776. package/server/modules/projects/services/project-clone.service.ts +323 -0
  777. package/server/modules/projects/services/project-delete.service.ts +90 -0
  778. package/server/modules/projects/services/project-management.service.ts +144 -0
  779. package/server/modules/projects/services/project-star.service.ts +78 -0
  780. package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -0
  781. package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +314 -0
  782. package/server/modules/projects/tests/project-clone.service.test.ts +183 -0
  783. package/server/modules/projects/tests/project-management.service.test.ts +117 -0
  784. package/server/modules/projects/tests/project-star.service.test.ts +123 -0
  785. package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -0
  786. package/server/modules/providers/README.md +380 -0
  787. package/server/modules/providers/index.ts +10 -0
  788. package/server/modules/providers/list/claude/claude-auth.provider.ts +160 -0
  789. package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
  790. package/server/modules/providers/list/claude/claude-models.provider.ts +294 -0
  791. package/server/modules/providers/list/claude/claude-runtime.provider.js +1068 -0
  792. package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +203 -0
  793. package/server/modules/providers/list/claude/claude-sessions.provider.ts +684 -0
  794. package/server/modules/providers/list/claude/claude-skills.provider.ts +265 -0
  795. package/server/modules/providers/list/claude/claude.provider.ts +30 -0
  796. package/server/modules/providers/list/codex/codex-app-server.client.ts +226 -0
  797. package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
  798. package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
  799. package/server/modules/providers/list/codex/codex-models.provider.ts +123 -0
  800. package/server/modules/providers/list/codex/codex-native-command.service.ts +31 -0
  801. package/server/modules/providers/list/codex/codex-native-runtime.provider.ts +577 -0
  802. package/server/modules/providers/list/codex/codex-runtime.provider.js +533 -0
  803. package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +203 -0
  804. package/server/modules/providers/list/codex/codex-sessions.provider.ts +938 -0
  805. package/server/modules/providers/list/codex/codex-skills.provider.ts +73 -0
  806. package/server/modules/providers/list/codex/codex.provider.ts +30 -0
  807. package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
  808. package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
  809. package/server/modules/providers/list/cursor/cursor-models.provider.ts +119 -0
  810. package/server/modules/providers/list/cursor/cursor-runtime.provider.js +385 -0
  811. package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +159 -0
  812. package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +654 -0
  813. package/server/modules/providers/list/cursor/cursor-skills.provider.ts +39 -0
  814. package/server/modules/providers/list/cursor/cursor.provider.ts +30 -0
  815. package/server/modules/providers/list/opencode/opencode-auth.provider.ts +110 -0
  816. package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +228 -0
  817. package/server/modules/providers/list/opencode/opencode-models.provider.ts +203 -0
  818. package/server/modules/providers/list/opencode/opencode-runtime.provider.js +434 -0
  819. package/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +261 -0
  820. package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +179 -0
  821. package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +500 -0
  822. package/server/modules/providers/list/opencode/opencode-skills.provider.ts +78 -0
  823. package/server/modules/providers/list/opencode/opencode.provider.ts +30 -0
  824. package/server/modules/providers/provider.registry.ts +36 -0
  825. package/server/modules/providers/provider.routes.ts +877 -0
  826. package/server/modules/providers/services/mcp.service.ts +109 -0
  827. package/server/modules/providers/services/provider-auth.service.ts +26 -0
  828. package/server/modules/providers/services/provider-capabilities.service.ts +97 -0
  829. package/server/modules/providers/services/provider-models.service.ts +401 -0
  830. package/server/modules/providers/services/provider-runtime.service.ts +108 -0
  831. package/server/modules/providers/services/provider-token-usage.service.ts +357 -0
  832. package/server/modules/providers/services/session-conversations-search.service.ts +1321 -0
  833. package/server/modules/providers/services/session-synchronizer.service.ts +74 -0
  834. package/server/modules/providers/services/session-watch-scheduler.ts +183 -0
  835. package/server/modules/providers/services/sessions-watcher.service.ts +377 -0
  836. package/server/modules/providers/services/sessions.service.ts +471 -0
  837. package/server/modules/providers/services/skills.service.ts +39 -0
  838. package/server/modules/providers/shared/base/abstract.provider.ts +32 -0
  839. package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
  840. package/server/modules/providers/shared/skills/skills.provider.ts +287 -0
  841. package/server/modules/providers/tests/claude-auth.test.ts +150 -0
  842. package/server/modules/providers/tests/claude-sessions.test.ts +61 -0
  843. package/server/modules/providers/tests/codex-app-server.client.test.ts +74 -0
  844. package/server/modules/providers/tests/codex-native-command.service.test.ts +223 -0
  845. package/server/modules/providers/tests/codex-sdk-windows-hide-patch.test.ts +33 -0
  846. package/server/modules/providers/tests/codex-sdk-windows-hide.test.ts +20 -0
  847. package/server/modules/providers/tests/codex-sessions.test.ts +231 -0
  848. package/server/modules/providers/tests/mcp.test.ts +349 -0
  849. package/server/modules/providers/tests/opencode-models.test.ts +41 -0
  850. package/server/modules/providers/tests/opencode-sessions.test.ts +522 -0
  851. package/server/modules/providers/tests/provider-attachment-history.test.ts +247 -0
  852. package/server/modules/providers/tests/provider-models.service.test.ts +353 -0
  853. package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -0
  854. package/server/modules/providers/tests/provider-token-usage.service.test.ts +186 -0
  855. package/server/modules/providers/tests/provider.routes.test.ts +244 -0
  856. package/server/modules/providers/tests/session-watch-scheduler.test.ts +87 -0
  857. package/server/modules/providers/tests/sessions-details.test.ts +73 -0
  858. package/server/modules/providers/tests/sessions-watcher-filter.test.ts +27 -0
  859. package/server/modules/providers/tests/sessions.service.test.ts +127 -0
  860. package/server/modules/providers/tests/skills.test.ts +692 -0
  861. package/server/modules/settings/index.ts +2 -0
  862. package/server/modules/settings/settings.module.ts +50 -0
  863. package/server/modules/settings/settings.routes.ts +51 -0
  864. package/server/modules/settings/settings.service.ts +186 -0
  865. package/server/modules/settings/tests/settings.service.test.ts +54 -0
  866. package/server/modules/system/index.ts +2 -0
  867. package/server/modules/system/system.module.ts +62 -0
  868. package/server/modules/system/system.routes.ts +21 -0
  869. package/server/modules/system/system.service.ts +76 -0
  870. package/server/modules/system/tests/system.service.test.ts +118 -0
  871. package/server/modules/taskmaster/index.ts +2 -0
  872. package/server/modules/taskmaster/taskmaster.module.ts +24 -0
  873. package/server/modules/taskmaster/taskmaster.routes.ts +1482 -0
  874. package/server/modules/taskmaster/taskmaster.service.ts +132 -0
  875. package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +144 -0
  876. package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
  877. package/server/modules/user/index.ts +2 -0
  878. package/server/modules/user/tests/user.service.test.ts +61 -0
  879. package/server/modules/user/user.module.ts +58 -0
  880. package/server/modules/user/user.routes.ts +50 -0
  881. package/server/modules/user/user.service.ts +85 -0
  882. package/server/modules/voice/index.ts +2 -0
  883. package/server/modules/voice/tests/voice.service.test.ts +98 -0
  884. package/server/modules/voice/voice.module.ts +47 -0
  885. package/server/modules/voice/voice.routes.ts +113 -0
  886. package/server/modules/voice/voice.service.ts +192 -0
  887. package/server/modules/websocket/README.md +273 -0
  888. package/server/modules/websocket/index.ts +3 -0
  889. package/server/modules/websocket/services/chat-run-registry.service.ts +343 -0
  890. package/server/modules/websocket/services/chat-session-writer.service.ts +145 -0
  891. package/server/modules/websocket/services/chat-websocket.service.ts +425 -0
  892. package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -0
  893. package/server/modules/websocket/services/shell-websocket.service.ts +776 -0
  894. package/server/modules/websocket/services/terminal-replay-store.ts +218 -0
  895. package/server/modules/websocket/services/websocket-auth.service.ts +59 -0
  896. package/server/modules/websocket/services/websocket-server.service.ts +127 -0
  897. package/server/modules/websocket/services/websocket-state.service.ts +16 -0
  898. package/server/modules/websocket/services/websocket-writer.service.ts +38 -0
  899. package/server/modules/websocket/tests/chat-attachment-filter.test.ts +59 -0
  900. package/server/modules/websocket/tests/chat-run-registry.test.ts +282 -0
  901. package/server/modules/websocket/tests/shell-websocket.service.test.ts +432 -0
  902. package/server/modules/websocket/tests/terminal-replay-store.test.ts +79 -0
  903. package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
  904. package/server/modules/worktrees/index.ts +2 -0
  905. package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
  906. package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
  907. package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
  908. package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
  909. package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
  910. package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
  911. package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
  912. package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
  913. package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
  914. package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
  915. package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
  916. package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
  917. package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
  918. package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
  919. package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
  920. package/server/modules/worktrees/worktrees.module.ts +113 -0
  921. package/server/modules/worktrees/worktrees.routes.ts +116 -0
  922. package/server/shared/claude-cli-path.ts +139 -0
  923. package/server/shared/frontmatter.ts +18 -0
  924. package/server/shared/image-attachments.ts +435 -0
  925. package/server/shared/interfaces.ts +179 -0
  926. package/server/shared/tests/claude-cli-path.test.ts +61 -0
  927. package/server/shared/tests/image-attachments.test.ts +353 -0
  928. package/server/shared/tests/slice-tail-page.test.ts +42 -0
  929. package/server/shared/types.ts +1268 -0
  930. package/server/shared/utils.ts +1161 -0
  931. package/server/tsconfig.json +40 -0
  932. package/shared/networkHosts.js +22 -0
@@ -0,0 +1,1482 @@
1
+ // @ts-nocheck -- temporary while Taskmaster workflows are extracted into the injected service.
2
+ /**
3
+ * TASKMASTER API ROUTES
4
+ * ====================
5
+ *
6
+ * This module provides API endpoints for TaskMaster integration including:
7
+ * - .taskmaster folder detection in project directories
8
+ * - MCP server configuration detection
9
+ * - TaskMaster state and metadata management
10
+ */
11
+
12
+ import path from 'path';
13
+
14
+ import express from 'express';
15
+
16
+ import type { createTaskmasterService } from './taskmaster.service.js';
17
+ // cross-spawn: drop-in spawn with Windows .cmd/PATHEXT resolution — required
18
+ // here since task-master/npx are .cmd shims on Windows.
19
+
20
+ type TaskmasterRouterDependencies = {
21
+ fileSystem: typeof import('node:fs');
22
+ fileSystemPromises: typeof import('node:fs/promises');
23
+ spawnProcess: typeof import('cross-spawn').default;
24
+ resolveProjectPathById(projectId: string): string | null;
25
+ taskmasterService: ReturnType<typeof createTaskmasterService>;
26
+ };
27
+
28
+ function broadcastTaskMasterUpdate(wss, type, projectId, payloadKey, payload) {
29
+ if (!wss || !projectId) return;
30
+ const message = JSON.stringify({
31
+ type,
32
+ projectId,
33
+ ...(payload === undefined ? {} : { [payloadKey]: payload }),
34
+ timestamp: new Date().toISOString(),
35
+ });
36
+ wss.clients.forEach((client) => {
37
+ if (client.readyState === 1) client.send(message);
38
+ });
39
+ }
40
+
41
+ function broadcastTaskMasterProjectUpdate(wss, projectId, taskMasterData) {
42
+ broadcastTaskMasterUpdate(
43
+ wss,
44
+ 'taskmaster-project-updated',
45
+ projectId,
46
+ 'taskMasterData',
47
+ taskMasterData,
48
+ );
49
+ }
50
+
51
+ function broadcastTaskMasterTasksUpdate(wss, projectId, tasksData) {
52
+ broadcastTaskMasterUpdate(wss, 'taskmaster-tasks-updated', projectId, 'tasksData', tasksData);
53
+ }
54
+
55
+ /**
56
+ * Resolve the absolute project directory from a DB-assigned `projectId`.
57
+ *
58
+ * TaskMaster routes used to accept a Claude-encoded folder name (`projectName`)
59
+ * and derive the path from JSONL history. After the projectId migration the
60
+ * only identifier we accept is the primary key of the `projects` table, so
61
+ * every handler calls this helper and 404s when the id is unknown.
62
+ */
63
+ /** Creates Taskmaster routes around explicit filesystem, process, MCP, and project adapters. */
64
+ export function createTaskmasterRouter(dependencies: TaskmasterRouterDependencies): express.Router {
65
+ const fs = dependencies.fileSystem;
66
+ const fsPromises = dependencies.fileSystemPromises;
67
+ const spawn = dependencies.spawnProcess;
68
+ const taskmasterService = dependencies.taskmasterService;
69
+ const resolveProjectPathFromId = async (projectId) => projectId
70
+ ? dependencies.resolveProjectPathById(projectId)
71
+ : null;
72
+ const router = express.Router();
73
+
74
+ function runTaskmasterProcess(command, args, options, onComplete) {
75
+ const child = spawn(command, args, options);
76
+ let stdout = '';
77
+ let stderr = '';
78
+ let settled = false;
79
+
80
+ child.stdout.on('data', (data) => {
81
+ stdout += data.toString();
82
+ });
83
+ child.stderr.on('data', (data) => {
84
+ stderr += data.toString();
85
+ });
86
+
87
+ const settle = (code, error = null) => {
88
+ if (settled) return;
89
+ settled = true;
90
+ onComplete({ code, error, stdout, stderr });
91
+ };
92
+
93
+ child.once('error', (error) => settle(null, error));
94
+ child.once('close', (code) => settle(code));
95
+ return child;
96
+ }
97
+
98
+ /**
99
+ * Check if TaskMaster CLI is installed globally
100
+ * @returns {Promise<Object>} Installation status result
101
+ */
102
+ async function checkTaskMasterInstallation() {
103
+ return new Promise((resolve) => {
104
+ // Check if task-master command is available
105
+ const child = spawn('which', ['task-master'], {
106
+ stdio: ['ignore', 'pipe', 'pipe'],
107
+ shell: true
108
+ });
109
+
110
+ let output = '';
111
+ let errorOutput = '';
112
+
113
+ child.stdout.on('data', (data) => {
114
+ output += data.toString();
115
+ });
116
+
117
+ child.stderr.on('data', (data) => {
118
+ errorOutput += data.toString();
119
+ });
120
+
121
+ child.on('close', (code) => {
122
+ if (code === 0 && output.trim()) {
123
+ // TaskMaster is installed, get version
124
+ const versionChild = spawn('task-master', ['--version'], {
125
+ stdio: ['ignore', 'pipe', 'pipe'],
126
+ shell: true
127
+ });
128
+
129
+ let versionOutput = '';
130
+
131
+ versionChild.stdout.on('data', (data) => {
132
+ versionOutput += data.toString();
133
+ });
134
+
135
+ versionChild.on('close', (versionCode) => {
136
+ resolve({
137
+ isInstalled: true,
138
+ installPath: output.trim(),
139
+ version: versionCode === 0 ? versionOutput.trim() : 'unknown',
140
+ reason: null
141
+ });
142
+ });
143
+
144
+ versionChild.on('error', () => {
145
+ resolve({
146
+ isInstalled: true,
147
+ installPath: output.trim(),
148
+ version: 'unknown',
149
+ reason: null
150
+ });
151
+ });
152
+ } else {
153
+ resolve({
154
+ isInstalled: false,
155
+ installPath: null,
156
+ version: null,
157
+ reason: 'TaskMaster CLI not found in PATH'
158
+ });
159
+ }
160
+ });
161
+
162
+ child.on('error', (error) => {
163
+ resolve({
164
+ isInstalled: false,
165
+ installPath: null,
166
+ version: null,
167
+ reason: `Error checking installation: ${error.message}`
168
+ });
169
+ });
170
+ });
171
+ }
172
+
173
+ // API Routes
174
+
175
+ /**
176
+ * GET /api/taskmaster/installation-status
177
+ * Check if TaskMaster CLI is installed on the system
178
+ */
179
+ router.get('/installation-status', async (req, res) => {
180
+ try {
181
+ const installationStatus = await checkTaskMasterInstallation();
182
+
183
+ // Also check for MCP server configuration
184
+ const mcpStatus = await taskmasterService.detectMcpServer();
185
+
186
+ res.json({
187
+ success: true,
188
+ installation: installationStatus,
189
+ mcpServer: mcpStatus,
190
+ isReady: installationStatus.isInstalled && mcpStatus.hasMCPServer
191
+ });
192
+ } catch (error) {
193
+ console.error('Error checking TaskMaster installation:', error);
194
+ res.status(500).json({
195
+ success: false,
196
+ error: 'Failed to check TaskMaster installation status',
197
+ installation: {
198
+ isInstalled: false,
199
+ reason: `Server error: ${error.message}`
200
+ },
201
+ mcpServer: {
202
+ hasMCPServer: false,
203
+ reason: `Server error: ${error.message}`
204
+ },
205
+ isReady: false
206
+ });
207
+ }
208
+ });
209
+
210
+ /**
211
+ * GET /api/taskmaster/mcp-status
212
+ * Check whether TaskMaster is configured in the user's Claude MCP settings.
213
+ */
214
+ router.get('/mcp-status', async (_req, res) => {
215
+ try {
216
+ res.json(await taskmasterService.detectMcpServer());
217
+ } catch (error) {
218
+ const message = error instanceof Error ? error.message : 'Unknown error';
219
+ console.error('TaskMaster MCP detection error:', error);
220
+ res.status(500).json({
221
+ error: 'Failed to detect TaskMaster MCP server',
222
+ message
223
+ });
224
+ }
225
+ });
226
+
227
+ /**
228
+ * GET /api/taskmaster/tasks/:projectId
229
+ * Load actual tasks from .taskmaster/tasks/tasks.json
230
+ *
231
+ * `projectId` is the DB primary key of the project; the folder is resolved via
232
+ * the projects table rather than extracted from Claude JSONL history.
233
+ */
234
+ router.get('/tasks/:projectId', async (req, res) => {
235
+ try {
236
+ const { projectId } = req.params;
237
+
238
+ // Get project path via the DB; the legacy JSONL-based resolver is gone.
239
+ const projectPath = await resolveProjectPathFromId(projectId);
240
+ if (!projectPath) {
241
+ return res.status(404).json({
242
+ error: 'Project not found',
243
+ message: `Project "${projectId}" does not exist`
244
+ });
245
+ }
246
+
247
+ const taskMasterPath = path.join(projectPath, '.taskmaster');
248
+ const tasksFilePath = path.join(taskMasterPath, 'tasks', 'tasks.json');
249
+
250
+ // Check if tasks file exists
251
+ try {
252
+ await fsPromises.access(tasksFilePath);
253
+ } catch (error) {
254
+ return res.json({
255
+ projectId,
256
+ tasks: [],
257
+ message: 'No tasks.json file found'
258
+ });
259
+ }
260
+
261
+ // Read and parse tasks file
262
+ try {
263
+ const tasksContent = await fsPromises.readFile(tasksFilePath, 'utf8');
264
+ const tasksData = JSON.parse(tasksContent);
265
+
266
+ let tasks = [];
267
+ let currentTag = 'master';
268
+
269
+ // Handle both tagged and legacy formats
270
+ if (Array.isArray(tasksData)) {
271
+ // Legacy format
272
+ tasks = tasksData;
273
+ } else if (tasksData.tasks) {
274
+ // Simple format with tasks array
275
+ tasks = tasksData.tasks;
276
+ } else {
277
+ // Tagged format - get tasks from current tag or master
278
+ if (tasksData[currentTag] && tasksData[currentTag].tasks) {
279
+ tasks = tasksData[currentTag].tasks;
280
+ } else if (tasksData.master && tasksData.master.tasks) {
281
+ tasks = tasksData.master.tasks;
282
+ } else {
283
+ // Get tasks from first available tag
284
+ const firstTag = Object.keys(tasksData).find(key =>
285
+ tasksData[key].tasks && Array.isArray(tasksData[key].tasks)
286
+ );
287
+ if (firstTag) {
288
+ tasks = tasksData[firstTag].tasks;
289
+ currentTag = firstTag;
290
+ }
291
+ }
292
+ }
293
+
294
+ // Transform tasks to ensure all have required fields
295
+ const transformedTasks = tasks.map(task => ({
296
+ id: task.id,
297
+ title: task.title || 'Untitled Task',
298
+ description: task.description || '',
299
+ status: task.status || 'pending',
300
+ priority: task.priority || 'medium',
301
+ dependencies: task.dependencies || [],
302
+ createdAt: task.createdAt || task.created || new Date().toISOString(),
303
+ updatedAt: task.updatedAt || task.updated || new Date().toISOString(),
304
+ details: task.details || '',
305
+ testStrategy: task.testStrategy || task.test_strategy || '',
306
+ subtasks: task.subtasks || []
307
+ }));
308
+
309
+ res.json({
310
+ projectId,
311
+ projectPath,
312
+ tasks: transformedTasks,
313
+ currentTag,
314
+ totalTasks: transformedTasks.length,
315
+ tasksByStatus: {
316
+ pending: transformedTasks.filter(t => t.status === 'pending').length,
317
+ 'in-progress': transformedTasks.filter(t => t.status === 'in-progress').length,
318
+ done: transformedTasks.filter(t => t.status === 'done').length,
319
+ review: transformedTasks.filter(t => t.status === 'review').length,
320
+ deferred: transformedTasks.filter(t => t.status === 'deferred').length,
321
+ cancelled: transformedTasks.filter(t => t.status === 'cancelled').length
322
+ },
323
+ timestamp: new Date().toISOString()
324
+ });
325
+
326
+ } catch (parseError) {
327
+ console.error('Failed to parse tasks.json:', parseError);
328
+ return res.status(500).json({
329
+ error: 'Failed to parse tasks file',
330
+ message: parseError.message
331
+ });
332
+ }
333
+
334
+ } catch (error) {
335
+ console.error('TaskMaster tasks loading error:', error);
336
+ res.status(500).json({
337
+ error: 'Failed to load TaskMaster tasks',
338
+ message: error.message
339
+ });
340
+ }
341
+ });
342
+
343
+ /**
344
+ * GET /api/taskmaster/prd/:projectId
345
+ * List all PRD files in the project's .taskmaster/docs directory
346
+ */
347
+ router.get('/prd/:projectId', async (req, res) => {
348
+ try {
349
+ const { projectId } = req.params;
350
+
351
+ // projectId → projectPath lookup through the DB (post-migration).
352
+ const projectPath = await resolveProjectPathFromId(projectId);
353
+ if (!projectPath) {
354
+ return res.status(404).json({
355
+ error: 'Project not found',
356
+ message: `Project "${projectId}" does not exist`
357
+ });
358
+ }
359
+
360
+ const docsPath = path.join(projectPath, '.taskmaster', 'docs');
361
+
362
+ // Check if docs directory exists
363
+ try {
364
+ await fsPromises.access(docsPath, fs.constants.R_OK);
365
+ } catch (error) {
366
+ return res.json({
367
+ projectId,
368
+ prdFiles: [],
369
+ message: 'No .taskmaster/docs directory found'
370
+ });
371
+ }
372
+
373
+ // Read directory and filter for PRD files
374
+ try {
375
+ const files = await fsPromises.readdir(docsPath);
376
+ const prdFiles = [];
377
+
378
+ for (const file of files) {
379
+ const filePath = path.join(docsPath, file);
380
+ const stats = await fsPromises.stat(filePath);
381
+
382
+ if (stats.isFile() && (file.endsWith('.txt') || file.endsWith('.md'))) {
383
+ prdFiles.push({
384
+ name: file,
385
+ path: path.relative(projectPath, filePath),
386
+ size: stats.size,
387
+ modified: stats.mtime.toISOString(),
388
+ created: stats.birthtime.toISOString()
389
+ });
390
+ }
391
+ }
392
+
393
+ res.json({
394
+ projectId,
395
+ projectPath,
396
+ prdFiles: prdFiles.sort((a, b) => new Date(b.modified) - new Date(a.modified)),
397
+ timestamp: new Date().toISOString()
398
+ });
399
+
400
+ } catch (readError) {
401
+ console.error('Error reading docs directory:', readError);
402
+ return res.status(500).json({
403
+ error: 'Failed to read PRD files',
404
+ message: readError.message
405
+ });
406
+ }
407
+
408
+ } catch (error) {
409
+ console.error('PRD list error:', error);
410
+ res.status(500).json({
411
+ error: 'Failed to list PRD files',
412
+ message: error.message
413
+ });
414
+ }
415
+ });
416
+
417
+ /**
418
+ * POST /api/taskmaster/prd/:projectId
419
+ * Create or update a PRD file in the project's .taskmaster/docs directory
420
+ */
421
+ router.post('/prd/:projectId', async (req, res) => {
422
+ try {
423
+ const { projectId } = req.params;
424
+ const { fileName, content } = req.body;
425
+
426
+ if (!fileName || !content) {
427
+ return res.status(400).json({
428
+ error: 'Missing required fields',
429
+ message: 'fileName and content are required'
430
+ });
431
+ }
432
+
433
+ // Validate filename
434
+ if (!fileName.match(/^[\w\-. ]+\.(txt|md)$/)) {
435
+ return res.status(400).json({
436
+ error: 'Invalid filename',
437
+ message: 'Filename must end with .txt or .md and contain only alphanumeric characters, spaces, dots, and dashes'
438
+ });
439
+ }
440
+
441
+ // Resolve the project folder through the DB using the projectId param.
442
+ const projectPath = await resolveProjectPathFromId(projectId);
443
+ if (!projectPath) {
444
+ return res.status(404).json({
445
+ error: 'Project not found',
446
+ message: `Project "${projectId}" does not exist`
447
+ });
448
+ }
449
+
450
+ const docsPath = path.join(projectPath, '.taskmaster', 'docs');
451
+ const filePath = path.join(docsPath, fileName);
452
+
453
+ // Ensure docs directory exists
454
+ try {
455
+ await fsPromises.mkdir(docsPath, { recursive: true });
456
+ } catch (error) {
457
+ console.error('Failed to create docs directory:', error);
458
+ return res.status(500).json({
459
+ error: 'Failed to create directory',
460
+ message: error.message
461
+ });
462
+ }
463
+
464
+ // Write the PRD file
465
+ try {
466
+ await fsPromises.writeFile(filePath, content, 'utf8');
467
+
468
+ // Get file stats
469
+ const stats = await fsPromises.stat(filePath);
470
+
471
+ res.json({
472
+ projectId,
473
+ projectPath,
474
+ fileName,
475
+ filePath: path.relative(projectPath, filePath),
476
+ size: stats.size,
477
+ created: stats.birthtime.toISOString(),
478
+ modified: stats.mtime.toISOString(),
479
+ message: 'PRD file saved successfully',
480
+ timestamp: new Date().toISOString()
481
+ });
482
+
483
+ } catch (writeError) {
484
+ console.error('Failed to write PRD file:', writeError);
485
+ return res.status(500).json({
486
+ error: 'Failed to write PRD file',
487
+ message: writeError.message
488
+ });
489
+ }
490
+
491
+ } catch (error) {
492
+ console.error('PRD create/update error:', error);
493
+ res.status(500).json({
494
+ error: 'Failed to create/update PRD file',
495
+ message: error.message
496
+ });
497
+ }
498
+ });
499
+
500
+ /**
501
+ * GET /api/taskmaster/prd/:projectId/:fileName
502
+ * Get content of a specific PRD file
503
+ */
504
+ router.get('/prd/:projectId/:fileName', async (req, res) => {
505
+ try {
506
+ const { projectId, fileName } = req.params;
507
+
508
+ const projectPath = await resolveProjectPathFromId(projectId);
509
+ if (!projectPath) {
510
+ return res.status(404).json({
511
+ error: 'Project not found',
512
+ message: `Project "${projectId}" does not exist`
513
+ });
514
+ }
515
+
516
+ const filePath = path.join(projectPath, '.taskmaster', 'docs', fileName);
517
+
518
+ // Check if file exists
519
+ try {
520
+ await fsPromises.access(filePath, fs.constants.R_OK);
521
+ } catch (error) {
522
+ return res.status(404).json({
523
+ error: 'PRD file not found',
524
+ message: `File "${fileName}" does not exist`
525
+ });
526
+ }
527
+
528
+ // Read file content
529
+ try {
530
+ const content = await fsPromises.readFile(filePath, 'utf8');
531
+ const stats = await fsPromises.stat(filePath);
532
+
533
+ res.json({
534
+ projectId,
535
+ projectPath,
536
+ fileName,
537
+ filePath: path.relative(projectPath, filePath),
538
+ content,
539
+ size: stats.size,
540
+ created: stats.birthtime.toISOString(),
541
+ modified: stats.mtime.toISOString(),
542
+ timestamp: new Date().toISOString()
543
+ });
544
+
545
+ } catch (readError) {
546
+ console.error('Failed to read PRD file:', readError);
547
+ return res.status(500).json({
548
+ error: 'Failed to read PRD file',
549
+ message: readError.message
550
+ });
551
+ }
552
+
553
+ } catch (error) {
554
+ console.error('PRD read error:', error);
555
+ res.status(500).json({
556
+ error: 'Failed to read PRD file',
557
+ message: error.message
558
+ });
559
+ }
560
+ });
561
+
562
+ /**
563
+ * POST /api/taskmaster/init/:projectId
564
+ * Initialize TaskMaster in a project
565
+ */
566
+ router.post('/init/:projectId', async (req, res) => {
567
+ try {
568
+ const { projectId } = req.params;
569
+
570
+ const projectPath = await resolveProjectPathFromId(projectId);
571
+ if (!projectPath) {
572
+ return res.status(404).json({
573
+ error: 'Project not found',
574
+ message: `Project "${projectId}" does not exist`
575
+ });
576
+ }
577
+
578
+ // Check if TaskMaster is already initialized
579
+ const taskMasterPath = path.join(projectPath, '.taskmaster');
580
+ try {
581
+ await fsPromises.access(taskMasterPath, fs.constants.F_OK);
582
+ return res.status(400).json({
583
+ error: 'TaskMaster already initialized',
584
+ message: 'TaskMaster is already configured for this project'
585
+ });
586
+ } catch (error) {
587
+ // Directory doesn't exist, we can proceed
588
+ }
589
+
590
+ // Run taskmaster init command
591
+ const initProcess = runTaskmasterProcess('npx', ['task-master', 'init'], {
592
+ cwd: projectPath,
593
+ stdio: ['pipe', 'pipe', 'pipe']
594
+ }, ({ code, error, stdout, stderr }) => {
595
+ if (code === 0) {
596
+ // Broadcast TaskMaster project update via WebSocket. The
597
+ // WebSocket payload keeps using `projectId` so the frontend
598
+ // can match notifications against the current selection.
599
+ if (req.app.locals.wss) {
600
+ broadcastTaskMasterProjectUpdate(
601
+ req.app.locals.wss,
602
+ projectId,
603
+ { hasTaskmaster: true, status: 'initialized' }
604
+ );
605
+ }
606
+
607
+ res.json({
608
+ projectId,
609
+ projectPath,
610
+ message: 'TaskMaster initialized successfully',
611
+ output: stdout,
612
+ timestamp: new Date().toISOString()
613
+ });
614
+ } else {
615
+ console.error('TaskMaster init failed:', stderr);
616
+ res.status(500).json({
617
+ error: 'Failed to initialize TaskMaster',
618
+ message: error?.message || stderr || stdout,
619
+ code
620
+ });
621
+ }
622
+ });
623
+
624
+ // Send 'yes' responses to automated prompts
625
+ initProcess.stdin.write('yes\n');
626
+ initProcess.stdin.end();
627
+
628
+ } catch (error) {
629
+ console.error('TaskMaster init error:', error);
630
+ res.status(500).json({
631
+ error: 'Failed to initialize TaskMaster',
632
+ message: error.message
633
+ });
634
+ }
635
+ });
636
+
637
+ /**
638
+ * POST /api/taskmaster/add-task/:projectId
639
+ * Add a new task to the project
640
+ */
641
+ router.post('/add-task/:projectId', async (req, res) => {
642
+ try {
643
+ const { projectId } = req.params;
644
+ const { prompt, title, description, priority = 'medium', dependencies } = req.body;
645
+
646
+ if (!prompt && (!title || !description)) {
647
+ return res.status(400).json({
648
+ error: 'Missing required parameters',
649
+ message: 'Either "prompt" or both "title" and "description" are required'
650
+ });
651
+ }
652
+
653
+ const projectPath = await resolveProjectPathFromId(projectId);
654
+ if (!projectPath) {
655
+ return res.status(404).json({
656
+ error: 'Project not found',
657
+ message: `Project "${projectId}" does not exist`
658
+ });
659
+ }
660
+
661
+ // Build the task-master add-task command
662
+ const args = ['task-master-ai', 'add-task'];
663
+
664
+ if (prompt) {
665
+ args.push('--prompt', prompt);
666
+ args.push('--research'); // Use research for AI-generated tasks
667
+ } else {
668
+ args.push('--prompt', `Create a task titled "${title}" with description: ${description}`);
669
+ }
670
+
671
+ if (priority) {
672
+ args.push('--priority', priority);
673
+ }
674
+
675
+ if (dependencies) {
676
+ args.push('--dependencies', dependencies);
677
+ }
678
+
679
+ // Run task-master add-task command
680
+ const addTaskProcess = runTaskmasterProcess('npx', args, {
681
+ cwd: projectPath,
682
+ stdio: ['pipe', 'pipe', 'pipe']
683
+ }, ({ code, error, stdout, stderr }) => {
684
+ console.log('Add task process completed with code:', code);
685
+ console.log('Stdout:', stdout);
686
+ console.log('Stderr:', stderr);
687
+
688
+ if (code === 0) {
689
+ // Broadcast task update via WebSocket using the projectId so
690
+ // clients subscribed to this project get notified immediately.
691
+ if (req.app.locals.wss) {
692
+ broadcastTaskMasterTasksUpdate(
693
+ req.app.locals.wss,
694
+ projectId
695
+ );
696
+ }
697
+
698
+ res.json({
699
+ projectId,
700
+ projectPath,
701
+ message: 'Task added successfully',
702
+ output: stdout,
703
+ timestamp: new Date().toISOString()
704
+ });
705
+ } else {
706
+ console.error('Add task failed:', stderr);
707
+ res.status(500).json({
708
+ error: 'Failed to add task',
709
+ message: error?.message || stderr || stdout,
710
+ code
711
+ });
712
+ }
713
+ });
714
+
715
+ addTaskProcess.stdin.end();
716
+
717
+ } catch (error) {
718
+ console.error('Add task error:', error);
719
+ res.status(500).json({
720
+ error: 'Failed to add task',
721
+ message: error.message
722
+ });
723
+ }
724
+ });
725
+
726
+ /**
727
+ * PUT /api/taskmaster/update-task/:projectId/:taskId
728
+ * Update a specific task using TaskMaster CLI
729
+ */
730
+ router.put('/update-task/:projectId/:taskId', async (req, res) => {
731
+ try {
732
+ const { projectId, taskId } = req.params;
733
+ const { title, description, status, priority, details } = req.body;
734
+
735
+ const projectPath = await resolveProjectPathFromId(projectId);
736
+ if (!projectPath) {
737
+ return res.status(404).json({
738
+ error: 'Project not found',
739
+ message: `Project "${projectId}" does not exist`
740
+ });
741
+ }
742
+
743
+ // If only updating status, use set-status command
744
+ if (status && Object.keys(req.body).length === 1) {
745
+ const setStatusProcess = runTaskmasterProcess('npx', ['task-master-ai', 'set-status', `--id=${taskId}`, `--status=${status}`], {
746
+ cwd: projectPath,
747
+ stdio: ['pipe', 'pipe', 'pipe']
748
+ }, ({ code, error, stdout, stderr }) => {
749
+ if (code === 0) {
750
+ // Broadcast task update via WebSocket
751
+ if (req.app.locals.wss) {
752
+ broadcastTaskMasterTasksUpdate(req.app.locals.wss, projectId);
753
+ }
754
+
755
+ res.json({
756
+ projectId,
757
+ projectPath,
758
+ taskId,
759
+ message: 'Task status updated successfully',
760
+ output: stdout,
761
+ timestamp: new Date().toISOString()
762
+ });
763
+ } else {
764
+ console.error('Set task status failed:', stderr);
765
+ res.status(500).json({
766
+ error: 'Failed to update task status',
767
+ message: error?.message || stderr || stdout,
768
+ code
769
+ });
770
+ }
771
+ });
772
+
773
+ setStatusProcess.stdin.end();
774
+ } else {
775
+ // For other updates, use update-task command with a prompt describing the changes
776
+ const updates = [];
777
+ if (title) updates.push(`title: "${title}"`);
778
+ if (description) updates.push(`description: "${description}"`);
779
+ if (priority) updates.push(`priority: "${priority}"`);
780
+ if (details) updates.push(`details: "${details}"`);
781
+
782
+ const prompt = `Update task with the following changes: ${updates.join(', ')}`;
783
+
784
+ const updateProcess = runTaskmasterProcess('npx', ['task-master-ai', 'update-task', `--id=${taskId}`, `--prompt=${prompt}`], {
785
+ cwd: projectPath,
786
+ stdio: ['pipe', 'pipe', 'pipe']
787
+ }, ({ code, error, stdout, stderr }) => {
788
+ if (code === 0) {
789
+ // Broadcast task update via WebSocket
790
+ if (req.app.locals.wss) {
791
+ broadcastTaskMasterTasksUpdate(req.app.locals.wss, projectId);
792
+ }
793
+
794
+ res.json({
795
+ projectId,
796
+ projectPath,
797
+ taskId,
798
+ message: 'Task updated successfully',
799
+ output: stdout,
800
+ timestamp: new Date().toISOString()
801
+ });
802
+ } else {
803
+ console.error('Update task failed:', stderr);
804
+ res.status(500).json({
805
+ error: 'Failed to update task',
806
+ message: error?.message || stderr || stdout,
807
+ code
808
+ });
809
+ }
810
+ });
811
+
812
+ updateProcess.stdin.end();
813
+ }
814
+
815
+ } catch (error) {
816
+ console.error('Update task error:', error);
817
+ res.status(500).json({
818
+ error: 'Failed to update task',
819
+ message: error.message
820
+ });
821
+ }
822
+ });
823
+
824
+ /**
825
+ * POST /api/taskmaster/parse-prd/:projectId
826
+ * Parse a PRD file to generate tasks
827
+ */
828
+ router.post('/parse-prd/:projectId', async (req, res) => {
829
+ try {
830
+ const { projectId } = req.params;
831
+ const { fileName = 'prd.txt', numTasks, append = false } = req.body;
832
+
833
+ const projectPath = await resolveProjectPathFromId(projectId);
834
+ if (!projectPath) {
835
+ return res.status(404).json({
836
+ error: 'Project not found',
837
+ message: `Project "${projectId}" does not exist`
838
+ });
839
+ }
840
+
841
+ const prdPath = path.join(projectPath, '.taskmaster', 'docs', fileName);
842
+
843
+ // Check if PRD file exists
844
+ try {
845
+ await fsPromises.access(prdPath, fs.constants.F_OK);
846
+ } catch (error) {
847
+ return res.status(404).json({
848
+ error: 'PRD file not found',
849
+ message: `File "${fileName}" does not exist in .taskmaster/docs/`
850
+ });
851
+ }
852
+
853
+ // Build the command args
854
+ const args = ['task-master-ai', 'parse-prd', prdPath];
855
+
856
+ if (numTasks) {
857
+ args.push('--num-tasks', numTasks.toString());
858
+ }
859
+
860
+ if (append) {
861
+ args.push('--append');
862
+ }
863
+
864
+ args.push('--research'); // Use research for better PRD parsing
865
+
866
+ // Run task-master parse-prd command
867
+ const parsePRDProcess = runTaskmasterProcess('npx', args, {
868
+ cwd: projectPath,
869
+ stdio: ['pipe', 'pipe', 'pipe']
870
+ }, ({ code, error, stdout, stderr }) => {
871
+ if (code === 0) {
872
+ // Broadcast task update via WebSocket
873
+ if (req.app.locals.wss) {
874
+ broadcastTaskMasterTasksUpdate(
875
+ req.app.locals.wss,
876
+ projectId
877
+ );
878
+ }
879
+
880
+ res.json({
881
+ projectId,
882
+ projectPath,
883
+ prdFile: fileName,
884
+ message: 'PRD parsed and tasks generated successfully',
885
+ output: stdout,
886
+ timestamp: new Date().toISOString()
887
+ });
888
+ } else {
889
+ console.error('Parse PRD failed:', stderr);
890
+ res.status(500).json({
891
+ error: 'Failed to parse PRD',
892
+ message: error?.message || stderr || stdout,
893
+ code
894
+ });
895
+ }
896
+ });
897
+
898
+ parsePRDProcess.stdin.end();
899
+
900
+ } catch (error) {
901
+ console.error('Parse PRD error:', error);
902
+ res.status(500).json({
903
+ error: 'Failed to parse PRD',
904
+ message: error.message
905
+ });
906
+ }
907
+ });
908
+
909
+ /**
910
+ * GET /api/taskmaster/prd-templates
911
+ * Get available PRD templates
912
+ */
913
+ router.get('/prd-templates', async (req, res) => {
914
+ try {
915
+ // Return built-in templates
916
+ const templates = [
917
+ {
918
+ id: 'web-app',
919
+ name: 'Web Application',
920
+ description: 'Template for web application projects with frontend and backend components',
921
+ category: 'web',
922
+ content: `# Product Requirements Document - Web Application
923
+
924
+ ## Overview
925
+ **Product Name:** [Your App Name]
926
+ **Version:** 1.0
927
+ **Date:** ${new Date().toISOString().split('T')[0]}
928
+ **Author:** [Your Name]
929
+
930
+ ## Executive Summary
931
+ Brief description of what this web application will do and why it's needed.
932
+
933
+ ## Product Goals
934
+ - Goal 1: [Specific measurable goal]
935
+ - Goal 2: [Specific measurable goal]
936
+ - Goal 3: [Specific measurable goal]
937
+
938
+ ## User Stories
939
+ ### Core Features
940
+ 1. **User Registration & Authentication**
941
+ - As a user, I want to create an account so I can access personalized features
942
+ - As a user, I want to log in securely so my data is protected
943
+ - As a user, I want to reset my password if I forget it
944
+
945
+ 2. **Main Application Features**
946
+ - As a user, I want to [core feature 1] so I can [benefit]
947
+ - As a user, I want to [core feature 2] so I can [benefit]
948
+ - As a user, I want to [core feature 3] so I can [benefit]
949
+
950
+ 3. **User Interface**
951
+ - As a user, I want a responsive design so I can use the app on any device
952
+ - As a user, I want intuitive navigation so I can easily find features
953
+
954
+ ## Technical Requirements
955
+ ### Frontend
956
+ - Framework: React/Vue/Angular or vanilla JavaScript
957
+ - Styling: CSS framework (Tailwind, Bootstrap, etc.)
958
+ - State Management: Redux/Vuex/Context API
959
+ - Build Tools: Webpack/Vite
960
+ - Testing: Jest/Vitest for unit tests
961
+
962
+ ### Backend
963
+ - Runtime: Node.js/Python/Java
964
+ - Database: PostgreSQL/MySQL/MongoDB
965
+ - API: RESTful API or GraphQL
966
+ - Authentication: JWT tokens
967
+ - Testing: Integration and unit tests
968
+
969
+ ### Infrastructure
970
+ - Hosting: Cloud provider (AWS, Azure, GCP)
971
+ - CI/CD: GitHub Actions/GitLab CI
972
+ - Monitoring: Application monitoring tools
973
+ - Security: HTTPS, input validation, rate limiting
974
+
975
+ ## Success Metrics
976
+ - User engagement metrics
977
+ - Performance benchmarks (load time < 2s)
978
+ - Error rates < 1%
979
+ - User satisfaction scores
980
+
981
+ ## Timeline
982
+ - Phase 1: Core functionality (4-6 weeks)
983
+ - Phase 2: Advanced features (2-4 weeks)
984
+ - Phase 3: Polish and launch (2 weeks)
985
+
986
+ ## Constraints & Assumptions
987
+ - Budget constraints
988
+ - Technical limitations
989
+ - Team size and expertise
990
+ - Timeline constraints`
991
+ },
992
+ {
993
+ id: 'api',
994
+ name: 'REST API',
995
+ description: 'Template for REST API development projects',
996
+ category: 'backend',
997
+ content: `# Product Requirements Document - REST API
998
+
999
+ ## Overview
1000
+ **API Name:** [Your API Name]
1001
+ **Version:** v1.0
1002
+ **Date:** ${new Date().toISOString().split('T')[0]}
1003
+ **Author:** [Your Name]
1004
+
1005
+ ## Executive Summary
1006
+ Description of the API's purpose, target users, and primary use cases.
1007
+
1008
+ ## API Goals
1009
+ - Goal 1: Provide secure data access
1010
+ - Goal 2: Ensure scalable architecture
1011
+ - Goal 3: Maintain high availability (99.9% uptime)
1012
+
1013
+ ## Functional Requirements
1014
+ ### Core Endpoints
1015
+ 1. **Authentication Endpoints**
1016
+ - POST /api/auth/login - User authentication
1017
+ - POST /api/auth/logout - User logout
1018
+ - POST /api/auth/refresh - Token refresh
1019
+ - POST /api/auth/register - User registration
1020
+
1021
+ 2. **Data Management Endpoints**
1022
+ - GET /api/resources - List resources with pagination
1023
+ - GET /api/resources/{id} - Get specific resource
1024
+ - POST /api/resources - Create new resource
1025
+ - PUT /api/resources/{id} - Update existing resource
1026
+ - DELETE /api/resources/{id} - Delete resource
1027
+
1028
+ 3. **Administrative Endpoints**
1029
+ - GET /api/admin/users - Manage users (admin only)
1030
+ - GET /api/admin/analytics - System analytics
1031
+ - POST /api/admin/backup - Trigger system backup
1032
+
1033
+ ## Technical Requirements
1034
+ ### API Design
1035
+ - RESTful architecture following OpenAPI 3.0 specification
1036
+ - JSON request/response format
1037
+ - Consistent error response format
1038
+ - API versioning strategy
1039
+
1040
+ ### Authentication & Security
1041
+ - JWT token-based authentication
1042
+ - Role-based access control (RBAC)
1043
+ - Rate limiting (100 requests/minute per user)
1044
+ - Input validation and sanitization
1045
+ - HTTPS enforcement
1046
+
1047
+ ### Database
1048
+ - Database type: [PostgreSQL/MongoDB/MySQL]
1049
+ - Connection pooling
1050
+ - Database migrations
1051
+ - Backup and recovery procedures
1052
+
1053
+ ### Performance Requirements
1054
+ - Response time: < 200ms for 95% of requests
1055
+ - Throughput: 1000+ requests/second
1056
+ - Concurrent users: 10,000+
1057
+ - Database query optimization
1058
+
1059
+ ### Documentation
1060
+ - Auto-generated API documentation (Swagger/OpenAPI)
1061
+ - Code examples for common use cases
1062
+ - SDK development for major languages
1063
+ - Postman collection for testing
1064
+
1065
+ ## Error Handling
1066
+ - Standardized error codes and messages
1067
+ - Proper HTTP status codes
1068
+ - Detailed error logging
1069
+ - Graceful degradation strategies
1070
+
1071
+ ## Testing Strategy
1072
+ - Unit tests (80%+ coverage)
1073
+ - Integration tests for all endpoints
1074
+ - Load testing and performance testing
1075
+ - Security testing (OWASP compliance)
1076
+
1077
+ ## Monitoring & Logging
1078
+ - Application performance monitoring
1079
+ - Error tracking and alerting
1080
+ - Access logs and audit trails
1081
+ - Health check endpoints
1082
+
1083
+ ## Deployment
1084
+ - Containerized deployment (Docker)
1085
+ - CI/CD pipeline setup
1086
+ - Environment management (dev, staging, prod)
1087
+ - Blue-green deployment strategy
1088
+
1089
+ ## Success Metrics
1090
+ - API uptime > 99.9%
1091
+ - Average response time < 200ms
1092
+ - Zero critical security vulnerabilities
1093
+ - Developer adoption metrics`
1094
+ },
1095
+ {
1096
+ id: 'mobile-app',
1097
+ name: 'Mobile Application',
1098
+ description: 'Template for mobile app development projects (iOS/Android)',
1099
+ category: 'mobile',
1100
+ content: `# Product Requirements Document - Mobile Application
1101
+
1102
+ ## Overview
1103
+ **App Name:** [Your App Name]
1104
+ **Platform:** iOS / Android / Cross-platform
1105
+ **Version:** 1.0
1106
+ **Date:** ${new Date().toISOString().split('T')[0]}
1107
+ **Author:** [Your Name]
1108
+
1109
+ ## Executive Summary
1110
+ Brief description of the mobile app's purpose, target audience, and key value proposition.
1111
+
1112
+ ## Product Goals
1113
+ - Goal 1: [Specific user engagement goal]
1114
+ - Goal 2: [Specific functionality goal]
1115
+ - Goal 3: [Specific performance goal]
1116
+
1117
+ ## User Stories
1118
+ ### Core Features
1119
+ 1. **Onboarding & Authentication**
1120
+ - As a new user, I want a simple onboarding process
1121
+ - As a user, I want to sign up with email or social media
1122
+ - As a user, I want biometric authentication for security
1123
+
1124
+ 2. **Main App Features**
1125
+ - As a user, I want [core feature 1] accessible from home screen
1126
+ - As a user, I want [core feature 2] to work offline
1127
+ - As a user, I want to sync data across devices
1128
+
1129
+ 3. **User Experience**
1130
+ - As a user, I want intuitive navigation patterns
1131
+ - As a user, I want fast loading times
1132
+ - As a user, I want accessibility features
1133
+
1134
+ ## Technical Requirements
1135
+ ### Mobile Development
1136
+ - **Cross-platform:** React Native / Flutter / Xamarin
1137
+ - **Native:** Swift (iOS) / Kotlin (Android)
1138
+ - **State Management:** Redux / MobX / Provider
1139
+ - **Navigation:** React Navigation / Flutter Navigation
1140
+
1141
+ ### Backend Integration
1142
+ - REST API or GraphQL integration
1143
+ - Real-time features (WebSockets/Push notifications)
1144
+ - Offline data synchronization
1145
+ - Background processing
1146
+
1147
+ ### Device Features
1148
+ - Camera and photo library access
1149
+ - GPS location services
1150
+ - Push notifications
1151
+ - Biometric authentication
1152
+ - Device storage
1153
+
1154
+ ### Performance Requirements
1155
+ - App launch time < 3 seconds
1156
+ - Screen transition animations < 300ms
1157
+ - Memory usage optimization
1158
+ - Battery usage optimization
1159
+
1160
+ ## Platform-Specific Considerations
1161
+ ### iOS Requirements
1162
+ - iOS 13.0+ minimum version
1163
+ - App Store guidelines compliance
1164
+ - iOS design guidelines (Human Interface Guidelines)
1165
+ - TestFlight beta testing
1166
+
1167
+ ### Android Requirements
1168
+ - Android 8.0+ (API level 26) minimum
1169
+ - Google Play Store guidelines
1170
+ - Material Design guidelines
1171
+ - Google Play Console testing
1172
+
1173
+ ## User Interface Design
1174
+ - Responsive design for different screen sizes
1175
+ - Dark mode support
1176
+ - Accessibility compliance (WCAG 2.1)
1177
+ - Consistent design system
1178
+
1179
+ ## Security & Privacy
1180
+ - Secure data storage (Keychain/Keystore)
1181
+ - API communication encryption
1182
+ - Privacy policy compliance (GDPR/CCPA)
1183
+ - App security best practices
1184
+
1185
+ ## Testing Strategy
1186
+ - Unit testing (80%+ coverage)
1187
+ - UI/E2E testing (Detox/Appium)
1188
+ - Device testing on multiple screen sizes
1189
+ - Performance testing
1190
+ - Security testing
1191
+
1192
+ ## App Store Deployment
1193
+ - App store optimization (ASO)
1194
+ - App icons and screenshots
1195
+ - Store listing content
1196
+ - Release management strategy
1197
+
1198
+ ## Analytics & Monitoring
1199
+ - User analytics (Firebase/Analytics)
1200
+ - Crash reporting (Crashlytics/Sentry)
1201
+ - Performance monitoring
1202
+ - User feedback collection
1203
+
1204
+ ## Success Metrics
1205
+ - App store ratings > 4.0
1206
+ - User retention rates
1207
+ - Daily/Monthly active users
1208
+ - App performance metrics
1209
+ - Conversion rates`
1210
+ },
1211
+ {
1212
+ id: 'data-analysis',
1213
+ name: 'Data Analysis Project',
1214
+ description: 'Template for data analysis and visualization projects',
1215
+ category: 'data',
1216
+ content: `# Product Requirements Document - Data Analysis Project
1217
+
1218
+ ## Overview
1219
+ **Project Name:** [Your Analysis Project]
1220
+ **Analysis Type:** [Descriptive/Predictive/Prescriptive]
1221
+ **Date:** ${new Date().toISOString().split('T')[0]}
1222
+ **Author:** [Your Name]
1223
+
1224
+ ## Executive Summary
1225
+ Description of the business problem, data sources, and expected insights.
1226
+
1227
+ ## Project Goals
1228
+ - Goal 1: [Specific business question to answer]
1229
+ - Goal 2: [Specific prediction to make]
1230
+ - Goal 3: [Specific recommendation to provide]
1231
+
1232
+ ## Business Requirements
1233
+ ### Key Questions
1234
+ 1. What patterns exist in the current data?
1235
+ 2. What factors influence [target variable]?
1236
+ 3. What predictions can be made for [future outcome]?
1237
+ 4. What recommendations can improve [business metric]?
1238
+
1239
+ ### Success Criteria
1240
+ - Actionable insights for stakeholders
1241
+ - Statistical significance in findings
1242
+ - Reproducible analysis pipeline
1243
+ - Clear visualization and reporting
1244
+
1245
+ ## Data Requirements
1246
+ ### Data Sources
1247
+ 1. **Primary Data**
1248
+ - Source: [Database/API/Files]
1249
+ - Format: [CSV/JSON/SQL]
1250
+ - Size: [Volume estimate]
1251
+ - Update frequency: [Real-time/Daily/Monthly]
1252
+
1253
+ 2. **External Data**
1254
+ - Third-party APIs
1255
+ - Public datasets
1256
+ - Market research data
1257
+
1258
+ ### Data Quality Requirements
1259
+ - Data completeness (< 5% missing values)
1260
+ - Data accuracy validation
1261
+ - Data consistency checks
1262
+ - Historical data availability
1263
+
1264
+ ## Technical Requirements
1265
+ ### Data Pipeline
1266
+ - Data extraction and ingestion
1267
+ - Data cleaning and preprocessing
1268
+ - Data transformation and feature engineering
1269
+ - Data validation and quality checks
1270
+
1271
+ ### Analysis Tools
1272
+ - **Programming:** Python/R/SQL
1273
+ - **Libraries:** pandas, numpy, scikit-learn, matplotlib
1274
+ - **Visualization:** Tableau, PowerBI, or custom dashboards
1275
+ - **Version Control:** Git for code and DVC for data
1276
+
1277
+ ### Computing Resources
1278
+ - Local development environment
1279
+ - Cloud computing (AWS/GCP/Azure) if needed
1280
+ - Database access and permissions
1281
+ - Storage requirements
1282
+
1283
+ ## Analysis Methodology
1284
+ ### Data Exploration
1285
+ 1. Descriptive statistics and data profiling
1286
+ 2. Data visualization and pattern identification
1287
+ 3. Correlation analysis
1288
+ 4. Outlier detection and handling
1289
+
1290
+ ### Statistical Analysis
1291
+ 1. Hypothesis formulation
1292
+ 2. Statistical testing
1293
+ 3. Confidence intervals
1294
+ 4. Effect size calculations
1295
+
1296
+ ### Machine Learning (if applicable)
1297
+ 1. Feature selection and engineering
1298
+ 2. Model selection and training
1299
+ 3. Cross-validation and evaluation
1300
+ 4. Model interpretation and explainability
1301
+
1302
+ ## Deliverables
1303
+ ### Reports
1304
+ - Executive summary for stakeholders
1305
+ - Technical analysis report
1306
+ - Data quality report
1307
+ - Methodology documentation
1308
+
1309
+ ### Visualizations
1310
+ - Interactive dashboards
1311
+ - Static charts and graphs
1312
+ - Data story presentations
1313
+ - Key findings infographics
1314
+
1315
+ ### Code & Documentation
1316
+ - Reproducible analysis scripts
1317
+ - Data pipeline code
1318
+ - Documentation and comments
1319
+ - Testing and validation code
1320
+
1321
+ ## Timeline
1322
+ - Phase 1: Data collection and exploration (2 weeks)
1323
+ - Phase 2: Analysis and modeling (3 weeks)
1324
+ - Phase 3: Reporting and visualization (1 week)
1325
+ - Phase 4: Stakeholder presentation (1 week)
1326
+
1327
+ ## Risks & Assumptions
1328
+ - Data availability and quality risks
1329
+ - Technical complexity assumptions
1330
+ - Resource and timeline constraints
1331
+ - Stakeholder engagement assumptions
1332
+
1333
+ ## Success Metrics
1334
+ - Stakeholder satisfaction with insights
1335
+ - Accuracy of predictions (if applicable)
1336
+ - Business impact of recommendations
1337
+ - Reproducibility of results`
1338
+ }
1339
+ ];
1340
+
1341
+ res.json({
1342
+ templates,
1343
+ timestamp: new Date().toISOString()
1344
+ });
1345
+
1346
+ } catch (error) {
1347
+ console.error('PRD templates error:', error);
1348
+ res.status(500).json({
1349
+ error: 'Failed to get PRD templates',
1350
+ message: error.message
1351
+ });
1352
+ }
1353
+ });
1354
+
1355
+ /**
1356
+ * POST /api/taskmaster/apply-template/:projectId
1357
+ * Apply a PRD template to create a new PRD file
1358
+ */
1359
+ router.post('/apply-template/:projectId', async (req, res) => {
1360
+ try {
1361
+ const { projectId } = req.params;
1362
+ const { templateId, fileName = 'prd.txt', customizations = {} } = req.body;
1363
+
1364
+ if (!templateId) {
1365
+ return res.status(400).json({
1366
+ error: 'Missing required parameter',
1367
+ message: 'templateId is required'
1368
+ });
1369
+ }
1370
+
1371
+ const projectPath = await resolveProjectPathFromId(projectId);
1372
+ if (!projectPath) {
1373
+ return res.status(404).json({
1374
+ error: 'Project not found',
1375
+ message: `Project "${projectId}" does not exist`
1376
+ });
1377
+ }
1378
+
1379
+ // Get the template content (this would normally fetch from the templates list)
1380
+ const templates = await getAvailableTemplates();
1381
+ const template = templates.find(t => t.id === templateId);
1382
+
1383
+ if (!template) {
1384
+ return res.status(404).json({
1385
+ error: 'Template not found',
1386
+ message: `Template "${templateId}" does not exist`
1387
+ });
1388
+ }
1389
+
1390
+ // Apply customizations to template content
1391
+ let content = template.content;
1392
+
1393
+ // Replace placeholders with customizations
1394
+ for (const [key, value] of Object.entries(customizations)) {
1395
+ const placeholder = `[${key}]`;
1396
+ content = content.replace(new RegExp(placeholder.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'), 'g'), value);
1397
+ }
1398
+
1399
+ // Ensure .taskmaster/docs directory exists
1400
+ const docsDir = path.join(projectPath, '.taskmaster', 'docs');
1401
+ try {
1402
+ await fsPromises.mkdir(docsDir, { recursive: true });
1403
+ } catch (error) {
1404
+ console.error('Failed to create docs directory:', error);
1405
+ }
1406
+
1407
+ const filePath = path.join(docsDir, fileName);
1408
+
1409
+ // Write the template content to the file
1410
+ try {
1411
+ await fsPromises.writeFile(filePath, content, 'utf8');
1412
+
1413
+ res.json({
1414
+ projectId,
1415
+ projectPath,
1416
+ templateId,
1417
+ templateName: template.name,
1418
+ fileName,
1419
+ filePath: filePath,
1420
+ message: 'PRD template applied successfully',
1421
+ timestamp: new Date().toISOString()
1422
+ });
1423
+
1424
+ } catch (writeError) {
1425
+ console.error('Failed to write PRD template:', writeError);
1426
+ return res.status(500).json({
1427
+ error: 'Failed to write PRD template',
1428
+ message: writeError.message
1429
+ });
1430
+ }
1431
+
1432
+ } catch (error) {
1433
+ console.error('Apply template error:', error);
1434
+ res.status(500).json({
1435
+ error: 'Failed to apply PRD template',
1436
+ message: error.message
1437
+ });
1438
+ }
1439
+ });
1440
+
1441
+ // Helper function to get available templates
1442
+ async function getAvailableTemplates() {
1443
+ // This could be extended to read from files or database
1444
+ return [
1445
+ {
1446
+ id: 'web-app',
1447
+ name: 'Web Application',
1448
+ description: 'Template for web application projects',
1449
+ category: 'web',
1450
+ content: `# Product Requirements Document - Web Application
1451
+
1452
+ ## Overview
1453
+ **Product Name:** [Your App Name]
1454
+ **Version:** 1.0
1455
+ **Date:** ${new Date().toISOString().split('T')[0]}
1456
+ **Author:** [Your Name]
1457
+
1458
+ ## Executive Summary
1459
+ Brief description of what this web application will do and why it's needed.
1460
+
1461
+ ## User Stories
1462
+ 1. As a user, I want [feature] so I can [benefit]
1463
+ 2. As a user, I want [feature] so I can [benefit]
1464
+ 3. As a user, I want [feature] so I can [benefit]
1465
+
1466
+ ## Technical Requirements
1467
+ - Frontend framework
1468
+ - Backend services
1469
+ - Database requirements
1470
+ - Security considerations
1471
+
1472
+ ## Success Metrics
1473
+ - User engagement metrics
1474
+ - Performance benchmarks
1475
+ - Business objectives`
1476
+ },
1477
+ // Add other templates here if needed
1478
+ ];
1479
+ }
1480
+
1481
+ return router;
1482
+ }