automagik-forge 0.1.11 → 0.1.13

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/.cargo/config.toml +13 -0
  2. package/.claude/commands/commit.md +376 -0
  3. package/.claude/commands/prompt.md +871 -0
  4. package/.env.example +20 -0
  5. package/.github/actions/setup-node/action.yml +29 -0
  6. package/.github/images/automagik-logo.png +0 -0
  7. package/.github/workflows/pre-release.yml +470 -0
  8. package/.github/workflows/publish.yml +145 -0
  9. package/.github/workflows/test.yml +63 -0
  10. package/.mcp.json +57 -0
  11. package/AGENT.md +40 -0
  12. package/CLAUDE.md +40 -0
  13. package/CODE-OF-CONDUCT.md +89 -0
  14. package/Cargo.toml +19 -0
  15. package/Dockerfile +43 -0
  16. package/LICENSE +201 -0
  17. package/Makefile +97 -0
  18. package/README.md +447 -143
  19. package/backend/.sqlx/query-01b7e2bac1261d8be3d03c03df3e5220590da6c31c77f161074fc62752d63881.json +12 -0
  20. package/backend/.sqlx/query-03f2b02ba6dc5ea2b3cf6b1004caea0ad6bcc10ebd63f441d321a389f026e263.json +12 -0
  21. package/backend/.sqlx/query-0923b77d137a29fc54d399a873ff15fc4af894490bc65a4d344a7575cb0d8643.json +12 -0
  22. package/backend/.sqlx/query-0f808bcdb63c5f180836e448dd64c435c51758b2fc54a52ce9e67495b1ab200e.json +68 -0
  23. package/backend/.sqlx/query-1268afe9ca849daa6722e3df7ca8e9e61f0d37052e782bb5452ab8e1018d9b63.json +12 -0
  24. package/backend/.sqlx/query-1b082630a9622f8667ee7a9aba2c2d3176019a68c6bb83d33008594821415a57.json +12 -0
  25. package/backend/.sqlx/query-1c7b06ba1e112abf6b945a2ff08a0b40ec23f3738c2e7399f067b558cf8d490e.json +12 -0
  26. package/backend/.sqlx/query-1f619f01f46859a64ded531dd0ef61abacfe62e758abe7030a6aa745140b95ca.json +104 -0
  27. package/backend/.sqlx/query-1fca1ce14b4b20205364cd1f1f45ebe1d2e30cd745e59e189d56487b5639dfbb.json +12 -0
  28. package/backend/.sqlx/query-212828320e8d871ab9d83705a040b23bcf0393dc7252177fc539a74657f578ef.json +32 -0
  29. package/backend/.sqlx/query-290ce5c152be8d36e58ff42570f9157beb07ab9e77a03ec6fc30b4f56f9b8f6b.json +56 -0
  30. package/backend/.sqlx/query-2b471d2c2e8ffbe0cd42d2a91b814c0d79f9d09200f147e3cea33ba4ce673c8a.json +68 -0
  31. package/backend/.sqlx/query-354a48c705bb9bb2048c1b7f10fcb714e23f9db82b7a4ea6932486197b2ede6a.json +92 -0
  32. package/backend/.sqlx/query-36c9e3dd10648e94b949db5c91a774ecb1e10a899ef95da74066eccedca4d8b2.json +12 -0
  33. package/backend/.sqlx/query-36e4ba7bbd81b402d5a20b6005755eafbb174c8dda442081823406ac32809a94.json +56 -0
  34. package/backend/.sqlx/query-3a5b3c98a55ca183ab20c74708e3d7e579dda37972c059e7515c4ceee4bd8dd3.json +62 -0
  35. package/backend/.sqlx/query-3d0a1cabf2a52e9d90cdfd29c509ca89aeb448d0c1d2446c65cd43db40735e86.json +62 -0
  36. package/backend/.sqlx/query-3d6bd16fbce59efe30b7f67ea342e0e4ea6d1432389c02468ad79f1f742d4031.json +56 -0
  37. package/backend/.sqlx/query-4049ca413b285a05aca6b25385e9c8185575f01e9069e4e8581aa45d713f612f.json +32 -0
  38. package/backend/.sqlx/query-412bacd3477d86369082e90f52240407abce436cb81292d42b2dbe1e5c18eea1.json +104 -0
  39. package/backend/.sqlx/query-417a8b1ff4e51de82aea0159a3b97932224dc325b23476cb84153d690227fd8b.json +62 -0
  40. package/backend/.sqlx/query-461cc1b0bb6fd909afc9dd2246e8526b3771cfbb0b22ae4b5d17b51af587b9e2.json +56 -0
  41. package/backend/.sqlx/query-58408c7a8cdeeda0bef359f1f9bd91299a339dc2b191462fc58c9736a56d5227.json +92 -0
  42. package/backend/.sqlx/query-5a886026d75d515c01f347cc203c8d99dd04c61dc468e2e4c5aa548436d13834.json +62 -0
  43. package/backend/.sqlx/query-5b902137b11022d2e1a5c4f6a9c83fec1a856c6a710aff831abd2382ede76b43.json +12 -0
  44. package/backend/.sqlx/query-5ed1238e52e59bb5f76c0f153fd99a14093f7ce2585bf9843585608f17ec575b.json +104 -0
  45. package/backend/.sqlx/query-6e8b860b14decfc2227dc57213f38442943d3fbef5c8418fd6b634c6e0f5e2ea.json +104 -0
  46. package/backend/.sqlx/query-6ec414276994c4ccb2433eaa5b1b342168557d17ddf5a52dac84cb1b59b9de8f.json +68 -0
  47. package/backend/.sqlx/query-6ecfa16d0cf825aacf233544b5baf151e9adfdca26c226ad71020d291fd802d5.json +62 -0
  48. package/backend/.sqlx/query-72509d252c39fce77520aa816cb2acbc1fb35dc2605e7be893610599b2427f2e.json +62 -0
  49. package/backend/.sqlx/query-75239b2da188f749707d77f3c1544332ca70db3d6d6743b2601dc0d167536437.json +62 -0
  50. package/backend/.sqlx/query-83d10e29f8478aff33434f9ac67068e013b888b953a2657e2bb72a6f619d04f2.json +50 -0
  51. package/backend/.sqlx/query-8610803360ea18b9b9d078a6981ea56abfbfe84e6354fc1d5ae4c622e01410ed.json +68 -0
  52. package/backend/.sqlx/query-86d03eb70eef39c59296416867f2ee66c9f7cd8b7f961fbda2f89fc0a1c442c2.json +12 -0
  53. package/backend/.sqlx/query-87d0feb5a6b442bad9c60068ea7569599cc6fc91a0e2692ecb42e93b03201b9d.json +68 -0
  54. package/backend/.sqlx/query-8a67b3b3337248f06a57bdf8a908f7ef23177431eaed82dc08c94c3e5944340e.json +12 -0
  55. package/backend/.sqlx/query-8f01ebd64bdcde6a090479f14810d73ba23020e76fd70854ac57f2da251702c3.json +12 -0
  56. package/backend/.sqlx/query-90fd607fcb2dca72239ff25e618e21e174b195991eaa33722cbf5f76da84cfab.json +62 -0
  57. package/backend/.sqlx/query-92e8bdbcd80c5ff3db7a35cf79492048803ef305cbdef0d0a1fe5dc881ca8c71.json +104 -0
  58. package/backend/.sqlx/query-93a1605f90e9672dad29b472b6ad85fa9a55ea3ffa5abcb8724b09d61be254ca.json +20 -0
  59. package/backend/.sqlx/query-9472c8fb477958167f5fae40b85ac44252468c5226b2cdd7770f027332eed6d7.json +104 -0
  60. package/backend/.sqlx/query-96036c4f9e0f48bdc5a4a4588f0c5f288ac7aaa5425cac40fc33f337e1a351f2.json +56 -0
  61. package/backend/.sqlx/query-9edb2c01e91fd0f0fe7b56e988c7ae0393150f50be3f419a981e035c0121dfc7.json +104 -0
  62. package/backend/.sqlx/query-a157cf00616f703bfba21927f1eb1c9eec2a81c02da15f66efdba0b6c375de1b.json +26 -0
  63. package/backend/.sqlx/query-a31fff84f3b8e532fd1160447d89d700f06ae08821fee00c9a5b60492b05259c.json +62 -0
  64. package/backend/.sqlx/query-a5ba908419fb3e456bdd2daca41ba06cc3212ffffb8520fc7dbbcc8b60ada314.json +12 -0
  65. package/backend/.sqlx/query-a6d2961718dbc3b1a925e549f49a159c561bef58c105529275f274b27e2eba5b.json +104 -0
  66. package/backend/.sqlx/query-a9e93d5b09b29faf66e387e4d7596a792d81e75c4d3726e83c2963e8d7c9b56f.json +104 -0
  67. package/backend/.sqlx/query-ac5247c8d7fb86e4650c4b0eb9420031614c831b7b085083bac20c1af314c538.json +12 -0
  68. package/backend/.sqlx/query-afef9467be74c411c4cb119a8b2b1aea53049877dfc30cc60b486134ba4b4c9f.json +68 -0
  69. package/backend/.sqlx/query-b2b2c6b4d0b1a347b5c4cb63c3a46a265d4db53be9554989a814b069d0af82f2.json +62 -0
  70. package/backend/.sqlx/query-c50d2ff0b12e5bcc81e371089ee2d007e233e7db93aefba4fef08e7aa68f5ab7.json +20 -0
  71. package/backend/.sqlx/query-c614e6056b244ca07f1b9d44e7edc9d5819225c6f8d9e077070c6e518a17f50b.json +12 -0
  72. package/backend/.sqlx/query-c67259be8bf4ee0cfd32167b2aa3b7fe9192809181a8171bf1c2d6df731967ae.json +12 -0
  73. package/backend/.sqlx/query-d2d0a1b985ebbca6a2b3e882a221a219f3199890fa640afc946ef1a792d6d8de.json +12 -0
  74. package/backend/.sqlx/query-d30aa5786757f32bf2b9c5fe51a45e506c71c28c5994e430d9b0546adb15ffa2.json +20 -0
  75. package/backend/.sqlx/query-d3b9ea1de1576af71b312924ce7f4ea8ae5dbe2ac138ea3b4470f2d5cd734846.json +12 -0
  76. package/backend/.sqlx/query-ed8456646fa69ddd412441955f06ff22bfb790f29466450735e0b8bb1bc4ec94.json +12 -0
  77. package/backend/Cargo.toml +71 -0
  78. package/backend/build.rs +32 -0
  79. package/backend/migrations/20250617183714_init.sql +44 -0
  80. package/backend/migrations/20250620212427_execution_processes.sql +25 -0
  81. package/backend/migrations/20250620214100_remove_stdout_stderr_from_task_attempts.sql +28 -0
  82. package/backend/migrations/20250621120000_relate_activities_to_execution_processes.sql +23 -0
  83. package/backend/migrations/20250623120000_executor_sessions.sql +17 -0
  84. package/backend/migrations/20250623130000_add_executor_type_to_execution_processes.sql +4 -0
  85. package/backend/migrations/20250625000000_add_dev_script_to_projects.sql +4 -0
  86. package/backend/migrations/20250701000000_add_branch_to_task_attempts.sql +2 -0
  87. package/backend/migrations/20250701000001_add_pr_tracking_to_task_attempts.sql +5 -0
  88. package/backend/migrations/20250701120000_add_assistant_message_to_executor_sessions.sql +2 -0
  89. package/backend/migrations/20250708000000_add_base_branch_to_task_attempts.sql +2 -0
  90. package/backend/migrations/20250709000000_add_worktree_deleted_flag.sql +2 -0
  91. package/backend/migrations/20250710000000_add_setup_completion.sql +3 -0
  92. package/backend/migrations/20250715154859_add_task_templates.sql +25 -0
  93. package/backend/migrations/20250716143725_add_default_templates.sql +174 -0
  94. package/backend/migrations/20250716161432_update_executor_names_to_kebab_case.sql +20 -0
  95. package/backend/migrations/20250716170000_add_parent_task_to_tasks.sql +7 -0
  96. package/backend/migrations/20250717000000_drop_task_attempt_activities.sql +9 -0
  97. package/backend/migrations/20250719000000_add_cleanup_script_to_projects.sql +2 -0
  98. package/backend/migrations/20250720000000_add_cleanupscript_to_process_type_constraint.sql +25 -0
  99. package/backend/migrations/20250723000000_add_wish_to_tasks.sql +7 -0
  100. package/backend/migrations/20250724000000_remove_unique_wish_constraint.sql +5 -0
  101. package/backend/scripts/toast-notification.ps1 +23 -0
  102. package/backend/sounds/abstract-sound1.wav +0 -0
  103. package/backend/sounds/abstract-sound2.wav +0 -0
  104. package/backend/sounds/abstract-sound3.wav +0 -0
  105. package/backend/sounds/abstract-sound4.wav +0 -0
  106. package/backend/sounds/cow-mooing.wav +0 -0
  107. package/backend/sounds/phone-vibration.wav +0 -0
  108. package/backend/sounds/rooster.wav +0 -0
  109. package/backend/src/app_state.rs +218 -0
  110. package/backend/src/bin/generate_types.rs +189 -0
  111. package/backend/src/bin/mcp_task_server.rs +191 -0
  112. package/backend/src/execution_monitor.rs +1193 -0
  113. package/backend/src/executor.rs +1053 -0
  114. package/backend/src/executors/amp.rs +697 -0
  115. package/backend/src/executors/ccr.rs +91 -0
  116. package/backend/src/executors/charm_opencode.rs +113 -0
  117. package/backend/src/executors/claude.rs +887 -0
  118. package/backend/src/executors/cleanup_script.rs +124 -0
  119. package/backend/src/executors/dev_server.rs +53 -0
  120. package/backend/src/executors/echo.rs +79 -0
  121. package/backend/src/executors/gemini/config.rs +67 -0
  122. package/backend/src/executors/gemini/streaming.rs +363 -0
  123. package/backend/src/executors/gemini.rs +765 -0
  124. package/backend/src/executors/mod.rs +23 -0
  125. package/backend/src/executors/opencode_ai.rs +113 -0
  126. package/backend/src/executors/setup_script.rs +130 -0
  127. package/backend/src/executors/sst_opencode/filter.rs +184 -0
  128. package/backend/src/executors/sst_opencode/tools.rs +139 -0
  129. package/backend/src/executors/sst_opencode.rs +756 -0
  130. package/backend/src/lib.rs +45 -0
  131. package/backend/src/main.rs +324 -0
  132. package/backend/src/mcp/mod.rs +1 -0
  133. package/backend/src/mcp/task_server.rs +850 -0
  134. package/backend/src/middleware/mod.rs +3 -0
  135. package/backend/src/middleware/model_loaders.rs +242 -0
  136. package/backend/src/models/api_response.rs +36 -0
  137. package/backend/src/models/config.rs +375 -0
  138. package/backend/src/models/execution_process.rs +430 -0
  139. package/backend/src/models/executor_session.rs +225 -0
  140. package/backend/src/models/mod.rs +12 -0
  141. package/backend/src/models/project.rs +356 -0
  142. package/backend/src/models/task.rs +345 -0
  143. package/backend/src/models/task_attempt.rs +1214 -0
  144. package/backend/src/models/task_template.rs +146 -0
  145. package/backend/src/openapi.rs +93 -0
  146. package/backend/src/routes/auth.rs +297 -0
  147. package/backend/src/routes/config.rs +385 -0
  148. package/backend/src/routes/filesystem.rs +228 -0
  149. package/backend/src/routes/health.rs +16 -0
  150. package/backend/src/routes/mod.rs +9 -0
  151. package/backend/src/routes/projects.rs +562 -0
  152. package/backend/src/routes/stream.rs +244 -0
  153. package/backend/src/routes/task_attempts.rs +1172 -0
  154. package/backend/src/routes/task_templates.rs +229 -0
  155. package/backend/src/routes/tasks.rs +353 -0
  156. package/backend/src/services/analytics.rs +216 -0
  157. package/backend/src/services/git_service.rs +1321 -0
  158. package/backend/src/services/github_service.rs +307 -0
  159. package/backend/src/services/mod.rs +13 -0
  160. package/backend/src/services/notification_service.rs +263 -0
  161. package/backend/src/services/pr_monitor.rs +214 -0
  162. package/backend/src/services/process_service.rs +940 -0
  163. package/backend/src/utils/path.rs +96 -0
  164. package/backend/src/utils/shell.rs +19 -0
  165. package/backend/src/utils/text.rs +24 -0
  166. package/backend/src/utils/worktree_manager.rs +578 -0
  167. package/backend/src/utils.rs +125 -0
  168. package/backend/test.db +0 -0
  169. package/build-npm-package.sh +61 -0
  170. package/dev_assets_seed/config.json +19 -0
  171. package/frontend/.eslintrc.json +25 -0
  172. package/frontend/.prettierrc.json +8 -0
  173. package/frontend/components.json +17 -0
  174. package/frontend/index.html +19 -0
  175. package/frontend/package-lock.json +7321 -0
  176. package/frontend/package.json +61 -0
  177. package/frontend/postcss.config.js +6 -0
  178. package/frontend/public/android-chrome-192x192.png +0 -0
  179. package/frontend/public/android-chrome-512x512.png +0 -0
  180. package/frontend/public/apple-touch-icon.png +0 -0
  181. package/frontend/public/automagik-forge-logo-dark.svg +3 -0
  182. package/frontend/public/automagik-forge-logo.svg +3 -0
  183. package/frontend/public/automagik-forge-screenshot-overview.png +0 -0
  184. package/frontend/public/favicon-16x16.png +0 -0
  185. package/frontend/public/favicon-32x32.png +0 -0
  186. package/frontend/public/favicon.ico +0 -0
  187. package/frontend/public/site.webmanifest +1 -0
  188. package/frontend/public/viba-kanban-favicon.png +0 -0
  189. package/frontend/src/App.tsx +157 -0
  190. package/frontend/src/components/DisclaimerDialog.tsx +106 -0
  191. package/frontend/src/components/GitHubLoginDialog.tsx +314 -0
  192. package/frontend/src/components/OnboardingDialog.tsx +185 -0
  193. package/frontend/src/components/PrivacyOptInDialog.tsx +130 -0
  194. package/frontend/src/components/ProvidePatDialog.tsx +98 -0
  195. package/frontend/src/components/TaskTemplateManager.tsx +336 -0
  196. package/frontend/src/components/config-provider.tsx +119 -0
  197. package/frontend/src/components/context/TaskDetailsContextProvider.tsx +470 -0
  198. package/frontend/src/components/context/taskDetailsContext.ts +125 -0
  199. package/frontend/src/components/keyboard-shortcuts-demo.tsx +35 -0
  200. package/frontend/src/components/layout/navbar.tsx +86 -0
  201. package/frontend/src/components/logo.tsx +44 -0
  202. package/frontend/src/components/projects/ProjectCard.tsx +155 -0
  203. package/frontend/src/components/projects/project-detail.tsx +251 -0
  204. package/frontend/src/components/projects/project-form-fields.tsx +238 -0
  205. package/frontend/src/components/projects/project-form.tsx +301 -0
  206. package/frontend/src/components/projects/project-list.tsx +200 -0
  207. package/frontend/src/components/projects/projects-page.tsx +20 -0
  208. package/frontend/src/components/tasks/BranchSelector.tsx +169 -0
  209. package/frontend/src/components/tasks/DeleteFileConfirmationDialog.tsx +94 -0
  210. package/frontend/src/components/tasks/EditorSelectionDialog.tsx +119 -0
  211. package/frontend/src/components/tasks/TaskCard.tsx +154 -0
  212. package/frontend/src/components/tasks/TaskDetails/CollapsibleToolbar.tsx +33 -0
  213. package/frontend/src/components/tasks/TaskDetails/DiffCard.tsx +109 -0
  214. package/frontend/src/components/tasks/TaskDetails/DiffChunkSection.tsx +135 -0
  215. package/frontend/src/components/tasks/TaskDetails/DiffFile.tsx +296 -0
  216. package/frontend/src/components/tasks/TaskDetails/DiffTab.tsx +32 -0
  217. package/frontend/src/components/tasks/TaskDetails/DisplayConversationEntry.tsx +392 -0
  218. package/frontend/src/components/tasks/TaskDetails/LogsTab/Conversation.tsx +256 -0
  219. package/frontend/src/components/tasks/TaskDetails/LogsTab/ConversationEntry.tsx +56 -0
  220. package/frontend/src/components/tasks/TaskDetails/LogsTab/NormalizedConversationViewer.tsx +92 -0
  221. package/frontend/src/components/tasks/TaskDetails/LogsTab/Prompt.tsx +22 -0
  222. package/frontend/src/components/tasks/TaskDetails/LogsTab/SetupScriptRunning.tsx +49 -0
  223. package/frontend/src/components/tasks/TaskDetails/LogsTab.tsx +186 -0
  224. package/frontend/src/components/tasks/TaskDetails/ProcessesTab.tsx +288 -0
  225. package/frontend/src/components/tasks/TaskDetails/RelatedTasksTab.tsx +216 -0
  226. package/frontend/src/components/tasks/TaskDetails/TabNavigation.tsx +93 -0
  227. package/frontend/src/components/tasks/TaskDetailsHeader.tsx +169 -0
  228. package/frontend/src/components/tasks/TaskDetailsPanel.tsx +126 -0
  229. package/frontend/src/components/tasks/TaskDetailsToolbar.tsx +302 -0
  230. package/frontend/src/components/tasks/TaskFollowUpSection.tsx +130 -0
  231. package/frontend/src/components/tasks/TaskFormDialog.tsx +400 -0
  232. package/frontend/src/components/tasks/TaskKanbanBoard.tsx +180 -0
  233. package/frontend/src/components/tasks/Toolbar/CreateAttempt.tsx +259 -0
  234. package/frontend/src/components/tasks/Toolbar/CreatePRDialog.tsx +243 -0
  235. package/frontend/src/components/tasks/Toolbar/CurrentAttempt.tsx +899 -0
  236. package/frontend/src/components/tasks/index.ts +2 -0
  237. package/frontend/src/components/theme-provider.tsx +82 -0
  238. package/frontend/src/components/theme-toggle.tsx +36 -0
  239. package/frontend/src/components/ui/alert.tsx +59 -0
  240. package/frontend/src/components/ui/auto-expanding-textarea.tsx +70 -0
  241. package/frontend/src/components/ui/badge.tsx +36 -0
  242. package/frontend/src/components/ui/button.tsx +56 -0
  243. package/frontend/src/components/ui/card.tsx +86 -0
  244. package/frontend/src/components/ui/checkbox.tsx +44 -0
  245. package/frontend/src/components/ui/chip.tsx +25 -0
  246. package/frontend/src/components/ui/dialog.tsx +124 -0
  247. package/frontend/src/components/ui/dropdown-menu.tsx +198 -0
  248. package/frontend/src/components/ui/file-search-textarea.tsx +292 -0
  249. package/frontend/src/components/ui/folder-picker.tsx +279 -0
  250. package/frontend/src/components/ui/input.tsx +25 -0
  251. package/frontend/src/components/ui/label.tsx +24 -0
  252. package/frontend/src/components/ui/loader.tsx +26 -0
  253. package/frontend/src/components/ui/markdown-renderer.tsx +75 -0
  254. package/frontend/src/components/ui/select.tsx +160 -0
  255. package/frontend/src/components/ui/separator.tsx +31 -0
  256. package/frontend/src/components/ui/shadcn-io/kanban/index.tsx +185 -0
  257. package/frontend/src/components/ui/table.tsx +117 -0
  258. package/frontend/src/components/ui/tabs.tsx +53 -0
  259. package/frontend/src/components/ui/textarea.tsx +22 -0
  260. package/frontend/src/components/ui/tooltip.tsx +28 -0
  261. package/frontend/src/hooks/useNormalizedConversation.ts +440 -0
  262. package/frontend/src/index.css +225 -0
  263. package/frontend/src/lib/api.ts +630 -0
  264. package/frontend/src/lib/keyboard-shortcuts.ts +266 -0
  265. package/frontend/src/lib/responsive-config.ts +70 -0
  266. package/frontend/src/lib/types.ts +39 -0
  267. package/frontend/src/lib/utils.ts +10 -0
  268. package/frontend/src/main.tsx +50 -0
  269. package/frontend/src/pages/McpServers.tsx +418 -0
  270. package/frontend/src/pages/Settings.tsx +610 -0
  271. package/frontend/src/pages/project-tasks.tsx +575 -0
  272. package/frontend/src/pages/projects.tsx +18 -0
  273. package/frontend/src/vite-env.d.ts +1 -0
  274. package/frontend/tailwind.config.js +125 -0
  275. package/frontend/tsconfig.json +26 -0
  276. package/frontend/tsconfig.node.json +10 -0
  277. package/frontend/vite.config.ts +33 -0
  278. package/npx-cli/README.md +159 -0
  279. package/npx-cli/automagik-forge-0.0.55.tgz +0 -0
  280. package/npx-cli/automagik-forge-0.1.0.tgz +0 -0
  281. package/{dist/linux-x64/automagik-forge.zip → npx-cli/automagik-forge-0.1.10.tgz} +0 -0
  282. package/npx-cli/package.json +17 -0
  283. package/npx-cli/vibe-kanban-0.0.55.tgz +0 -0
  284. package/package.json +23 -13
  285. package/pnpm-workspace.yaml +2 -0
  286. package/rust-toolchain.toml +11 -0
  287. package/rustfmt.toml +3 -0
  288. package/scripts/load-env.js +43 -0
  289. package/scripts/mcp_test.js +374 -0
  290. package/scripts/prepare-db.js +45 -0
  291. package/scripts/setup-dev-environment.js +274 -0
  292. package/scripts/start-mcp-sse.js +70 -0
  293. package/scripts/test-debug.js +32 -0
  294. package/scripts/test-mcp-sse.js +138 -0
  295. package/scripts/test-simple.js +44 -0
  296. package/scripts/test-wish-final.js +179 -0
  297. package/scripts/test-wish-system.js +221 -0
  298. package/shared/types.ts +182 -0
  299. package/test-npm-package.sh +42 -0
  300. package/dist/linux-x64/automagik-forge-mcp.zip +0 -0
  301. /package/{bin → npx-cli/bin}/cli.js +0 -0
