automagik-forge 0.1.13 → 0.1.14

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 (301) hide show
  1. package/README.md +143 -447
  2. package/dist/linux-x64/automagik-forge-mcp.zip +0 -0
  3. package/{npx-cli/automagik-forge-0.0.55.tgz → dist/linux-x64/automagik-forge.zip} +0 -0
  4. package/package.json +13 -23
  5. package/.cargo/config.toml +0 -13
  6. package/.claude/commands/commit.md +0 -376
  7. package/.claude/commands/prompt.md +0 -871
  8. package/.env.example +0 -20
  9. package/.github/actions/setup-node/action.yml +0 -29
  10. package/.github/images/automagik-logo.png +0 -0
  11. package/.github/workflows/pre-release.yml +0 -470
  12. package/.github/workflows/publish.yml +0 -145
  13. package/.github/workflows/test.yml +0 -63
  14. package/.mcp.json +0 -57
  15. package/AGENT.md +0 -40
  16. package/CLAUDE.md +0 -40
  17. package/CODE-OF-CONDUCT.md +0 -89
  18. package/Cargo.toml +0 -19
  19. package/Dockerfile +0 -43
  20. package/LICENSE +0 -201
  21. package/Makefile +0 -97
  22. package/backend/.sqlx/query-01b7e2bac1261d8be3d03c03df3e5220590da6c31c77f161074fc62752d63881.json +0 -12
  23. package/backend/.sqlx/query-03f2b02ba6dc5ea2b3cf6b1004caea0ad6bcc10ebd63f441d321a389f026e263.json +0 -12
  24. package/backend/.sqlx/query-0923b77d137a29fc54d399a873ff15fc4af894490bc65a4d344a7575cb0d8643.json +0 -12
  25. package/backend/.sqlx/query-0f808bcdb63c5f180836e448dd64c435c51758b2fc54a52ce9e67495b1ab200e.json +0 -68
  26. package/backend/.sqlx/query-1268afe9ca849daa6722e3df7ca8e9e61f0d37052e782bb5452ab8e1018d9b63.json +0 -12
  27. package/backend/.sqlx/query-1b082630a9622f8667ee7a9aba2c2d3176019a68c6bb83d33008594821415a57.json +0 -12
  28. package/backend/.sqlx/query-1c7b06ba1e112abf6b945a2ff08a0b40ec23f3738c2e7399f067b558cf8d490e.json +0 -12
  29. package/backend/.sqlx/query-1f619f01f46859a64ded531dd0ef61abacfe62e758abe7030a6aa745140b95ca.json +0 -104
  30. package/backend/.sqlx/query-1fca1ce14b4b20205364cd1f1f45ebe1d2e30cd745e59e189d56487b5639dfbb.json +0 -12
  31. package/backend/.sqlx/query-212828320e8d871ab9d83705a040b23bcf0393dc7252177fc539a74657f578ef.json +0 -32
  32. package/backend/.sqlx/query-290ce5c152be8d36e58ff42570f9157beb07ab9e77a03ec6fc30b4f56f9b8f6b.json +0 -56
  33. package/backend/.sqlx/query-2b471d2c2e8ffbe0cd42d2a91b814c0d79f9d09200f147e3cea33ba4ce673c8a.json +0 -68
  34. package/backend/.sqlx/query-354a48c705bb9bb2048c1b7f10fcb714e23f9db82b7a4ea6932486197b2ede6a.json +0 -92
  35. package/backend/.sqlx/query-36c9e3dd10648e94b949db5c91a774ecb1e10a899ef95da74066eccedca4d8b2.json +0 -12
  36. package/backend/.sqlx/query-36e4ba7bbd81b402d5a20b6005755eafbb174c8dda442081823406ac32809a94.json +0 -56
  37. package/backend/.sqlx/query-3a5b3c98a55ca183ab20c74708e3d7e579dda37972c059e7515c4ceee4bd8dd3.json +0 -62
  38. package/backend/.sqlx/query-3d0a1cabf2a52e9d90cdfd29c509ca89aeb448d0c1d2446c65cd43db40735e86.json +0 -62
  39. package/backend/.sqlx/query-3d6bd16fbce59efe30b7f67ea342e0e4ea6d1432389c02468ad79f1f742d4031.json +0 -56
  40. package/backend/.sqlx/query-4049ca413b285a05aca6b25385e9c8185575f01e9069e4e8581aa45d713f612f.json +0 -32
  41. package/backend/.sqlx/query-412bacd3477d86369082e90f52240407abce436cb81292d42b2dbe1e5c18eea1.json +0 -104
  42. package/backend/.sqlx/query-417a8b1ff4e51de82aea0159a3b97932224dc325b23476cb84153d690227fd8b.json +0 -62
  43. package/backend/.sqlx/query-461cc1b0bb6fd909afc9dd2246e8526b3771cfbb0b22ae4b5d17b51af587b9e2.json +0 -56
  44. package/backend/.sqlx/query-58408c7a8cdeeda0bef359f1f9bd91299a339dc2b191462fc58c9736a56d5227.json +0 -92
  45. package/backend/.sqlx/query-5a886026d75d515c01f347cc203c8d99dd04c61dc468e2e4c5aa548436d13834.json +0 -62
  46. package/backend/.sqlx/query-5b902137b11022d2e1a5c4f6a9c83fec1a856c6a710aff831abd2382ede76b43.json +0 -12
  47. package/backend/.sqlx/query-5ed1238e52e59bb5f76c0f153fd99a14093f7ce2585bf9843585608f17ec575b.json +0 -104
  48. package/backend/.sqlx/query-6e8b860b14decfc2227dc57213f38442943d3fbef5c8418fd6b634c6e0f5e2ea.json +0 -104
  49. package/backend/.sqlx/query-6ec414276994c4ccb2433eaa5b1b342168557d17ddf5a52dac84cb1b59b9de8f.json +0 -68
  50. package/backend/.sqlx/query-6ecfa16d0cf825aacf233544b5baf151e9adfdca26c226ad71020d291fd802d5.json +0 -62
  51. package/backend/.sqlx/query-72509d252c39fce77520aa816cb2acbc1fb35dc2605e7be893610599b2427f2e.json +0 -62
  52. package/backend/.sqlx/query-75239b2da188f749707d77f3c1544332ca70db3d6d6743b2601dc0d167536437.json +0 -62
  53. package/backend/.sqlx/query-83d10e29f8478aff33434f9ac67068e013b888b953a2657e2bb72a6f619d04f2.json +0 -50
  54. package/backend/.sqlx/query-8610803360ea18b9b9d078a6981ea56abfbfe84e6354fc1d5ae4c622e01410ed.json +0 -68
  55. package/backend/.sqlx/query-86d03eb70eef39c59296416867f2ee66c9f7cd8b7f961fbda2f89fc0a1c442c2.json +0 -12
  56. package/backend/.sqlx/query-87d0feb5a6b442bad9c60068ea7569599cc6fc91a0e2692ecb42e93b03201b9d.json +0 -68
  57. package/backend/.sqlx/query-8a67b3b3337248f06a57bdf8a908f7ef23177431eaed82dc08c94c3e5944340e.json +0 -12
  58. package/backend/.sqlx/query-8f01ebd64bdcde6a090479f14810d73ba23020e76fd70854ac57f2da251702c3.json +0 -12
  59. package/backend/.sqlx/query-90fd607fcb2dca72239ff25e618e21e174b195991eaa33722cbf5f76da84cfab.json +0 -62
  60. package/backend/.sqlx/query-92e8bdbcd80c5ff3db7a35cf79492048803ef305cbdef0d0a1fe5dc881ca8c71.json +0 -104
  61. package/backend/.sqlx/query-93a1605f90e9672dad29b472b6ad85fa9a55ea3ffa5abcb8724b09d61be254ca.json +0 -20
  62. package/backend/.sqlx/query-9472c8fb477958167f5fae40b85ac44252468c5226b2cdd7770f027332eed6d7.json +0 -104
  63. package/backend/.sqlx/query-96036c4f9e0f48bdc5a4a4588f0c5f288ac7aaa5425cac40fc33f337e1a351f2.json +0 -56
  64. package/backend/.sqlx/query-9edb2c01e91fd0f0fe7b56e988c7ae0393150f50be3f419a981e035c0121dfc7.json +0 -104
  65. package/backend/.sqlx/query-a157cf00616f703bfba21927f1eb1c9eec2a81c02da15f66efdba0b6c375de1b.json +0 -26
  66. package/backend/.sqlx/query-a31fff84f3b8e532fd1160447d89d700f06ae08821fee00c9a5b60492b05259c.json +0 -62
  67. package/backend/.sqlx/query-a5ba908419fb3e456bdd2daca41ba06cc3212ffffb8520fc7dbbcc8b60ada314.json +0 -12
  68. package/backend/.sqlx/query-a6d2961718dbc3b1a925e549f49a159c561bef58c105529275f274b27e2eba5b.json +0 -104
  69. package/backend/.sqlx/query-a9e93d5b09b29faf66e387e4d7596a792d81e75c4d3726e83c2963e8d7c9b56f.json +0 -104
  70. package/backend/.sqlx/query-ac5247c8d7fb86e4650c4b0eb9420031614c831b7b085083bac20c1af314c538.json +0 -12
  71. package/backend/.sqlx/query-afef9467be74c411c4cb119a8b2b1aea53049877dfc30cc60b486134ba4b4c9f.json +0 -68
  72. package/backend/.sqlx/query-b2b2c6b4d0b1a347b5c4cb63c3a46a265d4db53be9554989a814b069d0af82f2.json +0 -62
  73. package/backend/.sqlx/query-c50d2ff0b12e5bcc81e371089ee2d007e233e7db93aefba4fef08e7aa68f5ab7.json +0 -20
  74. package/backend/.sqlx/query-c614e6056b244ca07f1b9d44e7edc9d5819225c6f8d9e077070c6e518a17f50b.json +0 -12
  75. package/backend/.sqlx/query-c67259be8bf4ee0cfd32167b2aa3b7fe9192809181a8171bf1c2d6df731967ae.json +0 -12
  76. package/backend/.sqlx/query-d2d0a1b985ebbca6a2b3e882a221a219f3199890fa640afc946ef1a792d6d8de.json +0 -12
  77. package/backend/.sqlx/query-d30aa5786757f32bf2b9c5fe51a45e506c71c28c5994e430d9b0546adb15ffa2.json +0 -20
  78. package/backend/.sqlx/query-d3b9ea1de1576af71b312924ce7f4ea8ae5dbe2ac138ea3b4470f2d5cd734846.json +0 -12
  79. package/backend/.sqlx/query-ed8456646fa69ddd412441955f06ff22bfb790f29466450735e0b8bb1bc4ec94.json +0 -12
  80. package/backend/Cargo.toml +0 -71
  81. package/backend/build.rs +0 -32
  82. package/backend/migrations/20250617183714_init.sql +0 -44
  83. package/backend/migrations/20250620212427_execution_processes.sql +0 -25
  84. package/backend/migrations/20250620214100_remove_stdout_stderr_from_task_attempts.sql +0 -28
  85. package/backend/migrations/20250621120000_relate_activities_to_execution_processes.sql +0 -23
  86. package/backend/migrations/20250623120000_executor_sessions.sql +0 -17
  87. package/backend/migrations/20250623130000_add_executor_type_to_execution_processes.sql +0 -4
  88. package/backend/migrations/20250625000000_add_dev_script_to_projects.sql +0 -4
  89. package/backend/migrations/20250701000000_add_branch_to_task_attempts.sql +0 -2
  90. package/backend/migrations/20250701000001_add_pr_tracking_to_task_attempts.sql +0 -5
  91. package/backend/migrations/20250701120000_add_assistant_message_to_executor_sessions.sql +0 -2
  92. package/backend/migrations/20250708000000_add_base_branch_to_task_attempts.sql +0 -2
  93. package/backend/migrations/20250709000000_add_worktree_deleted_flag.sql +0 -2
  94. package/backend/migrations/20250710000000_add_setup_completion.sql +0 -3
  95. package/backend/migrations/20250715154859_add_task_templates.sql +0 -25
  96. package/backend/migrations/20250716143725_add_default_templates.sql +0 -174
  97. package/backend/migrations/20250716161432_update_executor_names_to_kebab_case.sql +0 -20
  98. package/backend/migrations/20250716170000_add_parent_task_to_tasks.sql +0 -7
  99. package/backend/migrations/20250717000000_drop_task_attempt_activities.sql +0 -9
  100. package/backend/migrations/20250719000000_add_cleanup_script_to_projects.sql +0 -2
  101. package/backend/migrations/20250720000000_add_cleanupscript_to_process_type_constraint.sql +0 -25
  102. package/backend/migrations/20250723000000_add_wish_to_tasks.sql +0 -7
  103. package/backend/migrations/20250724000000_remove_unique_wish_constraint.sql +0 -5
  104. package/backend/scripts/toast-notification.ps1 +0 -23
  105. package/backend/sounds/abstract-sound1.wav +0 -0
  106. package/backend/sounds/abstract-sound2.wav +0 -0
  107. package/backend/sounds/abstract-sound3.wav +0 -0
  108. package/backend/sounds/abstract-sound4.wav +0 -0
  109. package/backend/sounds/cow-mooing.wav +0 -0
  110. package/backend/sounds/phone-vibration.wav +0 -0
  111. package/backend/sounds/rooster.wav +0 -0
  112. package/backend/src/app_state.rs +0 -218
  113. package/backend/src/bin/generate_types.rs +0 -189
  114. package/backend/src/bin/mcp_task_server.rs +0 -191
  115. package/backend/src/execution_monitor.rs +0 -1193
  116. package/backend/src/executor.rs +0 -1053
  117. package/backend/src/executors/amp.rs +0 -697
  118. package/backend/src/executors/ccr.rs +0 -91
  119. package/backend/src/executors/charm_opencode.rs +0 -113
  120. package/backend/src/executors/claude.rs +0 -887
  121. package/backend/src/executors/cleanup_script.rs +0 -124
  122. package/backend/src/executors/dev_server.rs +0 -53
  123. package/backend/src/executors/echo.rs +0 -79
  124. package/backend/src/executors/gemini/config.rs +0 -67
  125. package/backend/src/executors/gemini/streaming.rs +0 -363
  126. package/backend/src/executors/gemini.rs +0 -765
  127. package/backend/src/executors/mod.rs +0 -23
  128. package/backend/src/executors/opencode_ai.rs +0 -113
  129. package/backend/src/executors/setup_script.rs +0 -130
  130. package/backend/src/executors/sst_opencode/filter.rs +0 -184
  131. package/backend/src/executors/sst_opencode/tools.rs +0 -139
  132. package/backend/src/executors/sst_opencode.rs +0 -756
  133. package/backend/src/lib.rs +0 -45
  134. package/backend/src/main.rs +0 -324
  135. package/backend/src/mcp/mod.rs +0 -1
  136. package/backend/src/mcp/task_server.rs +0 -850
  137. package/backend/src/middleware/mod.rs +0 -3
  138. package/backend/src/middleware/model_loaders.rs +0 -242
  139. package/backend/src/models/api_response.rs +0 -36
  140. package/backend/src/models/config.rs +0 -375
  141. package/backend/src/models/execution_process.rs +0 -430
  142. package/backend/src/models/executor_session.rs +0 -225
  143. package/backend/src/models/mod.rs +0 -12
  144. package/backend/src/models/project.rs +0 -356
  145. package/backend/src/models/task.rs +0 -345
  146. package/backend/src/models/task_attempt.rs +0 -1214
  147. package/backend/src/models/task_template.rs +0 -146
  148. package/backend/src/openapi.rs +0 -93
  149. package/backend/src/routes/auth.rs +0 -297
  150. package/backend/src/routes/config.rs +0 -385
  151. package/backend/src/routes/filesystem.rs +0 -228
  152. package/backend/src/routes/health.rs +0 -16
  153. package/backend/src/routes/mod.rs +0 -9
  154. package/backend/src/routes/projects.rs +0 -562
  155. package/backend/src/routes/stream.rs +0 -244
  156. package/backend/src/routes/task_attempts.rs +0 -1172
  157. package/backend/src/routes/task_templates.rs +0 -229
  158. package/backend/src/routes/tasks.rs +0 -353
  159. package/backend/src/services/analytics.rs +0 -216
  160. package/backend/src/services/git_service.rs +0 -1321
  161. package/backend/src/services/github_service.rs +0 -307
  162. package/backend/src/services/mod.rs +0 -13
  163. package/backend/src/services/notification_service.rs +0 -263
  164. package/backend/src/services/pr_monitor.rs +0 -214
  165. package/backend/src/services/process_service.rs +0 -940
  166. package/backend/src/utils/path.rs +0 -96
  167. package/backend/src/utils/shell.rs +0 -19
  168. package/backend/src/utils/text.rs +0 -24
  169. package/backend/src/utils/worktree_manager.rs +0 -578
  170. package/backend/src/utils.rs +0 -125
  171. package/backend/test.db +0 -0
  172. package/build-npm-package.sh +0 -61
  173. package/dev_assets_seed/config.json +0 -19
  174. package/frontend/.eslintrc.json +0 -25
  175. package/frontend/.prettierrc.json +0 -8
  176. package/frontend/components.json +0 -17
  177. package/frontend/index.html +0 -19
  178. package/frontend/package-lock.json +0 -7321
  179. package/frontend/package.json +0 -61
  180. package/frontend/postcss.config.js +0 -6
  181. package/frontend/public/android-chrome-192x192.png +0 -0
  182. package/frontend/public/android-chrome-512x512.png +0 -0
  183. package/frontend/public/apple-touch-icon.png +0 -0
  184. package/frontend/public/automagik-forge-logo-dark.svg +0 -3
  185. package/frontend/public/automagik-forge-logo.svg +0 -3
  186. package/frontend/public/automagik-forge-screenshot-overview.png +0 -0
  187. package/frontend/public/favicon-16x16.png +0 -0
  188. package/frontend/public/favicon-32x32.png +0 -0
  189. package/frontend/public/favicon.ico +0 -0
  190. package/frontend/public/site.webmanifest +0 -1
  191. package/frontend/public/viba-kanban-favicon.png +0 -0
  192. package/frontend/src/App.tsx +0 -157
  193. package/frontend/src/components/DisclaimerDialog.tsx +0 -106
  194. package/frontend/src/components/GitHubLoginDialog.tsx +0 -314
  195. package/frontend/src/components/OnboardingDialog.tsx +0 -185
  196. package/frontend/src/components/PrivacyOptInDialog.tsx +0 -130
  197. package/frontend/src/components/ProvidePatDialog.tsx +0 -98
  198. package/frontend/src/components/TaskTemplateManager.tsx +0 -336
  199. package/frontend/src/components/config-provider.tsx +0 -119
  200. package/frontend/src/components/context/TaskDetailsContextProvider.tsx +0 -470
  201. package/frontend/src/components/context/taskDetailsContext.ts +0 -125
  202. package/frontend/src/components/keyboard-shortcuts-demo.tsx +0 -35
  203. package/frontend/src/components/layout/navbar.tsx +0 -86
  204. package/frontend/src/components/logo.tsx +0 -44
  205. package/frontend/src/components/projects/ProjectCard.tsx +0 -155
  206. package/frontend/src/components/projects/project-detail.tsx +0 -251
  207. package/frontend/src/components/projects/project-form-fields.tsx +0 -238
  208. package/frontend/src/components/projects/project-form.tsx +0 -301
  209. package/frontend/src/components/projects/project-list.tsx +0 -200
  210. package/frontend/src/components/projects/projects-page.tsx +0 -20
  211. package/frontend/src/components/tasks/BranchSelector.tsx +0 -169
  212. package/frontend/src/components/tasks/DeleteFileConfirmationDialog.tsx +0 -94
  213. package/frontend/src/components/tasks/EditorSelectionDialog.tsx +0 -119
  214. package/frontend/src/components/tasks/TaskCard.tsx +0 -154
  215. package/frontend/src/components/tasks/TaskDetails/CollapsibleToolbar.tsx +0 -33
  216. package/frontend/src/components/tasks/TaskDetails/DiffCard.tsx +0 -109
  217. package/frontend/src/components/tasks/TaskDetails/DiffChunkSection.tsx +0 -135
  218. package/frontend/src/components/tasks/TaskDetails/DiffFile.tsx +0 -296
  219. package/frontend/src/components/tasks/TaskDetails/DiffTab.tsx +0 -32
  220. package/frontend/src/components/tasks/TaskDetails/DisplayConversationEntry.tsx +0 -392
  221. package/frontend/src/components/tasks/TaskDetails/LogsTab/Conversation.tsx +0 -256
  222. package/frontend/src/components/tasks/TaskDetails/LogsTab/ConversationEntry.tsx +0 -56
  223. package/frontend/src/components/tasks/TaskDetails/LogsTab/NormalizedConversationViewer.tsx +0 -92
  224. package/frontend/src/components/tasks/TaskDetails/LogsTab/Prompt.tsx +0 -22
  225. package/frontend/src/components/tasks/TaskDetails/LogsTab/SetupScriptRunning.tsx +0 -49
  226. package/frontend/src/components/tasks/TaskDetails/LogsTab.tsx +0 -186
  227. package/frontend/src/components/tasks/TaskDetails/ProcessesTab.tsx +0 -288
  228. package/frontend/src/components/tasks/TaskDetails/RelatedTasksTab.tsx +0 -216
  229. package/frontend/src/components/tasks/TaskDetails/TabNavigation.tsx +0 -93
  230. package/frontend/src/components/tasks/TaskDetailsHeader.tsx +0 -169
  231. package/frontend/src/components/tasks/TaskDetailsPanel.tsx +0 -126
  232. package/frontend/src/components/tasks/TaskDetailsToolbar.tsx +0 -302
  233. package/frontend/src/components/tasks/TaskFollowUpSection.tsx +0 -130
  234. package/frontend/src/components/tasks/TaskFormDialog.tsx +0 -400
  235. package/frontend/src/components/tasks/TaskKanbanBoard.tsx +0 -180
  236. package/frontend/src/components/tasks/Toolbar/CreateAttempt.tsx +0 -259
  237. package/frontend/src/components/tasks/Toolbar/CreatePRDialog.tsx +0 -243
  238. package/frontend/src/components/tasks/Toolbar/CurrentAttempt.tsx +0 -899
  239. package/frontend/src/components/tasks/index.ts +0 -2
  240. package/frontend/src/components/theme-provider.tsx +0 -82
  241. package/frontend/src/components/theme-toggle.tsx +0 -36
  242. package/frontend/src/components/ui/alert.tsx +0 -59
  243. package/frontend/src/components/ui/auto-expanding-textarea.tsx +0 -70
  244. package/frontend/src/components/ui/badge.tsx +0 -36
  245. package/frontend/src/components/ui/button.tsx +0 -56
  246. package/frontend/src/components/ui/card.tsx +0 -86
  247. package/frontend/src/components/ui/checkbox.tsx +0 -44
  248. package/frontend/src/components/ui/chip.tsx +0 -25
  249. package/frontend/src/components/ui/dialog.tsx +0 -124
  250. package/frontend/src/components/ui/dropdown-menu.tsx +0 -198
  251. package/frontend/src/components/ui/file-search-textarea.tsx +0 -292
  252. package/frontend/src/components/ui/folder-picker.tsx +0 -279
  253. package/frontend/src/components/ui/input.tsx +0 -25
  254. package/frontend/src/components/ui/label.tsx +0 -24
  255. package/frontend/src/components/ui/loader.tsx +0 -26
  256. package/frontend/src/components/ui/markdown-renderer.tsx +0 -75
  257. package/frontend/src/components/ui/select.tsx +0 -160
  258. package/frontend/src/components/ui/separator.tsx +0 -31
  259. package/frontend/src/components/ui/shadcn-io/kanban/index.tsx +0 -185
  260. package/frontend/src/components/ui/table.tsx +0 -117
  261. package/frontend/src/components/ui/tabs.tsx +0 -53
  262. package/frontend/src/components/ui/textarea.tsx +0 -22
  263. package/frontend/src/components/ui/tooltip.tsx +0 -28
  264. package/frontend/src/hooks/useNormalizedConversation.ts +0 -440
  265. package/frontend/src/index.css +0 -225
  266. package/frontend/src/lib/api.ts +0 -630
  267. package/frontend/src/lib/keyboard-shortcuts.ts +0 -266
  268. package/frontend/src/lib/responsive-config.ts +0 -70
  269. package/frontend/src/lib/types.ts +0 -39
  270. package/frontend/src/lib/utils.ts +0 -10
  271. package/frontend/src/main.tsx +0 -50
  272. package/frontend/src/pages/McpServers.tsx +0 -418
  273. package/frontend/src/pages/Settings.tsx +0 -610
  274. package/frontend/src/pages/project-tasks.tsx +0 -575
  275. package/frontend/src/pages/projects.tsx +0 -18
  276. package/frontend/src/vite-env.d.ts +0 -1
  277. package/frontend/tailwind.config.js +0 -125
  278. package/frontend/tsconfig.json +0 -26
  279. package/frontend/tsconfig.node.json +0 -10
  280. package/frontend/vite.config.ts +0 -33
  281. package/npx-cli/README.md +0 -159
  282. package/npx-cli/automagik-forge-0.1.0.tgz +0 -0
  283. package/npx-cli/automagik-forge-0.1.10.tgz +0 -0
  284. package/npx-cli/package.json +0 -17
  285. package/npx-cli/vibe-kanban-0.0.55.tgz +0 -0
  286. package/pnpm-workspace.yaml +0 -2
  287. package/rust-toolchain.toml +0 -11
  288. package/rustfmt.toml +0 -3
  289. package/scripts/load-env.js +0 -43
  290. package/scripts/mcp_test.js +0 -374
  291. package/scripts/prepare-db.js +0 -45
  292. package/scripts/setup-dev-environment.js +0 -274
  293. package/scripts/start-mcp-sse.js +0 -70
  294. package/scripts/test-debug.js +0 -32
  295. package/scripts/test-mcp-sse.js +0 -138
  296. package/scripts/test-simple.js +0 -44
  297. package/scripts/test-wish-final.js +0 -179
  298. package/scripts/test-wish-system.js +0 -221
  299. package/shared/types.ts +0 -182
  300. package/test-npm-package.sh +0 -42
  301. /package/{npx-cli/bin → bin}/cli.js +0 -0
