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