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.
- package/README.md +143 -447
- package/dist/linux-x64/automagik-forge-mcp.zip +0 -0
- package/{npx-cli/automagik-forge-0.0.55.tgz → dist/linux-x64/automagik-forge.zip} +0 -0
- package/package.json +13 -23
- package/.cargo/config.toml +0 -13
- package/.claude/commands/commit.md +0 -376
- package/.claude/commands/prompt.md +0 -871
- package/.env.example +0 -20
- package/.github/actions/setup-node/action.yml +0 -29
- package/.github/images/automagik-logo.png +0 -0
- package/.github/workflows/pre-release.yml +0 -470
- package/.github/workflows/publish.yml +0 -145
- package/.github/workflows/test.yml +0 -63
- package/.mcp.json +0 -57
- package/AGENT.md +0 -40
- package/CLAUDE.md +0 -40
- package/CODE-OF-CONDUCT.md +0 -89
- package/Cargo.toml +0 -19
- package/Dockerfile +0 -43
- package/LICENSE +0 -201
- package/Makefile +0 -97
- package/backend/.sqlx/query-01b7e2bac1261d8be3d03c03df3e5220590da6c31c77f161074fc62752d63881.json +0 -12
- package/backend/.sqlx/query-03f2b02ba6dc5ea2b3cf6b1004caea0ad6bcc10ebd63f441d321a389f026e263.json +0 -12
- package/backend/.sqlx/query-0923b77d137a29fc54d399a873ff15fc4af894490bc65a4d344a7575cb0d8643.json +0 -12
- package/backend/.sqlx/query-0f808bcdb63c5f180836e448dd64c435c51758b2fc54a52ce9e67495b1ab200e.json +0 -68
- package/backend/.sqlx/query-1268afe9ca849daa6722e3df7ca8e9e61f0d37052e782bb5452ab8e1018d9b63.json +0 -12
- package/backend/.sqlx/query-1b082630a9622f8667ee7a9aba2c2d3176019a68c6bb83d33008594821415a57.json +0 -12
- package/backend/.sqlx/query-1c7b06ba1e112abf6b945a2ff08a0b40ec23f3738c2e7399f067b558cf8d490e.json +0 -12
- package/backend/.sqlx/query-1f619f01f46859a64ded531dd0ef61abacfe62e758abe7030a6aa745140b95ca.json +0 -104
- package/backend/.sqlx/query-1fca1ce14b4b20205364cd1f1f45ebe1d2e30cd745e59e189d56487b5639dfbb.json +0 -12
- package/backend/.sqlx/query-212828320e8d871ab9d83705a040b23bcf0393dc7252177fc539a74657f578ef.json +0 -32
- package/backend/.sqlx/query-290ce5c152be8d36e58ff42570f9157beb07ab9e77a03ec6fc30b4f56f9b8f6b.json +0 -56
- package/backend/.sqlx/query-2b471d2c2e8ffbe0cd42d2a91b814c0d79f9d09200f147e3cea33ba4ce673c8a.json +0 -68
- package/backend/.sqlx/query-354a48c705bb9bb2048c1b7f10fcb714e23f9db82b7a4ea6932486197b2ede6a.json +0 -92
- package/backend/.sqlx/query-36c9e3dd10648e94b949db5c91a774ecb1e10a899ef95da74066eccedca4d8b2.json +0 -12
- package/backend/.sqlx/query-36e4ba7bbd81b402d5a20b6005755eafbb174c8dda442081823406ac32809a94.json +0 -56
- package/backend/.sqlx/query-3a5b3c98a55ca183ab20c74708e3d7e579dda37972c059e7515c4ceee4bd8dd3.json +0 -62
- package/backend/.sqlx/query-3d0a1cabf2a52e9d90cdfd29c509ca89aeb448d0c1d2446c65cd43db40735e86.json +0 -62
- package/backend/.sqlx/query-3d6bd16fbce59efe30b7f67ea342e0e4ea6d1432389c02468ad79f1f742d4031.json +0 -56
- package/backend/.sqlx/query-4049ca413b285a05aca6b25385e9c8185575f01e9069e4e8581aa45d713f612f.json +0 -32
- package/backend/.sqlx/query-412bacd3477d86369082e90f52240407abce436cb81292d42b2dbe1e5c18eea1.json +0 -104
- package/backend/.sqlx/query-417a8b1ff4e51de82aea0159a3b97932224dc325b23476cb84153d690227fd8b.json +0 -62
- package/backend/.sqlx/query-461cc1b0bb6fd909afc9dd2246e8526b3771cfbb0b22ae4b5d17b51af587b9e2.json +0 -56
- package/backend/.sqlx/query-58408c7a8cdeeda0bef359f1f9bd91299a339dc2b191462fc58c9736a56d5227.json +0 -92
- package/backend/.sqlx/query-5a886026d75d515c01f347cc203c8d99dd04c61dc468e2e4c5aa548436d13834.json +0 -62
- package/backend/.sqlx/query-5b902137b11022d2e1a5c4f6a9c83fec1a856c6a710aff831abd2382ede76b43.json +0 -12
- package/backend/.sqlx/query-5ed1238e52e59bb5f76c0f153fd99a14093f7ce2585bf9843585608f17ec575b.json +0 -104
- package/backend/.sqlx/query-6e8b860b14decfc2227dc57213f38442943d3fbef5c8418fd6b634c6e0f5e2ea.json +0 -104
- package/backend/.sqlx/query-6ec414276994c4ccb2433eaa5b1b342168557d17ddf5a52dac84cb1b59b9de8f.json +0 -68
- package/backend/.sqlx/query-6ecfa16d0cf825aacf233544b5baf151e9adfdca26c226ad71020d291fd802d5.json +0 -62
- package/backend/.sqlx/query-72509d252c39fce77520aa816cb2acbc1fb35dc2605e7be893610599b2427f2e.json +0 -62
- package/backend/.sqlx/query-75239b2da188f749707d77f3c1544332ca70db3d6d6743b2601dc0d167536437.json +0 -62
- package/backend/.sqlx/query-83d10e29f8478aff33434f9ac67068e013b888b953a2657e2bb72a6f619d04f2.json +0 -50
- package/backend/.sqlx/query-8610803360ea18b9b9d078a6981ea56abfbfe84e6354fc1d5ae4c622e01410ed.json +0 -68
- package/backend/.sqlx/query-86d03eb70eef39c59296416867f2ee66c9f7cd8b7f961fbda2f89fc0a1c442c2.json +0 -12
- package/backend/.sqlx/query-87d0feb5a6b442bad9c60068ea7569599cc6fc91a0e2692ecb42e93b03201b9d.json +0 -68
- package/backend/.sqlx/query-8a67b3b3337248f06a57bdf8a908f7ef23177431eaed82dc08c94c3e5944340e.json +0 -12
- package/backend/.sqlx/query-8f01ebd64bdcde6a090479f14810d73ba23020e76fd70854ac57f2da251702c3.json +0 -12
- package/backend/.sqlx/query-90fd607fcb2dca72239ff25e618e21e174b195991eaa33722cbf5f76da84cfab.json +0 -62
- package/backend/.sqlx/query-92e8bdbcd80c5ff3db7a35cf79492048803ef305cbdef0d0a1fe5dc881ca8c71.json +0 -104
- package/backend/.sqlx/query-93a1605f90e9672dad29b472b6ad85fa9a55ea3ffa5abcb8724b09d61be254ca.json +0 -20
- package/backend/.sqlx/query-9472c8fb477958167f5fae40b85ac44252468c5226b2cdd7770f027332eed6d7.json +0 -104
- package/backend/.sqlx/query-96036c4f9e0f48bdc5a4a4588f0c5f288ac7aaa5425cac40fc33f337e1a351f2.json +0 -56
- package/backend/.sqlx/query-9edb2c01e91fd0f0fe7b56e988c7ae0393150f50be3f419a981e035c0121dfc7.json +0 -104
- package/backend/.sqlx/query-a157cf00616f703bfba21927f1eb1c9eec2a81c02da15f66efdba0b6c375de1b.json +0 -26
- package/backend/.sqlx/query-a31fff84f3b8e532fd1160447d89d700f06ae08821fee00c9a5b60492b05259c.json +0 -62
- package/backend/.sqlx/query-a5ba908419fb3e456bdd2daca41ba06cc3212ffffb8520fc7dbbcc8b60ada314.json +0 -12
- package/backend/.sqlx/query-a6d2961718dbc3b1a925e549f49a159c561bef58c105529275f274b27e2eba5b.json +0 -104
- package/backend/.sqlx/query-a9e93d5b09b29faf66e387e4d7596a792d81e75c4d3726e83c2963e8d7c9b56f.json +0 -104
- package/backend/.sqlx/query-ac5247c8d7fb86e4650c4b0eb9420031614c831b7b085083bac20c1af314c538.json +0 -12
- package/backend/.sqlx/query-afef9467be74c411c4cb119a8b2b1aea53049877dfc30cc60b486134ba4b4c9f.json +0 -68
- package/backend/.sqlx/query-b2b2c6b4d0b1a347b5c4cb63c3a46a265d4db53be9554989a814b069d0af82f2.json +0 -62
- package/backend/.sqlx/query-c50d2ff0b12e5bcc81e371089ee2d007e233e7db93aefba4fef08e7aa68f5ab7.json +0 -20
- package/backend/.sqlx/query-c614e6056b244ca07f1b9d44e7edc9d5819225c6f8d9e077070c6e518a17f50b.json +0 -12
- package/backend/.sqlx/query-c67259be8bf4ee0cfd32167b2aa3b7fe9192809181a8171bf1c2d6df731967ae.json +0 -12
- package/backend/.sqlx/query-d2d0a1b985ebbca6a2b3e882a221a219f3199890fa640afc946ef1a792d6d8de.json +0 -12
- package/backend/.sqlx/query-d30aa5786757f32bf2b9c5fe51a45e506c71c28c5994e430d9b0546adb15ffa2.json +0 -20
- package/backend/.sqlx/query-d3b9ea1de1576af71b312924ce7f4ea8ae5dbe2ac138ea3b4470f2d5cd734846.json +0 -12
- package/backend/.sqlx/query-ed8456646fa69ddd412441955f06ff22bfb790f29466450735e0b8bb1bc4ec94.json +0 -12
- package/backend/Cargo.toml +0 -71
- package/backend/build.rs +0 -32
- package/backend/migrations/20250617183714_init.sql +0 -44
- package/backend/migrations/20250620212427_execution_processes.sql +0 -25
- package/backend/migrations/20250620214100_remove_stdout_stderr_from_task_attempts.sql +0 -28
- package/backend/migrations/20250621120000_relate_activities_to_execution_processes.sql +0 -23
- package/backend/migrations/20250623120000_executor_sessions.sql +0 -17
- package/backend/migrations/20250623130000_add_executor_type_to_execution_processes.sql +0 -4
- package/backend/migrations/20250625000000_add_dev_script_to_projects.sql +0 -4
- package/backend/migrations/20250701000000_add_branch_to_task_attempts.sql +0 -2
- package/backend/migrations/20250701000001_add_pr_tracking_to_task_attempts.sql +0 -5
- package/backend/migrations/20250701120000_add_assistant_message_to_executor_sessions.sql +0 -2
- package/backend/migrations/20250708000000_add_base_branch_to_task_attempts.sql +0 -2
- package/backend/migrations/20250709000000_add_worktree_deleted_flag.sql +0 -2
- package/backend/migrations/20250710000000_add_setup_completion.sql +0 -3
- package/backend/migrations/20250715154859_add_task_templates.sql +0 -25
- package/backend/migrations/20250716143725_add_default_templates.sql +0 -174
- package/backend/migrations/20250716161432_update_executor_names_to_kebab_case.sql +0 -20
- package/backend/migrations/20250716170000_add_parent_task_to_tasks.sql +0 -7
- package/backend/migrations/20250717000000_drop_task_attempt_activities.sql +0 -9
- package/backend/migrations/20250719000000_add_cleanup_script_to_projects.sql +0 -2
- package/backend/migrations/20250720000000_add_cleanupscript_to_process_type_constraint.sql +0 -25
- package/backend/migrations/20250723000000_add_wish_to_tasks.sql +0 -7
- package/backend/migrations/20250724000000_remove_unique_wish_constraint.sql +0 -5
- package/backend/scripts/toast-notification.ps1 +0 -23
- package/backend/sounds/abstract-sound1.wav +0 -0
- package/backend/sounds/abstract-sound2.wav +0 -0
- package/backend/sounds/abstract-sound3.wav +0 -0
- package/backend/sounds/abstract-sound4.wav +0 -0
- package/backend/sounds/cow-mooing.wav +0 -0
- package/backend/sounds/phone-vibration.wav +0 -0
- package/backend/sounds/rooster.wav +0 -0
- package/backend/src/app_state.rs +0 -218
- package/backend/src/bin/generate_types.rs +0 -189
- package/backend/src/bin/mcp_task_server.rs +0 -191
- package/backend/src/execution_monitor.rs +0 -1193
- package/backend/src/executor.rs +0 -1053
- package/backend/src/executors/amp.rs +0 -697
- package/backend/src/executors/ccr.rs +0 -91
- package/backend/src/executors/charm_opencode.rs +0 -113
- package/backend/src/executors/claude.rs +0 -887
- package/backend/src/executors/cleanup_script.rs +0 -124
- package/backend/src/executors/dev_server.rs +0 -53
- package/backend/src/executors/echo.rs +0 -79
- package/backend/src/executors/gemini/config.rs +0 -67
- package/backend/src/executors/gemini/streaming.rs +0 -363
- package/backend/src/executors/gemini.rs +0 -765
- package/backend/src/executors/mod.rs +0 -23
- package/backend/src/executors/opencode_ai.rs +0 -113
- package/backend/src/executors/setup_script.rs +0 -130
- package/backend/src/executors/sst_opencode/filter.rs +0 -184
- package/backend/src/executors/sst_opencode/tools.rs +0 -139
- package/backend/src/executors/sst_opencode.rs +0 -756
- package/backend/src/lib.rs +0 -45
- package/backend/src/main.rs +0 -324
- package/backend/src/mcp/mod.rs +0 -1
- package/backend/src/mcp/task_server.rs +0 -850
- package/backend/src/middleware/mod.rs +0 -3
- package/backend/src/middleware/model_loaders.rs +0 -242
- package/backend/src/models/api_response.rs +0 -36
- package/backend/src/models/config.rs +0 -375
- package/backend/src/models/execution_process.rs +0 -430
- package/backend/src/models/executor_session.rs +0 -225
- package/backend/src/models/mod.rs +0 -12
- package/backend/src/models/project.rs +0 -356
- package/backend/src/models/task.rs +0 -345
- package/backend/src/models/task_attempt.rs +0 -1214
- package/backend/src/models/task_template.rs +0 -146
- package/backend/src/openapi.rs +0 -93
- package/backend/src/routes/auth.rs +0 -297
- package/backend/src/routes/config.rs +0 -385
- package/backend/src/routes/filesystem.rs +0 -228
- package/backend/src/routes/health.rs +0 -16
- package/backend/src/routes/mod.rs +0 -9
- package/backend/src/routes/projects.rs +0 -562
- package/backend/src/routes/stream.rs +0 -244
- package/backend/src/routes/task_attempts.rs +0 -1172
- package/backend/src/routes/task_templates.rs +0 -229
- package/backend/src/routes/tasks.rs +0 -353
- package/backend/src/services/analytics.rs +0 -216
- package/backend/src/services/git_service.rs +0 -1321
- package/backend/src/services/github_service.rs +0 -307
- package/backend/src/services/mod.rs +0 -13
- package/backend/src/services/notification_service.rs +0 -263
- package/backend/src/services/pr_monitor.rs +0 -214
- package/backend/src/services/process_service.rs +0 -940
- package/backend/src/utils/path.rs +0 -96
- package/backend/src/utils/shell.rs +0 -19
- package/backend/src/utils/text.rs +0 -24
- package/backend/src/utils/worktree_manager.rs +0 -578
- package/backend/src/utils.rs +0 -125
- package/backend/test.db +0 -0
- package/build-npm-package.sh +0 -61
- package/dev_assets_seed/config.json +0 -19
- package/frontend/.eslintrc.json +0 -25
- package/frontend/.prettierrc.json +0 -8
- package/frontend/components.json +0 -17
- package/frontend/index.html +0 -19
- package/frontend/package-lock.json +0 -7321
- package/frontend/package.json +0 -61
- package/frontend/postcss.config.js +0 -6
- package/frontend/public/android-chrome-192x192.png +0 -0
- package/frontend/public/android-chrome-512x512.png +0 -0
- package/frontend/public/apple-touch-icon.png +0 -0
- package/frontend/public/automagik-forge-logo-dark.svg +0 -3
- package/frontend/public/automagik-forge-logo.svg +0 -3
- package/frontend/public/automagik-forge-screenshot-overview.png +0 -0
- package/frontend/public/favicon-16x16.png +0 -0
- package/frontend/public/favicon-32x32.png +0 -0
- package/frontend/public/favicon.ico +0 -0
- package/frontend/public/site.webmanifest +0 -1
- package/frontend/public/viba-kanban-favicon.png +0 -0
- package/frontend/src/App.tsx +0 -157
- package/frontend/src/components/DisclaimerDialog.tsx +0 -106
- package/frontend/src/components/GitHubLoginDialog.tsx +0 -314
- package/frontend/src/components/OnboardingDialog.tsx +0 -185
- package/frontend/src/components/PrivacyOptInDialog.tsx +0 -130
- package/frontend/src/components/ProvidePatDialog.tsx +0 -98
- package/frontend/src/components/TaskTemplateManager.tsx +0 -336
- package/frontend/src/components/config-provider.tsx +0 -119
- package/frontend/src/components/context/TaskDetailsContextProvider.tsx +0 -470
- package/frontend/src/components/context/taskDetailsContext.ts +0 -125
- package/frontend/src/components/keyboard-shortcuts-demo.tsx +0 -35
- package/frontend/src/components/layout/navbar.tsx +0 -86
- package/frontend/src/components/logo.tsx +0 -44
- package/frontend/src/components/projects/ProjectCard.tsx +0 -155
- package/frontend/src/components/projects/project-detail.tsx +0 -251
- package/frontend/src/components/projects/project-form-fields.tsx +0 -238
- package/frontend/src/components/projects/project-form.tsx +0 -301
- package/frontend/src/components/projects/project-list.tsx +0 -200
- package/frontend/src/components/projects/projects-page.tsx +0 -20
- package/frontend/src/components/tasks/BranchSelector.tsx +0 -169
- package/frontend/src/components/tasks/DeleteFileConfirmationDialog.tsx +0 -94
- package/frontend/src/components/tasks/EditorSelectionDialog.tsx +0 -119
- package/frontend/src/components/tasks/TaskCard.tsx +0 -154
- package/frontend/src/components/tasks/TaskDetails/CollapsibleToolbar.tsx +0 -33
- package/frontend/src/components/tasks/TaskDetails/DiffCard.tsx +0 -109
- package/frontend/src/components/tasks/TaskDetails/DiffChunkSection.tsx +0 -135
- package/frontend/src/components/tasks/TaskDetails/DiffFile.tsx +0 -296
- package/frontend/src/components/tasks/TaskDetails/DiffTab.tsx +0 -32
- package/frontend/src/components/tasks/TaskDetails/DisplayConversationEntry.tsx +0 -392
- package/frontend/src/components/tasks/TaskDetails/LogsTab/Conversation.tsx +0 -256
- package/frontend/src/components/tasks/TaskDetails/LogsTab/ConversationEntry.tsx +0 -56
- package/frontend/src/components/tasks/TaskDetails/LogsTab/NormalizedConversationViewer.tsx +0 -92
- package/frontend/src/components/tasks/TaskDetails/LogsTab/Prompt.tsx +0 -22
- package/frontend/src/components/tasks/TaskDetails/LogsTab/SetupScriptRunning.tsx +0 -49
- package/frontend/src/components/tasks/TaskDetails/LogsTab.tsx +0 -186
- package/frontend/src/components/tasks/TaskDetails/ProcessesTab.tsx +0 -288
- package/frontend/src/components/tasks/TaskDetails/RelatedTasksTab.tsx +0 -216
- package/frontend/src/components/tasks/TaskDetails/TabNavigation.tsx +0 -93
- package/frontend/src/components/tasks/TaskDetailsHeader.tsx +0 -169
- package/frontend/src/components/tasks/TaskDetailsPanel.tsx +0 -126
- package/frontend/src/components/tasks/TaskDetailsToolbar.tsx +0 -302
- package/frontend/src/components/tasks/TaskFollowUpSection.tsx +0 -130
- package/frontend/src/components/tasks/TaskFormDialog.tsx +0 -400
- package/frontend/src/components/tasks/TaskKanbanBoard.tsx +0 -180
- package/frontend/src/components/tasks/Toolbar/CreateAttempt.tsx +0 -259
- package/frontend/src/components/tasks/Toolbar/CreatePRDialog.tsx +0 -243
- package/frontend/src/components/tasks/Toolbar/CurrentAttempt.tsx +0 -899
- package/frontend/src/components/tasks/index.ts +0 -2
- package/frontend/src/components/theme-provider.tsx +0 -82
- package/frontend/src/components/theme-toggle.tsx +0 -36
- package/frontend/src/components/ui/alert.tsx +0 -59
- package/frontend/src/components/ui/auto-expanding-textarea.tsx +0 -70
- package/frontend/src/components/ui/badge.tsx +0 -36
- package/frontend/src/components/ui/button.tsx +0 -56
- package/frontend/src/components/ui/card.tsx +0 -86
- package/frontend/src/components/ui/checkbox.tsx +0 -44
- package/frontend/src/components/ui/chip.tsx +0 -25
- package/frontend/src/components/ui/dialog.tsx +0 -124
- package/frontend/src/components/ui/dropdown-menu.tsx +0 -198
- package/frontend/src/components/ui/file-search-textarea.tsx +0 -292
- package/frontend/src/components/ui/folder-picker.tsx +0 -279
- package/frontend/src/components/ui/input.tsx +0 -25
- package/frontend/src/components/ui/label.tsx +0 -24
- package/frontend/src/components/ui/loader.tsx +0 -26
- package/frontend/src/components/ui/markdown-renderer.tsx +0 -75
- package/frontend/src/components/ui/select.tsx +0 -160
- package/frontend/src/components/ui/separator.tsx +0 -31
- package/frontend/src/components/ui/shadcn-io/kanban/index.tsx +0 -185
- package/frontend/src/components/ui/table.tsx +0 -117
- package/frontend/src/components/ui/tabs.tsx +0 -53
- package/frontend/src/components/ui/textarea.tsx +0 -22
- package/frontend/src/components/ui/tooltip.tsx +0 -28
- package/frontend/src/hooks/useNormalizedConversation.ts +0 -440
- package/frontend/src/index.css +0 -225
- package/frontend/src/lib/api.ts +0 -630
- package/frontend/src/lib/keyboard-shortcuts.ts +0 -266
- package/frontend/src/lib/responsive-config.ts +0 -70
- package/frontend/src/lib/types.ts +0 -39
- package/frontend/src/lib/utils.ts +0 -10
- package/frontend/src/main.tsx +0 -50
- package/frontend/src/pages/McpServers.tsx +0 -418
- package/frontend/src/pages/Settings.tsx +0 -610
- package/frontend/src/pages/project-tasks.tsx +0 -575
- package/frontend/src/pages/projects.tsx +0 -18
- package/frontend/src/vite-env.d.ts +0 -1
- package/frontend/tailwind.config.js +0 -125
- package/frontend/tsconfig.json +0 -26
- package/frontend/tsconfig.node.json +0 -10
- package/frontend/vite.config.ts +0 -33
- package/npx-cli/README.md +0 -159
- package/npx-cli/automagik-forge-0.1.0.tgz +0 -0
- package/npx-cli/automagik-forge-0.1.10.tgz +0 -0
- package/npx-cli/package.json +0 -17
- package/npx-cli/vibe-kanban-0.0.55.tgz +0 -0
- package/pnpm-workspace.yaml +0 -2
- package/rust-toolchain.toml +0 -11
- package/rustfmt.toml +0 -3
- package/scripts/load-env.js +0 -43
- package/scripts/mcp_test.js +0 -374
- package/scripts/prepare-db.js +0 -45
- package/scripts/setup-dev-environment.js +0 -274
- package/scripts/start-mcp-sse.js +0 -70
- package/scripts/test-debug.js +0 -32
- package/scripts/test-mcp-sse.js +0 -138
- package/scripts/test-simple.js +0 -44
- package/scripts/test-wish-final.js +0 -179
- package/scripts/test-wish-system.js +0 -221
- package/shared/types.ts +0 -182
- package/test-npm-package.sh +0 -42
- /package/{npx-cli/bin → bin}/cli.js +0 -0
@@ -1,418 +0,0 @@
|
|
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
|
-
}
|