@@ -1,400 +0,0 @@
1
- import { useState, useEffect, useCallback } from 'react';
2
- import { Globe2 } from 'lucide-react';
3
- import { Button } from '@/components/ui/button';
4
- import {
5
- Dialog,
6
- DialogContent,
7
- DialogHeader,
8
- DialogTitle,
9
- } from '@/components/ui/dialog';
10
- import { Input } from '@/components/ui/input';
11
- import { FileSearchTextarea } from '@/components/ui/file-search-textarea';
12
- import { Label } from '@/components/ui/label';
13
- import {
14
- Select,
15
- SelectContent,
16
- SelectItem,
17
- SelectTrigger,
18
- SelectValue,
19
- } from '@/components/ui/select';
20
- import { useConfig } from '@/components/config-provider';
21
- import { templatesApi } from '@/lib/api';
22
- import type { TaskStatus, ExecutorConfig, TaskTemplate } from 'shared/types';
23
-
24
- interface Task {
25
- id: string;
26
- project_id: string;
27
- title: string;
28
- description: string | null;
29
- status: TaskStatus;
30
- created_at: string;
31
- updated_at: string;
32
- }
33
-
34
- interface TaskFormDialogProps {
35
- isOpen: boolean;
36
- onOpenChange: (open: boolean) => void;
37
- task?: Task | null; // Optional for create mode
38
- projectId?: string; // For file search functionality
39
- initialTemplate?: TaskTemplate | null; // For pre-filling from template
40
- onCreateTask?: (title: string, description: string) => Promise<void>;
41
- onCreateAndStartTask?: (
42
- title: string,
43
- description: string,
44
- executor?: ExecutorConfig
45
- ) => Promise<void>;
46
- onUpdateTask?: (
47
- title: string,
48
- description: string,
49
- status: TaskStatus
50
- ) => Promise<void>;
51
- }
52
-
53
- export function TaskFormDialog({
54
- isOpen,
55
- onOpenChange,
56
- task,
57
- projectId,
58
- initialTemplate,
59
- onCreateTask,
60
- onCreateAndStartTask,
61
- onUpdateTask,
62
- }: TaskFormDialogProps) {
63
- const [title, setTitle] = useState('');
64
- const [description, setDescription] = useState('');
65
- const [status, setStatus] = useState<TaskStatus>('todo');
66
- const [isSubmitting, setIsSubmitting] = useState(false);
67
- const [isSubmittingAndStart, setIsSubmittingAndStart] = useState(false);
68
- const [templates, setTemplates] = useState<TaskTemplate[]>([]);
69
- const [selectedTemplate, setSelectedTemplate] = useState<string>('');
70
-
71
- const { config } = useConfig();
72
- const isEditMode = Boolean(task);
73
-
74
- useEffect(() => {
75
- if (task) {
76
- // Edit mode - populate with existing task data
77
- setTitle(task.title);
78
- setDescription(task.description || '');
79
- setStatus(task.status);
80
- } else if (initialTemplate) {
81
- // Create mode with template - pre-fill from template
82
- setTitle(initialTemplate.title);
83
- setDescription(initialTemplate.description || '');
84
- setStatus('todo');
85
- setSelectedTemplate('');
86
- } else {
87
- // Create mode - reset to defaults
88
- setTitle('');
89
- setDescription('');
90
- setStatus('todo');
91
- setSelectedTemplate('');
92
- }
93
- }, [task, initialTemplate, isOpen]);
94
-
95
- // Fetch templates when dialog opens in create mode
96
- useEffect(() => {
97
- if (isOpen && !isEditMode && projectId) {
98
- // Fetch both project and global templates
99
- Promise.all([
100
- templatesApi.listByProject(projectId),
101
- templatesApi.listGlobal(),
102
- ])
103
- .then(([projectTemplates, globalTemplates]) => {
104
- // Combine templates with project templates first
105
- setTemplates([...projectTemplates, ...globalTemplates]);
106
- })
107
- .catch(console.error);
108
- }
109
- }, [isOpen, isEditMode, projectId]);
110
-
111
- // Handle template selection
112
- const handleTemplateChange = (templateId: string) => {
113
- setSelectedTemplate(templateId);
114
- if (templateId === 'none') {
115
- // Clear the form when "No template" is selected
116
- setTitle('');
117
- setDescription('');
118
- } else if (templateId) {
119
- const template = templates.find((t) => t.id === templateId);
120
- if (template) {
121
- setTitle(template.title);
122
- setDescription(template.description || '');
123
- }
124
- }
125
- };
126
-
127
- const handleSubmit = async () => {
128
- if (!title.trim()) return;
129
-
130
- setIsSubmitting(true);
131
- try {
132
- if (isEditMode && onUpdateTask) {
133
- await onUpdateTask(title, description, status);
134
- } else if (!isEditMode && onCreateTask) {
135
- await onCreateTask(title, description);
136
- }
137
-
138
- // Reset form on successful creation
139
- if (!isEditMode) {
140
- setTitle('');
141
- setDescription('');
142
- setStatus('todo');
143
- }
144
-
145
- onOpenChange(false);
146
- } finally {
147
- setIsSubmitting(false);
148
- }
149
- };
150
-
151
- const handleCreateAndStart = useCallback(async () => {
152
- if (!title.trim()) return;
153
-
154
- setIsSubmittingAndStart(true);
155
- try {
156
- if (!isEditMode && onCreateAndStartTask) {
157
- await onCreateAndStartTask(title, description, config?.executor);
158
- }
159
-
160
- // Reset form on successful creation
161
- setTitle('');
162
- setDescription('');
163
- setStatus('todo');
164
-
165
- onOpenChange(false);
166
- } finally {
167
- setIsSubmittingAndStart(false);
168
- }
169
- }, [
170
- title,
171
- description,
172
- config?.executor,
173
- isEditMode,
174
- onCreateAndStartTask,
175
- onOpenChange,
176
- ]);
177
-
178
- const handleCancel = useCallback(() => {
179
- // Reset form state when canceling
180
- if (task) {
181
- setTitle(task.title);
182
- setDescription(task.description || '');
183
- setStatus(task.status);
184
- } else {
185
- setTitle('');
186
- setDescription('');
187
- setStatus('todo');
188
- setSelectedTemplate('');
189
- }
190
- onOpenChange(false);
191
- }, [task, onOpenChange]);
192
-
193
- // Handle keyboard shortcuts
194
- useEffect(() => {
195
- const handleKeyDown = (event: KeyboardEvent) => {
196
- // ESC to close dialog (prevent it from reaching TaskDetailsPanel)
197
- if (event.key === 'Escape') {
198
- event.preventDefault();
199
- event.stopPropagation();
200
- handleCancel();
201
- return;
202
- }
203
-
204
- // Command/Ctrl + Enter to Create & Start (create mode) or Save (edit mode)
205
- if ((event.metaKey || event.ctrlKey) && event.key === 'Enter') {
206
- if (
207
- !isEditMode &&
208
- onCreateAndStartTask &&
209
- title.trim() &&
210
- !isSubmitting &&
211
- !isSubmittingAndStart
212
- ) {
213
- event.preventDefault();
214
- handleCreateAndStart();
215
- } else if (
216
- isEditMode &&
217
- title.trim() &&
218
- !isSubmitting &&
219
- !isSubmittingAndStart
220
- ) {
221
- event.preventDefault();
222
- handleSubmit();
223
- }
224
- }
225
- };
226
-
227
- if (isOpen) {
228
- document.addEventListener('keydown', handleKeyDown, true); // Use capture phase to get priority
229
- return () => document.removeEventListener('keydown', handleKeyDown, true);
230
- }
231
- }, [
232
- isOpen,
233
- isEditMode,
234
- onCreateAndStartTask,
235
- title,
236
- isSubmitting,
237
- isSubmittingAndStart,
238
- handleCreateAndStart,
239
- handleCancel,
240
- ]);
241
-
242
- return (
243
- <Dialog open={isOpen} onOpenChange={onOpenChange}>
244
- <DialogContent className="sm:max-w-[550px]">
245
- <DialogHeader>
246
- <DialogTitle>
247
- {isEditMode ? 'Edit Task' : 'Create New Task'}
248
- </DialogTitle>
249
- </DialogHeader>
250
- <div className="space-y-4">
251
- <div>
252
- <Label htmlFor="task-title" className="text-sm font-medium">
253
- Title
254
- </Label>
255
- <Input
256
- id="task-title"
257
- value={title}
258
- onChange={(e) => setTitle(e.target.value)}
259
- placeholder="What needs to be done?"
260
- className="mt-1.5"
261
- disabled={isSubmitting || isSubmittingAndStart}
262
- autoFocus
263
- />
264
- </div>
265
-
266
- <div>
267
- <Label htmlFor="task-description" className="text-sm font-medium">
268
- Description
269
- </Label>
270
- <FileSearchTextarea
271
- value={description}
272
- onChange={setDescription}
273
- rows={3}
274
- maxRows={8}
275
- placeholder="Add more details (optional). Type @ to search files."
276
- className="mt-1.5"
277
- disabled={isSubmitting || isSubmittingAndStart}
278
- projectId={projectId}
279
- />
280
- </div>
281
-
282
- {!isEditMode && templates.length > 0 && (
283
- <div className="pt-2">
284
- <details className="group">
285
- <summary className="cursor-pointer text-sm text-muted-foreground hover:text-foreground transition-colors list-none flex items-center gap-2">
286
- <svg
287
- className="h-3 w-3 transition-transform group-open:rotate-90"
288
- viewBox="0 0 20 20"
289
- fill="currentColor"
290
- >
291
- <path
292
- fillRule="evenodd"
293
- d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z"
294
- clipRule="evenodd"
295
- />
296
- </svg>
297
- Use a template
298
- </summary>
299
- <div className="mt-3 space-y-2">
300
- <p className="text-xs text-muted-foreground">
301
- Templates help you quickly create tasks with predefined
302
- content.
303
- </p>
304
- <Select
305
- value={selectedTemplate}
306
- onValueChange={handleTemplateChange}
307
- >
308
- <SelectTrigger id="task-template" className="w-full">
309
- <SelectValue placeholder="Choose a template to prefill this form" />
310
- </SelectTrigger>
311
- <SelectContent>
312
- <SelectItem value="none">No template</SelectItem>
313
- {templates.map((template) => (
314
- <SelectItem key={template.id} value={template.id}>
315
- <div className="flex items-center gap-2">
316
- {template.project_id === null && (
317
- <Globe2 className="h-3 w-3 text-muted-foreground" />
318
- )}
319
- <span>{template.template_name}</span>
320
- </div>
321
- </SelectItem>
322
- ))}
323
- </SelectContent>
324
- </Select>
325
- </div>
326
- </details>
327
- </div>
328
- )}
329
-
330
- {isEditMode && (
331
- <div className="pt-2">
332
- <Label htmlFor="task-status" className="text-sm font-medium">
333
- Status
334
- </Label>
335
- <Select
336
- value={status}
337
- onValueChange={(value) => setStatus(value as TaskStatus)}
338
- disabled={isSubmitting || isSubmittingAndStart}
339
- >
340
- <SelectTrigger className="mt-1.5">
341
- <SelectValue />
342
- </SelectTrigger>
343
- <SelectContent>
344
- <SelectItem value="todo">To Do</SelectItem>
345
- <SelectItem value="inprogress">In Progress</SelectItem>
346
- <SelectItem value="inreview">In Review</SelectItem>
347
- <SelectItem value="done">Done</SelectItem>
348
- <SelectItem value="cancelled">Cancelled</SelectItem>
349
- </SelectContent>
350
- </Select>
351
- </div>
352
- )}
353
-
354
- <div className="flex flex-col-reverse sm:flex-row sm:justify-end gap-2 pt-2">
355
- <Button
356
- variant="outline"
357
- onClick={handleCancel}
358
- disabled={isSubmitting || isSubmittingAndStart}
359
- >
360
- Cancel
361
- </Button>
362
- {isEditMode ? (
363
- <Button
364
- onClick={handleSubmit}
365
- disabled={isSubmitting || !title.trim()}
366
- >
367
- {isSubmitting ? 'Updating...' : 'Update Task'}
368
- </Button>
369
- ) : (
370
- <>
371
- <Button
372
- variant="secondary"
373
- onClick={handleSubmit}
374
- disabled={
375
- isSubmitting || isSubmittingAndStart || !title.trim()
376
- }
377
- >
378
- {isSubmitting ? 'Creating...' : 'Create Task'}
379
- </Button>
380
- {onCreateAndStartTask && (
381
- <Button
382
- onClick={handleCreateAndStart}
383
- disabled={
384
- isSubmitting || isSubmittingAndStart || !title.trim()
385
- }
386
- className="font-medium"
387
- >
388
- {isSubmittingAndStart
389
- ? 'Creating & Starting...'
390
- : 'Create & Start'}
391
- </Button>
392
- )}
393
- </>
394
- )}
395
- </div>
396
- </div>
397
- </DialogContent>
398
- </Dialog>
399
- );
400
- }
@@ -1,180 +0,0 @@
1
- import { memo, useEffect, useMemo, useState } from 'react';
2
- import {
3
- type DragEndEvent,
4
- KanbanBoard,
5
- KanbanCards,
6
- KanbanHeader,
7
- KanbanProvider,
8
- } from '@/components/ui/shadcn-io/kanban';
9
- import { TaskCard } from './TaskCard';
10
- import type { TaskStatus, TaskWithAttemptStatus } from 'shared/types';
11
- import { useNavigate, useParams } from 'react-router-dom';
12
- import {
13
- useKeyboardShortcuts,
14
- useKanbanKeyboardNavigation,
15
- } from '@/lib/keyboard-shortcuts.ts';
16
-
17
- type Task = TaskWithAttemptStatus;
18
-
19
- interface TaskKanbanBoardProps {
20
- tasks: Task[];
21
- searchQuery?: string;
22
- onDragEnd: (event: DragEndEvent) => void;
23
- onEditTask: (task: Task) => void;
24
- onDeleteTask: (taskId: string) => void;
25
- onViewTaskDetails: (task: Task) => void;
26
- isPanelOpen: boolean;
27
- }
28
-
29
- const allTaskStatuses: TaskStatus[] = [
30
- 'todo',
31
- 'inprogress',
32
- 'inreview',
33
- 'done',
34
- 'cancelled',
35
- ];
36
-
37
- const statusLabels: Record<TaskStatus, string> = {
38
- todo: 'To Do',
39
- inprogress: 'In Progress',
40
- inreview: 'In Review',
41
- done: 'Done',
42
- cancelled: 'Cancelled',
43
- };
44
-
45
- const statusBoardColors: Record<TaskStatus, string> = {
46
- todo: 'hsl(var(--neutral))',
47
- inprogress: 'hsl(var(--info))',
48
- inreview: 'hsl(var(--warning))',
49
- done: 'hsl(var(--success))',
50
- cancelled: 'hsl(var(--destructive))',
51
- };
52
-
53
- function TaskKanbanBoard({
54
- tasks,
55
- searchQuery = '',
56
- onDragEnd,
57
- onEditTask,
58
- onDeleteTask,
59
- onViewTaskDetails,
60
- isPanelOpen,
61
- }: TaskKanbanBoardProps) {
62
- const { projectId, taskId } = useParams<{
63
- projectId: string;
64
- taskId?: string;
65
- }>();
66
- const navigate = useNavigate();
67
-
68
- useKeyboardShortcuts({
69
- navigate,
70
- currentPath: `/projects/${projectId}/tasks${taskId ? `/${taskId}` : ''}`,
71
- });
72
-
73
- const [focusedTaskId, setFocusedTaskId] = useState<string | null>(
74
- taskId || null
75
- );
76
- const [focusedStatus, setFocusedStatus] = useState<TaskStatus | null>(null);
77
-
78
- // Memoize filtered tasks
79
- const filteredTasks = useMemo(() => {
80
- if (!searchQuery.trim()) {
81
- return tasks;
82
- }
83
- const query = searchQuery.toLowerCase();
84
- return tasks.filter(
85
- (task) =>
86
- task.title.toLowerCase().includes(query) ||
87
- (task.description && task.description.toLowerCase().includes(query))
88
- );
89
- }, [tasks, searchQuery]);
90
-
91
- // Memoize grouped tasks
92
- const groupedTasks = useMemo(() => {
93
- const groups: Record<TaskStatus, Task[]> = {} as Record<TaskStatus, Task[]>;
94
- allTaskStatuses.forEach((status) => {
95
- groups[status] = [];
96
- });
97
- filteredTasks.forEach((task) => {
98
- const normalizedStatus = task.status.toLowerCase() as TaskStatus;
99
- if (groups[normalizedStatus]) {
100
- groups[normalizedStatus].push(task);
101
- } else {
102
- groups['todo'].push(task);
103
- }
104
- });
105
- return groups;
106
- }, [filteredTasks]);
107
-
108
- // Sync focus state with taskId param
109
- useEffect(() => {
110
- if (taskId) {
111
- const found = filteredTasks.find((t) => t.id === taskId);
112
- if (found) {
113
- setFocusedTaskId(taskId);
114
- setFocusedStatus((found.status.toLowerCase() as TaskStatus) || null);
115
- }
116
- }
117
- }, [taskId, filteredTasks]);
118
-
119
- // If no taskId in params, keep last focused, or focus first available
120
- useEffect(() => {
121
- if (!taskId && !focusedTaskId) {
122
- for (const status of allTaskStatuses) {
123
- if (groupedTasks[status] && groupedTasks[status].length > 0) {
124
- setFocusedTaskId(groupedTasks[status][0].id);
125
- setFocusedStatus(status);
126
- break;
127
- }
128
- }
129
- }
130
- }, [taskId, focusedTaskId, groupedTasks]);
131
-
132
- // Keyboard navigation handler
133
- useKanbanKeyboardNavigation({
134
- focusedTaskId,
135
- setFocusedTaskId: (id) => {
136
- setFocusedTaskId(id as string | null);
137
- if (isPanelOpen) {
138
- const task = filteredTasks.find((t: any) => t.id === id);
139
- if (task) {
140
- onViewTaskDetails(task);
141
- }
142
- }
143
- },
144
- focusedStatus,
145
- setFocusedStatus: (status) => setFocusedStatus(status as TaskStatus | null),
146
- groupedTasks,
147
- filteredTasks,
148
- allTaskStatuses,
149
- });
150
-
151
- return (
152
- <KanbanProvider onDragEnd={onDragEnd}>
153
- {Object.entries(groupedTasks).map(([status, statusTasks]) => (
154
- <KanbanBoard key={status} id={status as TaskStatus}>
155
- <KanbanHeader
156
- name={statusLabels[status as TaskStatus]}
157
- color={statusBoardColors[status as TaskStatus]}
158
- />
159
- <KanbanCards>
160
- {statusTasks.map((task, index) => (
161
- <TaskCard
162
- key={task.id}
163
- task={task}
164
- index={index}
165
- status={status}
166
- onEdit={onEditTask}
167
- onDelete={onDeleteTask}
168
- onViewDetails={onViewTaskDetails}
169
- isFocused={focusedTaskId === task.id}
170
- tabIndex={focusedTaskId === task.id ? 0 : -1}
171
- />
172
- ))}
173
- </KanbanCards>
174
- </KanbanBoard>
175
- ))}
176
- </KanbanProvider>
177
- );
178
- }
179
-
180
- export default memo(TaskKanbanBoard);