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,279 +0,0 @@
|
|
1
|
-
import React, { useEffect, useMemo, useState } from 'react';
|
2
|
-
import { Button } from '@/components/ui/button';
|
3
|
-
import { Input } from '@/components/ui/input';
|
4
|
-
import {
|
5
|
-
Dialog,
|
6
|
-
DialogContent,
|
7
|
-
DialogDescription,
|
8
|
-
DialogFooter,
|
9
|
-
DialogHeader,
|
10
|
-
DialogTitle,
|
11
|
-
} from '@/components/ui/dialog';
|
12
|
-
import { Alert, AlertDescription } from '@/components/ui/alert';
|
13
|
-
import {
|
14
|
-
AlertCircle,
|
15
|
-
ChevronUp,
|
16
|
-
File,
|
17
|
-
Folder,
|
18
|
-
FolderOpen,
|
19
|
-
Home,
|
20
|
-
Search,
|
21
|
-
} from 'lucide-react';
|
22
|
-
import { fileSystemApi } from '@/lib/api';
|
23
|
-
import { DirectoryEntry } from 'shared/types';
|
24
|
-
|
25
|
-
interface FolderPickerProps {
|
26
|
-
open: boolean;
|
27
|
-
onClose: () => void;
|
28
|
-
onSelect: (path: string) => void;
|
29
|
-
value?: string;
|
30
|
-
title?: string;
|
31
|
-
description?: string;
|
32
|
-
}
|
33
|
-
|
34
|
-
export function FolderPicker({
|
35
|
-
open,
|
36
|
-
onClose,
|
37
|
-
onSelect,
|
38
|
-
value = '',
|
39
|
-
title = 'Select Folder',
|
40
|
-
description = 'Choose a folder for your project',
|
41
|
-
}: FolderPickerProps) {
|
42
|
-
const [currentPath, setCurrentPath] = useState<string>('');
|
43
|
-
const [entries, setEntries] = useState<DirectoryEntry[]>([]);
|
44
|
-
const [loading, setLoading] = useState(false);
|
45
|
-
const [error, setError] = useState('');
|
46
|
-
const [manualPath, setManualPath] = useState(value);
|
47
|
-
const [searchTerm, setSearchTerm] = useState('');
|
48
|
-
|
49
|
-
const filteredEntries = useMemo(() => {
|
50
|
-
if (!searchTerm.trim()) return entries;
|
51
|
-
return entries.filter((entry) =>
|
52
|
-
entry.name.toLowerCase().includes(searchTerm.toLowerCase())
|
53
|
-
);
|
54
|
-
}, [entries, searchTerm]);
|
55
|
-
|
56
|
-
useEffect(() => {
|
57
|
-
if (open) {
|
58
|
-
setManualPath(value);
|
59
|
-
loadDirectory();
|
60
|
-
}
|
61
|
-
}, [open, value]);
|
62
|
-
|
63
|
-
const loadDirectory = async (path?: string) => {
|
64
|
-
setLoading(true);
|
65
|
-
setError('');
|
66
|
-
|
67
|
-
try {
|
68
|
-
const result = await fileSystemApi.list(path);
|
69
|
-
|
70
|
-
// Ensure result exists and has the expected structure
|
71
|
-
if (!result || typeof result !== 'object') {
|
72
|
-
throw new Error('Invalid response from file system API');
|
73
|
-
}
|
74
|
-
// Safely access entries, ensuring it's an array
|
75
|
-
const entries = Array.isArray(result.entries) ? result.entries : [];
|
76
|
-
setEntries(entries);
|
77
|
-
const newPath = result.current_path || '';
|
78
|
-
setCurrentPath(newPath);
|
79
|
-
// Update manual path if we have a specific path (not for initial home directory load)
|
80
|
-
if (path) {
|
81
|
-
setManualPath(newPath);
|
82
|
-
}
|
83
|
-
} catch (err) {
|
84
|
-
setError(err instanceof Error ? err.message : 'Failed to load directory');
|
85
|
-
// Reset entries to empty array on error
|
86
|
-
setEntries([]);
|
87
|
-
} finally {
|
88
|
-
setLoading(false);
|
89
|
-
}
|
90
|
-
};
|
91
|
-
|
92
|
-
const handleFolderClick = (entry: DirectoryEntry) => {
|
93
|
-
if (entry.is_directory) {
|
94
|
-
loadDirectory(entry.path);
|
95
|
-
setManualPath(entry.path); // Auto-populate the manual path field
|
96
|
-
}
|
97
|
-
};
|
98
|
-
|
99
|
-
const handleParentDirectory = () => {
|
100
|
-
const parentPath = currentPath.split('/').slice(0, -1).join('/');
|
101
|
-
const newPath = parentPath || '/';
|
102
|
-
loadDirectory(newPath);
|
103
|
-
setManualPath(newPath);
|
104
|
-
};
|
105
|
-
|
106
|
-
const handleHomeDirectory = () => {
|
107
|
-
loadDirectory();
|
108
|
-
// Don't set manual path here since home directory path varies by system
|
109
|
-
};
|
110
|
-
|
111
|
-
const handleManualPathChange = (e: React.ChangeEvent<HTMLInputElement>) => {
|
112
|
-
setManualPath(e.target.value);
|
113
|
-
};
|
114
|
-
|
115
|
-
const handleManualPathSubmit = () => {
|
116
|
-
loadDirectory(manualPath);
|
117
|
-
};
|
118
|
-
|
119
|
-
const handleSelectCurrent = () => {
|
120
|
-
onSelect(manualPath || currentPath);
|
121
|
-
onClose();
|
122
|
-
};
|
123
|
-
|
124
|
-
const handleSelectManual = () => {
|
125
|
-
onSelect(manualPath);
|
126
|
-
onClose();
|
127
|
-
};
|
128
|
-
|
129
|
-
const handleClose = () => {
|
130
|
-
setError('');
|
131
|
-
onClose();
|
132
|
-
};
|
133
|
-
|
134
|
-
return (
|
135
|
-
<Dialog open={open} onOpenChange={handleClose}>
|
136
|
-
<DialogContent className="max-w-[600px] w-full h-[700px] flex flex-col overflow-hidden">
|
137
|
-
<DialogHeader>
|
138
|
-
<DialogTitle>{title}</DialogTitle>
|
139
|
-
<DialogDescription>{description}</DialogDescription>
|
140
|
-
</DialogHeader>
|
141
|
-
|
142
|
-
<div className="flex-1 flex flex-col space-y-4 overflow-hidden">
|
143
|
-
{/* Legend */}
|
144
|
-
<div className="text-xs text-muted-foreground border-b pb-2">
|
145
|
-
Click folder names to navigate • Use action buttons to select
|
146
|
-
</div>
|
147
|
-
|
148
|
-
{/* Manual path input */}
|
149
|
-
<div className="space-y-2">
|
150
|
-
<div className="text-sm font-medium">Enter path manually:</div>
|
151
|
-
<div className="flex space-x-2 min-w-0">
|
152
|
-
<Input
|
153
|
-
value={manualPath}
|
154
|
-
onChange={handleManualPathChange}
|
155
|
-
placeholder="/path/to/your/project"
|
156
|
-
className="flex-1 min-w-0"
|
157
|
-
/>
|
158
|
-
<Button
|
159
|
-
onClick={handleManualPathSubmit}
|
160
|
-
variant="outline"
|
161
|
-
size="sm"
|
162
|
-
className="flex-shrink-0"
|
163
|
-
>
|
164
|
-
Go
|
165
|
-
</Button>
|
166
|
-
</div>
|
167
|
-
</div>
|
168
|
-
|
169
|
-
{/* Search input */}
|
170
|
-
<div className="space-y-2">
|
171
|
-
<div className="text-sm font-medium">Search current directory:</div>
|
172
|
-
<div className="relative">
|
173
|
-
<Search className="absolute left-3 top-1/2 transform -translate-y-1/2 h-4 w-4 text-muted-foreground" />
|
174
|
-
<Input
|
175
|
-
value={searchTerm}
|
176
|
-
onChange={(e) => setSearchTerm(e.target.value)}
|
177
|
-
placeholder="Filter folders and files..."
|
178
|
-
className="pl-10"
|
179
|
-
/>
|
180
|
-
</div>
|
181
|
-
</div>
|
182
|
-
|
183
|
-
{/* Navigation */}
|
184
|
-
<div className="flex items-center space-x-2 min-w-0">
|
185
|
-
<Button
|
186
|
-
onClick={handleHomeDirectory}
|
187
|
-
variant="outline"
|
188
|
-
size="sm"
|
189
|
-
className="flex-shrink-0"
|
190
|
-
>
|
191
|
-
<Home className="h-4 w-4" />
|
192
|
-
</Button>
|
193
|
-
<Button
|
194
|
-
onClick={handleParentDirectory}
|
195
|
-
variant="outline"
|
196
|
-
size="sm"
|
197
|
-
disabled={!currentPath || currentPath === '/'}
|
198
|
-
className="flex-shrink-0"
|
199
|
-
>
|
200
|
-
<ChevronUp className="h-4 w-4" />
|
201
|
-
</Button>
|
202
|
-
<div className="text-sm text-muted-foreground flex-1 truncate min-w-0">
|
203
|
-
{currentPath || 'Home'}
|
204
|
-
</div>
|
205
|
-
<Button
|
206
|
-
onClick={handleSelectCurrent}
|
207
|
-
variant="outline"
|
208
|
-
size="sm"
|
209
|
-
disabled={!currentPath}
|
210
|
-
className="flex-shrink-0"
|
211
|
-
>
|
212
|
-
Select Current
|
213
|
-
</Button>
|
214
|
-
</div>
|
215
|
-
|
216
|
-
{/* Directory listing */}
|
217
|
-
<div className="flex-1 border rounded-md overflow-auto">
|
218
|
-
{loading ? (
|
219
|
-
<div className="p-4 text-center text-muted-foreground">
|
220
|
-
Loading...
|
221
|
-
</div>
|
222
|
-
) : error ? (
|
223
|
-
<Alert variant="destructive" className="m-4">
|
224
|
-
<AlertCircle className="h-4 w-4" />
|
225
|
-
<AlertDescription>{error}</AlertDescription>
|
226
|
-
</Alert>
|
227
|
-
) : filteredEntries.length === 0 ? (
|
228
|
-
<div className="p-4 text-center text-muted-foreground">
|
229
|
-
{searchTerm.trim() ? 'No matches found' : 'No folders found'}
|
230
|
-
</div>
|
231
|
-
) : (
|
232
|
-
<div className="p-2">
|
233
|
-
{filteredEntries.map((entry, index) => (
|
234
|
-
<div
|
235
|
-
key={index}
|
236
|
-
className={`flex items-center space-x-2 p-2 rounded cursor-pointer hover:bg-accent ${
|
237
|
-
!entry.is_directory ? 'opacity-50 cursor-not-allowed' : ''
|
238
|
-
}`}
|
239
|
-
onClick={() =>
|
240
|
-
entry.is_directory && handleFolderClick(entry)
|
241
|
-
}
|
242
|
-
title={entry.name} // Show full name on hover
|
243
|
-
>
|
244
|
-
{entry.is_directory ? (
|
245
|
-
entry.is_git_repo ? (
|
246
|
-
<FolderOpen className="h-4 w-4 text-green-600 flex-shrink-0" />
|
247
|
-
) : (
|
248
|
-
<Folder className="h-4 w-4 text-blue-600 flex-shrink-0" />
|
249
|
-
)
|
250
|
-
) : (
|
251
|
-
<File className="h-4 w-4 text-gray-400 flex-shrink-0" />
|
252
|
-
)}
|
253
|
-
<span className="text-sm flex-1 truncate min-w-0">
|
254
|
-
{entry.name}
|
255
|
-
</span>
|
256
|
-
{entry.is_git_repo && (
|
257
|
-
<span className="text-xs text-green-600 bg-green-100 px-2 py-1 rounded flex-shrink-0">
|
258
|
-
git repo
|
259
|
-
</span>
|
260
|
-
)}
|
261
|
-
</div>
|
262
|
-
))}
|
263
|
-
</div>
|
264
|
-
)}
|
265
|
-
</div>
|
266
|
-
</div>
|
267
|
-
|
268
|
-
<DialogFooter>
|
269
|
-
<Button type="button" variant="outline" onClick={handleClose}>
|
270
|
-
Cancel
|
271
|
-
</Button>
|
272
|
-
<Button onClick={handleSelectManual} disabled={!manualPath.trim()}>
|
273
|
-
Select Path
|
274
|
-
</Button>
|
275
|
-
</DialogFooter>
|
276
|
-
</DialogContent>
|
277
|
-
</Dialog>
|
278
|
-
);
|
279
|
-
}
|
@@ -1,25 +0,0 @@
|
|
1
|
-
import * as React from 'react';
|
2
|
-
|
3
|
-
import { cn } from '@/lib/utils';
|
4
|
-
|
5
|
-
export interface InputProps
|
6
|
-
extends React.InputHTMLAttributes<HTMLInputElement> {}
|
7
|
-
|
8
|
-
const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
9
|
-
({ className, type, ...props }, ref) => {
|
10
|
-
return (
|
11
|
-
<input
|
12
|
-
type={type}
|
13
|
-
className={cn(
|
14
|
-
'flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50',
|
15
|
-
className
|
16
|
-
)}
|
17
|
-
ref={ref}
|
18
|
-
{...props}
|
19
|
-
/>
|
20
|
-
);
|
21
|
-
}
|
22
|
-
);
|
23
|
-
Input.displayName = 'Input';
|
24
|
-
|
25
|
-
export { Input };
|
@@ -1,24 +0,0 @@
|
|
1
|
-
import * as React from 'react';
|
2
|
-
import * as LabelPrimitive from '@radix-ui/react-label';
|
3
|
-
import { cva, type VariantProps } from 'class-variance-authority';
|
4
|
-
|
5
|
-
import { cn } from '@/lib/utils';
|
6
|
-
|
7
|
-
const labelVariants = cva(
|
8
|
-
'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70'
|
9
|
-
);
|
10
|
-
|
11
|
-
const Label = React.forwardRef<
|
12
|
-
React.ElementRef<typeof LabelPrimitive.Root>,
|
13
|
-
React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &
|
14
|
-
VariantProps<typeof labelVariants>
|
15
|
-
>(({ className, ...props }, ref) => (
|
16
|
-
<LabelPrimitive.Root
|
17
|
-
ref={ref}
|
18
|
-
className={cn(labelVariants(), className)}
|
19
|
-
{...props}
|
20
|
-
/>
|
21
|
-
));
|
22
|
-
Label.displayName = LabelPrimitive.Root.displayName;
|
23
|
-
|
24
|
-
export { Label };
|
@@ -1,26 +0,0 @@
|
|
1
|
-
import { Loader2 } from 'lucide-react';
|
2
|
-
import React from 'react';
|
3
|
-
|
4
|
-
interface LoaderProps {
|
5
|
-
message?: string | React.ReactElement;
|
6
|
-
size?: number;
|
7
|
-
className?: string;
|
8
|
-
}
|
9
|
-
|
10
|
-
export const Loader: React.FC<LoaderProps> = ({
|
11
|
-
message,
|
12
|
-
size = 32,
|
13
|
-
className = '',
|
14
|
-
}) => (
|
15
|
-
<div
|
16
|
-
className={`flex flex-col items-center justify-center gap-2 ${className}`}
|
17
|
-
>
|
18
|
-
<Loader2
|
19
|
-
className="animate-spin text-muted-foreground"
|
20
|
-
style={{ width: size, height: size }}
|
21
|
-
/>
|
22
|
-
{!!message && (
|
23
|
-
<div className="text-center text-muted-foreground">{message}</div>
|
24
|
-
)}
|
25
|
-
</div>
|
26
|
-
);
|
@@ -1,75 +0,0 @@
|
|
1
|
-
import ReactMarkdown, { Components } from 'react-markdown';
|
2
|
-
import { memo, useMemo } from 'react';
|
3
|
-
|
4
|
-
interface MarkdownRendererProps {
|
5
|
-
content: string;
|
6
|
-
className?: string;
|
7
|
-
}
|
8
|
-
|
9
|
-
function MarkdownRenderer({ content, className = '' }: MarkdownRendererProps) {
|
10
|
-
const components: Components = useMemo(
|
11
|
-
() => ({
|
12
|
-
code: ({ children, ...props }) => (
|
13
|
-
<code
|
14
|
-
{...props}
|
15
|
-
className="bg-gray-100 dark:bg-gray-800 px-1 py-0.5 rounded text-sm font-mono"
|
16
|
-
>
|
17
|
-
{children}
|
18
|
-
</code>
|
19
|
-
),
|
20
|
-
strong: ({ children, ...props }) => (
|
21
|
-
<strong {...props} className="font-bold">
|
22
|
-
{children}
|
23
|
-
</strong>
|
24
|
-
),
|
25
|
-
em: ({ children, ...props }) => (
|
26
|
-
<em {...props} className="italic">
|
27
|
-
{children}
|
28
|
-
</em>
|
29
|
-
),
|
30
|
-
p: ({ children, ...props }) => (
|
31
|
-
<p {...props} className="leading-tight">
|
32
|
-
{children}
|
33
|
-
</p>
|
34
|
-
),
|
35
|
-
h1: ({ children, ...props }) => (
|
36
|
-
<h1 {...props} className="text-lg font-bold leading-tight">
|
37
|
-
{children}
|
38
|
-
</h1>
|
39
|
-
),
|
40
|
-
h2: ({ children, ...props }) => (
|
41
|
-
<h2 {...props} className="text-base font-bold leading-tight">
|
42
|
-
{children}
|
43
|
-
</h2>
|
44
|
-
),
|
45
|
-
h3: ({ children, ...props }) => (
|
46
|
-
<h3 {...props} className="text-sm font-bold leading-tight">
|
47
|
-
{children}
|
48
|
-
</h3>
|
49
|
-
),
|
50
|
-
ul: ({ children, ...props }) => (
|
51
|
-
<ul {...props} className="list-disc ml-2">
|
52
|
-
{children}
|
53
|
-
</ul>
|
54
|
-
),
|
55
|
-
ol: ({ children, ...props }) => (
|
56
|
-
<ol {...props} className="list-decimal ml-2">
|
57
|
-
{children}
|
58
|
-
</ol>
|
59
|
-
),
|
60
|
-
li: ({ children, ...props }) => (
|
61
|
-
<li {...props} className="leading-tight">
|
62
|
-
{children}
|
63
|
-
</li>
|
64
|
-
),
|
65
|
-
}),
|
66
|
-
[]
|
67
|
-
);
|
68
|
-
return (
|
69
|
-
<div className={className}>
|
70
|
-
<ReactMarkdown components={components}>{content}</ReactMarkdown>
|
71
|
-
</div>
|
72
|
-
);
|
73
|
-
}
|
74
|
-
|
75
|
-
export default memo(MarkdownRenderer);
|
@@ -1,160 +0,0 @@
|
|
1
|
-
'use client';
|
2
|
-
|
3
|
-
import * as React from 'react';
|
4
|
-
import * as SelectPrimitive from '@radix-ui/react-select';
|
5
|
-
import { Check, ChevronDown, ChevronUp } from 'lucide-react';
|
6
|
-
|
7
|
-
import { cn } from '@/lib/utils';
|
8
|
-
|
9
|
-
const Select = SelectPrimitive.Root;
|
10
|
-
|
11
|
-
const SelectGroup = SelectPrimitive.Group;
|
12
|
-
|
13
|
-
const SelectValue = SelectPrimitive.Value;
|
14
|
-
|
15
|
-
const SelectTrigger = React.forwardRef<
|
16
|
-
React.ElementRef<typeof SelectPrimitive.Trigger>,
|
17
|
-
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>
|
18
|
-
>(({ className, children, ...props }, ref) => (
|
19
|
-
<SelectPrimitive.Trigger
|
20
|
-
ref={ref}
|
21
|
-
className={cn(
|
22
|
-
'flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1',
|
23
|
-
className
|
24
|
-
)}
|
25
|
-
{...props}
|
26
|
-
>
|
27
|
-
{children}
|
28
|
-
<SelectPrimitive.Icon asChild>
|
29
|
-
<ChevronDown className="h-4 w-4 opacity-50" />
|
30
|
-
</SelectPrimitive.Icon>
|
31
|
-
</SelectPrimitive.Trigger>
|
32
|
-
));
|
33
|
-
SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
|
34
|
-
|
35
|
-
const SelectScrollUpButton = React.forwardRef<
|
36
|
-
React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,
|
37
|
-
React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>
|
38
|
-
>(({ className, ...props }, ref) => (
|
39
|
-
<SelectPrimitive.ScrollUpButton
|
40
|
-
ref={ref}
|
41
|
-
className={cn(
|
42
|
-
'flex cursor-default items-center justify-center py-1',
|
43
|
-
className
|
44
|
-
)}
|
45
|
-
{...props}
|
46
|
-
>
|
47
|
-
<ChevronUp className="h-4 w-4" />
|
48
|
-
</SelectPrimitive.ScrollUpButton>
|
49
|
-
));
|
50
|
-
SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
|
51
|
-
|
52
|
-
const SelectScrollDownButton = React.forwardRef<
|
53
|
-
React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,
|
54
|
-
React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>
|
55
|
-
>(({ className, ...props }, ref) => (
|
56
|
-
<SelectPrimitive.ScrollDownButton
|
57
|
-
ref={ref}
|
58
|
-
className={cn(
|
59
|
-
'flex cursor-default items-center justify-center py-1',
|
60
|
-
className
|
61
|
-
)}
|
62
|
-
{...props}
|
63
|
-
>
|
64
|
-
<ChevronDown className="h-4 w-4" />
|
65
|
-
</SelectPrimitive.ScrollDownButton>
|
66
|
-
));
|
67
|
-
SelectScrollDownButton.displayName =
|
68
|
-
SelectPrimitive.ScrollDownButton.displayName;
|
69
|
-
|
70
|
-
const SelectContent = React.forwardRef<
|
71
|
-
React.ElementRef<typeof SelectPrimitive.Content>,
|
72
|
-
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>
|
73
|
-
>(({ className, children, position = 'popper', ...props }, ref) => (
|
74
|
-
<SelectPrimitive.Portal>
|
75
|
-
<SelectPrimitive.Content
|
76
|
-
ref={ref}
|
77
|
-
className={cn(
|
78
|
-
'relative z-[10000] max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]',
|
79
|
-
position === 'popper' &&
|
80
|
-
'data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1',
|
81
|
-
className
|
82
|
-
)}
|
83
|
-
position={position}
|
84
|
-
{...props}
|
85
|
-
>
|
86
|
-
<SelectScrollUpButton />
|
87
|
-
<SelectPrimitive.Viewport
|
88
|
-
className={cn(
|
89
|
-
'p-1',
|
90
|
-
position === 'popper' &&
|
91
|
-
'h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]'
|
92
|
-
)}
|
93
|
-
>
|
94
|
-
{children}
|
95
|
-
</SelectPrimitive.Viewport>
|
96
|
-
<SelectScrollDownButton />
|
97
|
-
</SelectPrimitive.Content>
|
98
|
-
</SelectPrimitive.Portal>
|
99
|
-
));
|
100
|
-
SelectContent.displayName = SelectPrimitive.Content.displayName;
|
101
|
-
|
102
|
-
const SelectLabel = React.forwardRef<
|
103
|
-
React.ElementRef<typeof SelectPrimitive.Label>,
|
104
|
-
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>
|
105
|
-
>(({ className, ...props }, ref) => (
|
106
|
-
<SelectPrimitive.Label
|
107
|
-
ref={ref}
|
108
|
-
className={cn('py-1.5 pl-8 pr-2 text-sm font-semibold', className)}
|
109
|
-
{...props}
|
110
|
-
/>
|
111
|
-
));
|
112
|
-
SelectLabel.displayName = SelectPrimitive.Label.displayName;
|
113
|
-
|
114
|
-
const SelectItem = React.forwardRef<
|
115
|
-
React.ElementRef<typeof SelectPrimitive.Item>,
|
116
|
-
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>
|
117
|
-
>(({ className, children, ...props }, ref) => (
|
118
|
-
<SelectPrimitive.Item
|
119
|
-
ref={ref}
|
120
|
-
className={cn(
|
121
|
-
'relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50',
|
122
|
-
className
|
123
|
-
)}
|
124
|
-
{...props}
|
125
|
-
>
|
126
|
-
<span className="absolute left-2 flex h-3.5 w-3.5 items-center justify-center">
|
127
|
-
<SelectPrimitive.ItemIndicator>
|
128
|
-
<Check className="h-4 w-4" />
|
129
|
-
</SelectPrimitive.ItemIndicator>
|
130
|
-
</span>
|
131
|
-
|
132
|
-
<SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>
|
133
|
-
</SelectPrimitive.Item>
|
134
|
-
));
|
135
|
-
SelectItem.displayName = SelectPrimitive.Item.displayName;
|
136
|
-
|
137
|
-
const SelectSeparator = React.forwardRef<
|
138
|
-
React.ElementRef<typeof SelectPrimitive.Separator>,
|
139
|
-
React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>
|
140
|
-
>(({ className, ...props }, ref) => (
|
141
|
-
<SelectPrimitive.Separator
|
142
|
-
ref={ref}
|
143
|
-
className={cn('-mx-1 my-1 h-px bg-muted', className)}
|
144
|
-
{...props}
|
145
|
-
/>
|
146
|
-
));
|
147
|
-
SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
|
148
|
-
|
149
|
-
export {
|
150
|
-
Select,
|
151
|
-
SelectGroup,
|
152
|
-
SelectValue,
|
153
|
-
SelectTrigger,
|
154
|
-
SelectContent,
|
155
|
-
SelectLabel,
|
156
|
-
SelectItem,
|
157
|
-
SelectSeparator,
|
158
|
-
SelectScrollUpButton,
|
159
|
-
SelectScrollDownButton,
|
160
|
-
};
|
@@ -1,31 +0,0 @@
|
|
1
|
-
'use client';
|
2
|
-
|
3
|
-
import * as React from 'react';
|
4
|
-
import * as SeparatorPrimitive from '@radix-ui/react-separator';
|
5
|
-
|
6
|
-
import { cn } from '@/lib/utils';
|
7
|
-
|
8
|
-
const Separator = React.forwardRef<
|
9
|
-
React.ElementRef<typeof SeparatorPrimitive.Root>,
|
10
|
-
React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>
|
11
|
-
>(
|
12
|
-
(
|
13
|
-
{ className, orientation = 'horizontal', decorative = true, ...props },
|
14
|
-
ref
|
15
|
-
) => (
|
16
|
-
<SeparatorPrimitive.Root
|
17
|
-
ref={ref}
|
18
|
-
decorative={decorative}
|
19
|
-
orientation={orientation}
|
20
|
-
className={cn(
|
21
|
-
'shrink-0 bg-border',
|
22
|
-
orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',
|
23
|
-
className
|
24
|
-
)}
|
25
|
-
{...props}
|
26
|
-
/>
|
27
|
-
)
|
28
|
-
);
|
29
|
-
Separator.displayName = SeparatorPrimitive.Root.displayName;
|
30
|
-
|
31
|
-
export { Separator };
|