@@ -0,0 +1,418 @@
1
+ import { useState, useEffect } from 'react';
2
+ import {
3
+ Card,
4
+ CardContent,
5
+ CardDescription,
6
+ CardHeader,
7
+ CardTitle,
8
+ } from '@/components/ui/card';
9
+ import { Button } from '@/components/ui/button';
10
+ import {
11
+ Select,
12
+ SelectContent,
13
+ SelectItem,
14
+ SelectTrigger,
15
+ SelectValue,
16
+ } from '@/components/ui/select';
17
+ import { Label } from '@/components/ui/label';
18
+ import { Alert, AlertDescription } from '@/components/ui/alert';
19
+ import { Textarea } from '@/components/ui/textarea';
20
+ import { Loader2 } from 'lucide-react';
21
+ import { EXECUTOR_TYPES, EXECUTOR_LABELS } from 'shared/types';
22
+ import { useConfig } from '@/components/config-provider';
23
+ import { mcpServersApi } from '../lib/api';
24
+
25
+ export function McpServers() {
26
+ const { config } = useConfig();
27
+ const [mcpServers, setMcpServers] = useState('{}');
28
+ const [mcpError, setMcpError] = useState<string | null>(null);
29
+ const [mcpLoading, setMcpLoading] = useState(true);
30
+ const [selectedMcpExecutor, setSelectedMcpExecutor] = useState<string>('');
31
+ const [mcpApplying, setMcpApplying] = useState(false);
32
+ const [mcpConfigPath, setMcpConfigPath] = useState<string>('');
33
+ const [success, setSuccess] = useState(false);
34
+
35
+ // Initialize selected MCP executor when config loads
36
+ useEffect(() => {
37
+ if (config?.executor?.type && !selectedMcpExecutor) {
38
+ setSelectedMcpExecutor(config.executor.type);
39
+ }
40
+ }, [config?.executor?.type, selectedMcpExecutor]);
41
+
42
+ // Load existing MCP configuration when selected executor changes
43
+ useEffect(() => {
44
+ const loadMcpServersForExecutor = async (executorType: string) => {
45
+ // Reset state when loading
46
+ setMcpLoading(true);
47
+ setMcpError(null);
48
+
49
+ // Set default empty config based on executor type
50
+ const defaultConfig =
51
+ executorType === 'amp'
52
+ ? '{\n "amp.mcpServers": {\n }\n}'
53
+ : executorType === 'sst-opencode'
54
+ ? '{\n "mcp": {\n }, "$schema": "https://opencode.ai/config.json"\n}'
55
+ : '{\n "mcpServers": {\n }\n}';
56
+ setMcpServers(defaultConfig);
57
+ setMcpConfigPath('');
58
+
59
+ try {
60
+ // Load MCP servers for the selected executor
61
+ const result = await mcpServersApi.load(executorType);
62
+ // Handle new response format with servers and config_path
63
+ const data = result || {};
64
+ const servers = data.servers || {};
65
+ const configPath = data.config_path || '';
66
+
67
+ // Create the full configuration structure based on executor type
68
+ let fullConfig;
69
+ if (executorType === 'amp') {
70
+ // For AMP, use the amp.mcpServers structure
71
+ fullConfig = { 'amp.mcpServers': servers };
72
+ } else if (executorType === 'sst-opencode') {
73
+ fullConfig = {
74
+ mcp: servers,
75
+ $schema: 'https://opencode.ai/config.json',
76
+ };
77
+ } else {
78
+ // For other executors, use the standard mcpServers structure
79
+ fullConfig = { mcpServers: servers };
80
+ }
81
+
82
+ const configJson = JSON.stringify(fullConfig, null, 2);
83
+ setMcpServers(configJson);
84
+ setMcpConfigPath(configPath);
85
+ } catch (err: any) {
86
+ if (err?.message && err.message.includes('does not support MCP')) {
87
+ setMcpError(err.message);
88
+ } else {
89
+ console.error('Error loading MCP servers:', err);
90
+ }
91
+ } finally {
92
+ setMcpLoading(false);
93
+ }
94
+ };
95
+
96
+ // Load MCP servers for the selected MCP executor
97
+ if (selectedMcpExecutor) {
98
+ loadMcpServersForExecutor(selectedMcpExecutor);
99
+ }
100
+ }, [selectedMcpExecutor]);
101
+
102
+ const handleMcpServersChange = (value: string) => {
103
+ setMcpServers(value);
104
+ setMcpError(null);
105
+
106
+ // Validate JSON on change
107
+ if (value.trim()) {
108
+ try {
109
+ const config = JSON.parse(value);
110
+ // Validate that the config has the expected structure based on executor type
111
+ if (selectedMcpExecutor === 'amp') {
112
+ if (
113
+ !config['amp.mcpServers'] ||
114
+ typeof config['amp.mcpServers'] !== 'object'
115
+ ) {
116
+ setMcpError(
117
+ 'AMP configuration must contain an "amp.mcpServers" object'
118
+ );
119
+ }
120
+ } else if (selectedMcpExecutor === 'sst-opencode') {
121
+ if (!config.mcp || typeof config.mcp !== 'object') {
122
+ setMcpError('Configuration must contain an "mcp" object');
123
+ }
124
+ } else {
125
+ if (!config.mcpServers || typeof config.mcpServers !== 'object') {
126
+ setMcpError('Configuration must contain an "mcpServers" object');
127
+ }
128
+ }
129
+ } catch (err) {
130
+ setMcpError('Invalid JSON format');
131
+ }
132
+ }
133
+ };
134
+
135
+ const handleConfigureAutomagikForge = async () => {
136
+ if (!selectedMcpExecutor) return;
137
+
138
+ try {
139
+ // Parse existing configuration
140
+ const existingConfig = mcpServers.trim() ? JSON.parse(mcpServers) : {};
141
+
142
+ // Always use production MCP installation instructions
143
+ const vibeKanbanConfig =
144
+ selectedMcpExecutor === 'sst-opencode'
145
+ ? {
146
+ type: 'local',
147
+ command: ['npx', '-y', 'automagik-forge', '--mcp'],
148
+ enabled: true,
149
+ }
150
+ : {
151
+ command: 'npx',
152
+ args: ['-y', 'automagik-forge', '--mcp'],
153
+ };
154
+
155
+ // Add automagik_forge to the existing configuration
156
+ let updatedConfig;
157
+ if (selectedMcpExecutor === 'amp') {
158
+ updatedConfig = {
159
+ ...existingConfig,
160
+ 'amp.mcpServers': {
161
+ ...(existingConfig['amp.mcpServers'] || {}),
162
+ automagik_forge: vibeKanbanConfig,
163
+ },
164
+ };
165
+ } else if (selectedMcpExecutor === 'sst-opencode') {
166
+ updatedConfig = {
167
+ ...existingConfig,
168
+ mcp: {
169
+ ...(existingConfig.mcp || {}),
170
+ automagik_forge: vibeKanbanConfig,
171
+ },
172
+ };
173
+ } else {
174
+ updatedConfig = {
175
+ ...existingConfig,
176
+ mcpServers: {
177
+ ...(existingConfig.mcpServers || {}),
178
+ automagik_forge: vibeKanbanConfig,
179
+ },
180
+ };
181
+ }
182
+
183
+ // Update the textarea with the new configuration
184
+ const configJson = JSON.stringify(updatedConfig, null, 2);
185
+ setMcpServers(configJson);
186
+ setMcpError(null);
187
+ } catch (err) {
188
+ setMcpError('Failed to configure automagik-forge MCP server');
189
+ console.error('Error configuring automagik-forge:', err);
190
+ }
191
+ };
192
+
193
+ const handleApplyMcpServers = async () => {
194
+ if (!selectedMcpExecutor) return;
195
+
196
+ setMcpApplying(true);
197
+ setMcpError(null);
198
+
199
+ try {
200
+ // Validate and save MCP configuration
201
+ if (mcpServers.trim()) {
202
+ try {
203
+ const fullConfig = JSON.parse(mcpServers);
204
+
205
+ // Validate that the config has the expected structure based on executor type
206
+ let mcpServersConfig;
207
+ if (selectedMcpExecutor === 'amp') {
208
+ if (
209
+ !fullConfig['amp.mcpServers'] ||
210
+ typeof fullConfig['amp.mcpServers'] !== 'object'
211
+ ) {
212
+ throw new Error(
213
+ 'AMP configuration must contain an "amp.mcpServers" object'
214
+ );
215
+ }
216
+ // Extract just the inner servers object for the API - backend will handle nesting
217
+ mcpServersConfig = fullConfig['amp.mcpServers'];
218
+ } else if (selectedMcpExecutor === 'sst-opencode') {
219
+ if (!fullConfig.mcp || typeof fullConfig.mcp !== 'object') {
220
+ throw new Error('Configuration must contain an "mcp" object');
221
+ }
222
+ // Extract just the mcp part for the API
223
+ mcpServersConfig = fullConfig.mcp;
224
+ } else {
225
+ if (
226
+ !fullConfig.mcpServers ||
227
+ typeof fullConfig.mcpServers !== 'object'
228
+ ) {
229
+ throw new Error(
230
+ 'Configuration must contain an "mcpServers" object'
231
+ );
232
+ }
233
+ // Extract just the mcpServers part for the API
234
+ mcpServersConfig = fullConfig.mcpServers;
235
+ }
236
+
237
+ await mcpServersApi.save(selectedMcpExecutor, mcpServersConfig);
238
+
239
+ // Show success feedback
240
+ setSuccess(true);
241
+ setTimeout(() => setSuccess(false), 3000);
242
+ } catch (mcpErr) {
243
+ if (mcpErr instanceof SyntaxError) {
244
+ setMcpError('Invalid JSON format');
245
+ } else {
246
+ setMcpError(
247
+ mcpErr instanceof Error
248
+ ? mcpErr.message
249
+ : 'Failed to save MCP servers'
250
+ );
251
+ }
252
+ }
253
+ }
254
+ } catch (err) {
255
+ setMcpError('Failed to apply MCP server configuration');
256
+ console.error('Error applying MCP servers:', err);
257
+ } finally {
258
+ setMcpApplying(false);
259
+ }
260
+ };
261
+
262
+ if (!config) {
263
+ return (
264
+ <div className="container mx-auto px-4 py-8">
265
+ <Alert variant="destructive">
266
+ <AlertDescription>Failed to load configuration.</AlertDescription>
267
+ </Alert>
268
+ </div>
269
+ );
270
+ }
271
+
272
+ return (
273
+ <div className="container mx-auto px-4 py-8 max-w-4xl">
274
+ <div className="space-y-6">
275
+ <div>
276
+ <h1 className="text-3xl font-bold">MCP Servers</h1>
277
+ <p className="text-muted-foreground">
278
+ Configure MCP servers to extend executor capabilities.
279
+ </p>
280
+ </div>
281
+
282
+ {mcpError && (
283
+ <Alert variant="destructive">
284
+ <AlertDescription>
285
+ MCP Configuration Error: {mcpError}
286
+ </AlertDescription>
287
+ </Alert>
288
+ )}
289
+
290
+ {success && (
291
+ <Alert className="border-green-200 bg-green-50 text-green-800 dark:border-green-800 dark:bg-green-950 dark:text-green-200">
292
+ <AlertDescription className="font-medium">
293
+ ✓ MCP configuration saved successfully!
294
+ </AlertDescription>
295
+ </Alert>
296
+ )}
297
+
298
+ <Card>
299
+ <CardHeader>
300
+ <CardTitle>Configuration</CardTitle>
301
+ <CardDescription>
302
+ Configure MCP servers for different executors to extend their
303
+ capabilities with custom tools and resources.
304
+ </CardDescription>
305
+ </CardHeader>
306
+ <CardContent className="space-y-4">
307
+ <div className="space-y-2">
308
+ <Label htmlFor="mcp-executor">Executor</Label>
309
+ <Select
310
+ value={selectedMcpExecutor}
311
+ onValueChange={(value: string) => setSelectedMcpExecutor(value)}
312
+ >
313
+ <SelectTrigger id="mcp-executor">
314
+ <SelectValue placeholder="Select executor" />
315
+ </SelectTrigger>
316
+ <SelectContent>
317
+ {EXECUTOR_TYPES.map((type) => (
318
+ <SelectItem key={type} value={type}>
319
+ {EXECUTOR_LABELS[type]}
320
+ </SelectItem>
321
+ ))}
322
+ </SelectContent>
323
+ </Select>
324
+ <p className="text-sm text-muted-foreground">
325
+ Choose which executor to configure MCP servers for.
326
+ </p>
327
+ </div>
328
+
329
+ {mcpError && mcpError.includes('does not support MCP') ? (
330
+ <div className="rounded-lg border border-amber-200 bg-amber-50 p-4 dark:border-amber-800 dark:bg-amber-950">
331
+ <div className="flex">
332
+ <div className="ml-3">
333
+ <h3 className="text-sm font-medium text-amber-800 dark:text-amber-200">
334
+ MCP Not Supported
335
+ </h3>
336
+ <div className="mt-2 text-sm text-amber-700 dark:text-amber-300">
337
+ <p>{mcpError}</p>
338
+ <p className="mt-1">
339
+ To use MCP servers, please select a different executor
340
+ (Claude, Amp, or Gemini) above.
341
+ </p>
342
+ </div>
343
+ </div>
344
+ </div>
345
+ </div>
346
+ ) : (
347
+ <div className="space-y-2">
348
+ <Label htmlFor="mcp-servers">MCP Server Configuration</Label>
349
+ <Textarea
350
+ id="mcp-servers"
351
+ placeholder={
352
+ mcpLoading
353
+ ? 'Loading current configuration...'
354
+ : '{\n "server-name": {\n "type": "stdio",\n "command": "your-command",\n "args": ["arg1", "arg2"]\n }\n}'
355
+ }
356
+ value={mcpLoading ? 'Loading...' : mcpServers}
357
+ onChange={(e) => handleMcpServersChange(e.target.value)}
358
+ disabled={mcpLoading}
359
+ className="font-mono text-sm min-h-[300px]"
360
+ />
361
+ {mcpError && !mcpError.includes('does not support MCP') && (
362
+ <p className="text-sm text-red-600 dark:text-red-400">
363
+ {mcpError}
364
+ </p>
365
+ )}
366
+ <div className="text-sm text-muted-foreground">
367
+ {mcpLoading ? (
368
+ 'Loading current MCP server configuration...'
369
+ ) : (
370
+ <span>
371
+ Changes will be saved to:
372
+ {mcpConfigPath && (
373
+ <span className="ml-2 font-mono text-xs">
374
+ {mcpConfigPath}
375
+ </span>
376
+ )}
377
+ </span>
378
+ )}
379
+ </div>
380
+
381
+ <div className="pt-4">
382
+ <Button
383
+ onClick={handleConfigureAutomagikForge}
384
+ disabled={mcpApplying || mcpLoading || !selectedMcpExecutor}
385
+ className="w-64"
386
+ >
387
+ Add Automagik-Forge MCP
388
+ </Button>
389
+ <p className="text-sm text-muted-foreground mt-2">
390
+ Automatically adds the Automagik-Forge MCP server.
391
+ </p>
392
+ </div>
393
+ </div>
394
+ )}
395
+ </CardContent>
396
+ </Card>
397
+
398
+ {/* Sticky save button */}
399
+ <div className="fixed bottom-0 left-0 right-0 bg-background/80 backdrop-blur-sm border-t p-4 z-10">
400
+ <div className="container mx-auto max-w-4xl flex justify-end">
401
+ <Button
402
+ onClick={handleApplyMcpServers}
403
+ disabled={mcpApplying || mcpLoading || !!mcpError || success}
404
+ className={success ? 'bg-green-600 hover:bg-green-700' : ''}
405
+ >
406
+ {mcpApplying && <Loader2 className="mr-2 h-4 w-4 animate-spin" />}
407
+ {success && <span className="mr-2">✓</span>}
408
+ {success ? 'Settings Saved!' : 'Save Settings'}
409
+ </Button>
410
+ </div>
411
+ </div>
412
+
413
+ {/* Spacer to prevent content from being hidden behind sticky button */}
414
+ <div className="h-20"></div>
415
+ </div>
416
+ </div>
417
+ );
418
+ }