@cloudcli-ai/cloudcli 1.36.3 → 1.37.1

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