@within-7/minto 0.1.7 → 0.3.0
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/cli.js +155 -37
- package/dist/Tool.js +38 -0
- package/dist/Tool.js.map +3 -3
- package/dist/commands/agents/AgentsCommand.js +73 -49
- package/dist/commands/agents/AgentsCommand.js.map +2 -2
- package/dist/commands/agents/constants.js +1 -1
- package/dist/commands/agents/constants.js.map +1 -1
- package/dist/commands/agents/index.js +1 -1
- package/dist/commands/bug.js +74 -7
- package/dist/commands/bug.js.map +3 -3
- package/dist/commands/clear.js +3 -0
- package/dist/commands/clear.js.map +2 -2
- package/dist/commands/compact.js +37 -0
- package/dist/commands/compact.js.map +2 -2
- package/dist/commands/context.js +85 -0
- package/dist/commands/context.js.map +7 -0
- package/dist/commands/ctx_viz.js +18 -10
- package/dist/commands/ctx_viz.js.map +2 -2
- package/dist/commands/doctor.js +158 -12
- package/dist/commands/doctor.js.map +2 -2
- package/dist/commands/export.js +157 -0
- package/dist/commands/export.js.map +7 -0
- package/dist/commands/mcp-interactive.js +28 -18
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +9 -7
- package/dist/commands/model.js.map +2 -2
- package/dist/commands/permissions.js +87 -0
- package/dist/commands/permissions.js.map +7 -0
- package/dist/commands/plugin/AddMarketplaceForm.js +3 -2
- package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
- package/dist/commands/plugin/ConfirmDialog.js +2 -1
- package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
- package/dist/commands/plugin/ErrorView.js +2 -1
- package/dist/commands/plugin/ErrorView.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +5 -4
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsManager.js +5 -4
- package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
- package/dist/commands/plugin/MainMenu.js +2 -1
- package/dist/commands/plugin/MainMenu.js.map +2 -2
- package/dist/commands/plugin/MarketplaceManager.js +5 -4
- package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
- package/dist/commands/plugin/MarketplaceSelector.js +4 -3
- package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
- package/dist/commands/plugin/PlaceholderScreen.js +3 -2
- package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
- package/dist/commands/plugin/PluginBrowser.js +6 -5
- package/dist/commands/plugin/PluginBrowser.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsInstall.js +5 -4
- package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsManage.js +4 -3
- package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
- package/dist/commands/plugin.js +16 -15
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/quit.js +3 -1
- package/dist/commands/quit.js.map +2 -2
- package/dist/commands/sandbox.js +105 -0
- package/dist/commands/sandbox.js.map +7 -0
- package/dist/commands/setup.js +2 -1
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/status.js +59 -0
- package/dist/commands/status.js.map +7 -0
- package/dist/commands/tasks.js +108 -0
- package/dist/commands/tasks.js.map +7 -0
- package/dist/commands/todos.js +123 -0
- package/dist/commands/todos.js.map +7 -0
- package/dist/commands/undo.js +245 -0
- package/dist/commands/undo.js.map +7 -0
- package/dist/commands.js +22 -2
- package/dist/commands.js.map +2 -2
- package/dist/components/AgentThinkingBlock.js +10 -18
- package/dist/components/AgentThinkingBlock.js.map +2 -2
- package/dist/components/AsciiLogo.js +7 -8
- package/dist/components/AsciiLogo.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js +3 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/QuestionView.js +2 -1
- package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
- package/dist/components/BackgroundTasksPanel.js +78 -29
- package/dist/components/BackgroundTasksPanel.js.map +2 -2
- package/dist/components/BashStreamingProgress.js +24 -0
- package/dist/components/BashStreamingProgress.js.map +7 -0
- package/dist/components/CollapsibleHint.js +15 -0
- package/dist/components/CollapsibleHint.js.map +7 -0
- package/dist/components/Config.js +3 -2
- package/dist/components/Config.js.map +2 -2
- package/dist/components/ConsoleOAuthFlow.js +2 -1
- package/dist/components/ConsoleOAuthFlow.js.map +2 -2
- package/dist/components/Cost.js +2 -1
- package/dist/components/Cost.js.map +2 -2
- package/dist/components/FileEditToolUpdatedMessage.js +1 -1
- package/dist/components/FileEditToolUpdatedMessage.js.map +2 -2
- package/dist/components/HeaderBar.js +13 -8
- package/dist/components/HeaderBar.js.map +2 -2
- package/dist/components/HistorySearchOverlay.js +4 -3
- package/dist/components/HistorySearchOverlay.js.map +2 -2
- package/dist/components/HotkeyHelpPanel.js +134 -0
- package/dist/components/HotkeyHelpPanel.js.map +7 -0
- package/dist/components/InvalidConfigDialog.js +2 -1
- package/dist/components/InvalidConfigDialog.js.map +2 -2
- package/dist/components/Logo.js +24 -68
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/MCPServerApprovalDialog.js +2 -1
- package/dist/components/MCPServerApprovalDialog.js.map +2 -2
- package/dist/components/MCPServerDialogCopy.js +2 -1
- package/dist/components/MCPServerDialogCopy.js.map +2 -2
- package/dist/components/MCPServerMultiselectDialog.js +2 -1
- package/dist/components/MCPServerMultiselectDialog.js.map +2 -2
- package/dist/components/Message.js +23 -7
- package/dist/components/Message.js.map +3 -3
- package/dist/components/MessageSelector.js +4 -3
- package/dist/components/MessageSelector.js.map +2 -2
- package/dist/components/ModeIndicator.js +2 -1
- package/dist/components/ModeIndicator.js.map +2 -2
- package/dist/components/ModelConfig.js +20 -6
- package/dist/components/ModelConfig.js.map +2 -2
- package/dist/components/ModelListManager.js +7 -6
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +27 -14
- package/dist/components/ModelSelector/ModelSelector.js.map +2 -2
- package/dist/components/Onboarding.js +22 -16
- package/dist/components/Onboarding.js.map +2 -2
- package/dist/components/OperationSummary.js +130 -0
- package/dist/components/OperationSummary.js.map +7 -0
- package/dist/components/ProgressBar.js +74 -0
- package/dist/components/ProgressBar.js.map +7 -0
- package/dist/components/PromptInput.js +210 -87
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/RequestStatusIndicator.js +194 -0
- package/dist/components/RequestStatusIndicator.js.map +7 -0
- package/dist/components/SensitiveFileWarning.js +31 -0
- package/dist/components/SensitiveFileWarning.js.map +7 -0
- package/dist/components/Spinner.js +141 -27
- package/dist/components/Spinner.js.map +2 -2
- package/dist/components/SpinnerSymbol.js +21 -27
- package/dist/components/SpinnerSymbol.js.map +2 -2
- package/dist/components/StreamingBashOutput.js +9 -8
- package/dist/components/StreamingBashOutput.js.map +2 -2
- package/dist/components/StructuredDiff.js +6 -8
- package/dist/components/StructuredDiff.js.map +2 -2
- package/dist/components/SubagentBlock.js +5 -3
- package/dist/components/SubagentBlock.js.map +2 -2
- package/dist/components/SubagentProgress.js +17 -15
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js +30 -24
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TextInput.js +9 -1
- package/dist/components/TextInput.js.map +2 -2
- package/dist/components/TodoChangeBlock.js +1 -1
- package/dist/components/TodoChangeBlock.js.map +2 -2
- package/dist/components/TodoPanel.js +140 -31
- package/dist/components/TodoPanel.js.map +3 -3
- package/dist/components/TokenCounter.js +74 -0
- package/dist/components/TokenCounter.js.map +7 -0
- package/dist/components/TokenWarning.js +2 -1
- package/dist/components/TokenWarning.js.map +2 -2
- package/dist/components/ToolUseLoader.js +2 -2
- package/dist/components/ToolUseLoader.js.map +2 -2
- package/dist/components/TreeConnector.js +26 -0
- package/dist/components/TreeConnector.js.map +7 -0
- package/dist/components/TrustDialog.js +2 -1
- package/dist/components/TrustDialog.js.map +2 -2
- package/dist/components/TurnCompletionIndicator.js +18 -0
- package/dist/components/TurnCompletionIndicator.js.map +7 -0
- package/dist/components/binary-feedback/BinaryFeedbackView.js +2 -1
- package/dist/components/binary-feedback/BinaryFeedbackView.js.map +2 -2
- package/dist/components/messages/AssistantTextMessage.js +20 -9
- package/dist/components/messages/AssistantTextMessage.js.map +2 -2
- package/dist/components/messages/AssistantThinkingMessage.js +18 -3
- package/dist/components/messages/AssistantThinkingMessage.js.map +2 -2
- package/dist/components/messages/AssistantToolUseMessage.js +17 -10
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/GroupRenderer.js +54 -0
- package/dist/components/messages/GroupRenderer.js.map +7 -0
- package/dist/components/messages/NestedTasksPreview.js +24 -0
- package/dist/components/messages/NestedTasksPreview.js.map +7 -0
- package/dist/components/messages/ParallelTasksGroupView.js +93 -0
- package/dist/components/messages/ParallelTasksGroupView.js.map +7 -0
- package/dist/components/messages/TaskInModuleView.js +218 -0
- package/dist/components/messages/TaskInModuleView.js.map +7 -0
- package/dist/components/messages/TaskOutputContent.js +56 -0
- package/dist/components/messages/TaskOutputContent.js.map +7 -0
- package/dist/components/messages/UserPromptMessage.js +2 -2
- package/dist/components/messages/UserPromptMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js +2 -3
- package/dist/components/messages/UserToolResultMessage/UserToolSuccessMessage.js.map +2 -2
- package/dist/components/permissions/FallbackPermissionRequest.js +4 -4
- package/dist/components/permissions/FallbackPermissionRequest.js.map +2 -2
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js +4 -4
- package/dist/components/permissions/FilesystemPermissionRequest/FilesystemPermissionRequest.js.map +2 -2
- package/dist/constants/colors.js +120 -54
- package/dist/constants/colors.js.map +2 -2
- package/dist/constants/formatRules.js +102 -0
- package/dist/constants/formatRules.js.map +7 -0
- package/dist/constants/prompts.js +12 -34
- package/dist/constants/prompts.js.map +2 -2
- package/dist/constants/symbols.js +64 -6
- package/dist/constants/symbols.js.map +2 -2
- package/dist/constants/timing.js +5 -0
- package/dist/constants/timing.js.map +2 -2
- package/dist/constants/toolInputExamples.js +84 -0
- package/dist/constants/toolInputExamples.js.map +7 -0
- package/dist/core/backupManager.js +321 -0
- package/dist/core/backupManager.js.map +7 -0
- package/dist/core/config/defaults.js +84 -0
- package/dist/core/config/defaults.js.map +7 -0
- package/dist/core/config/index.js +111 -0
- package/dist/core/config/index.js.map +7 -0
- package/dist/core/config/loader.js +221 -0
- package/dist/core/config/loader.js.map +7 -0
- package/dist/core/config/migrations.js +128 -0
- package/dist/core/config/migrations.js.map +7 -0
- package/dist/core/config/schema.js +178 -0
- package/dist/core/config/schema.js.map +7 -0
- package/dist/core/costTracker.js +129 -0
- package/dist/core/costTracker.js.map +7 -0
- package/dist/core/gitAutoCommit.js +287 -0
- package/dist/core/gitAutoCommit.js.map +7 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +7 -0
- package/dist/core/operationTracker.js +212 -0
- package/dist/core/operationTracker.js.map +7 -0
- package/dist/core/permissions/auditLog.js +204 -0
- package/dist/core/permissions/auditLog.js.map +7 -0
- package/dist/core/permissions/engine/index.js +3 -0
- package/dist/core/permissions/engine/index.js.map +7 -0
- package/dist/core/permissions/engine/permissionEngine.js +106 -0
- package/dist/core/permissions/engine/permissionEngine.js.map +7 -0
- package/dist/core/permissions/engine/types.js +1 -0
- package/dist/core/permissions/engine/types.js.map +7 -0
- package/dist/core/permissions/index.js +84 -0
- package/dist/core/permissions/index.js.map +7 -0
- package/dist/core/permissions/ruleEngine.js +259 -0
- package/dist/core/permissions/ruleEngine.js.map +7 -0
- package/dist/core/permissions/rules/allowedToolsRule.js +62 -0
- package/dist/core/permissions/rules/allowedToolsRule.js.map +7 -0
- package/dist/core/permissions/rules/autoEscalationRule.js +296 -0
- package/dist/core/permissions/rules/autoEscalationRule.js.map +7 -0
- package/dist/core/permissions/rules/index.js +46 -0
- package/dist/core/permissions/rules/index.js.map +7 -0
- package/dist/core/permissions/rules/planModeRule.js +55 -0
- package/dist/core/permissions/rules/planModeRule.js.map +7 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js +173 -0
- package/dist/core/permissions/rules/projectBoundaryRule.js.map +7 -0
- package/dist/core/permissions/rules/safeModeRule.js +65 -0
- package/dist/core/permissions/rules/safeModeRule.js.map +7 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js +345 -0
- package/dist/core/permissions/rules/sensitivePathsRule.js.map +7 -0
- package/dist/core/permissions/types.js +127 -0
- package/dist/core/permissions/types.js.map +7 -0
- package/dist/core/tokenStats.js +9 -0
- package/dist/core/tokenStats.js.map +7 -0
- package/dist/core/tokenStatsManager.js +331 -0
- package/dist/core/tokenStatsManager.js.map +7 -0
- package/dist/core/tools/executor.js +143 -0
- package/dist/core/tools/executor.js.map +7 -0
- package/dist/core/tools/index.js +15 -0
- package/dist/core/tools/index.js.map +7 -0
- package/dist/core/tools/registry.js +183 -0
- package/dist/core/tools/registry.js.map +7 -0
- package/dist/core/tools/types.js +1 -0
- package/dist/core/tools/types.js.map +7 -0
- package/dist/cost-tracker.js +23 -15
- package/dist/cost-tracker.js.map +2 -2
- package/dist/entrypoints/cli.js +158 -130
- package/dist/entrypoints/cli.js.map +2 -2
- package/dist/entrypoints/mcp.js +12 -4
- package/dist/entrypoints/mcp.js.map +2 -2
- package/dist/history.js +14 -3
- package/dist/history.js.map +2 -2
- package/dist/hooks/useAgentTokenStats.js +72 -0
- package/dist/hooks/useAgentTokenStats.js.map +7 -0
- package/dist/hooks/useAgentTranscripts.js +140 -0
- package/dist/hooks/useAgentTranscripts.js.map +7 -0
- package/dist/hooks/useAnimationSync.js +53 -0
- package/dist/hooks/useAnimationSync.js.map +7 -0
- package/dist/hooks/useArrowKeyHistory.js +4 -2
- package/dist/hooks/useArrowKeyHistory.js.map +2 -2
- package/dist/hooks/useCanUseTool.js +3 -1
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useExitOnCtrlCD.js +9 -5
- package/dist/hooks/useExitOnCtrlCD.js.map +2 -2
- package/dist/hooks/useHookStatus.js +40 -0
- package/dist/hooks/useHookStatus.js.map +7 -0
- package/dist/hooks/useLogMessages.js +29 -2
- package/dist/hooks/useLogMessages.js.map +2 -2
- package/dist/hooks/useMessageGroups.js +43 -0
- package/dist/hooks/useMessageGroups.js.map +7 -0
- package/dist/hooks/useTerminalSize.js +62 -6
- package/dist/hooks/useTerminalSize.js.map +2 -2
- package/dist/hooks/useUnifiedCompletion.js +69 -0
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/i18n/index.js +109 -0
- package/dist/i18n/index.js.map +7 -0
- package/dist/i18n/locales/en.js +348 -0
- package/dist/i18n/locales/en.js.map +7 -0
- package/dist/i18n/locales/index.js +7 -0
- package/dist/i18n/locales/index.js.map +7 -0
- package/dist/i18n/locales/zh-CN.js +348 -0
- package/dist/i18n/locales/zh-CN.js.map +7 -0
- package/dist/i18n/types.js +8 -0
- package/dist/i18n/types.js.map +7 -0
- package/dist/permissions.js +28 -1
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +253 -21
- package/dist/query.js.map +3 -3
- package/dist/screens/REPL.js +523 -194
- package/dist/screens/REPL.js.map +3 -3
- package/dist/services/adapters/chatCompletions.js +3 -1
- package/dist/services/adapters/chatCompletions.js.map +2 -2
- package/dist/services/adapters/messageNormalizer.js +354 -0
- package/dist/services/adapters/messageNormalizer.js.map +7 -0
- package/dist/services/adapters/responsesAPI.js +6 -3
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/checkpointManager.js +386 -0
- package/dist/services/checkpointManager.js.map +7 -0
- package/dist/services/claude.js +192 -14
- package/dist/services/claude.js.map +3 -3
- package/dist/services/compressionService.js +50 -1
- package/dist/services/compressionService.js.map +2 -2
- package/dist/services/contextMonitor.js +162 -0
- package/dist/services/contextMonitor.js.map +7 -0
- package/dist/services/customCommands.js +60 -41
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/hookExecutor.js +173 -1
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/intelligentCompactor.js +281 -0
- package/dist/services/intelligentCompactor.js.map +7 -0
- package/dist/services/lspConfig.js +109 -0
- package/dist/services/lspConfig.js.map +7 -0
- package/dist/services/mcpClient.js +338 -43
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/modelOrchestrator.js +310 -0
- package/dist/services/modelOrchestrator.js.map +7 -0
- package/dist/services/openai.js +8 -1
- package/dist/services/openai.js.map +2 -2
- package/dist/services/outputStyles.js +138 -0
- package/dist/services/outputStyles.js.map +7 -0
- package/dist/services/plugins/index.js +5 -0
- package/dist/services/plugins/index.js.map +7 -0
- package/dist/services/plugins/lspServers.js +188 -0
- package/dist/services/plugins/lspServers.js.map +7 -0
- package/dist/services/plugins/pluginRuntime.js +229 -0
- package/dist/services/plugins/pluginRuntime.js.map +7 -0
- package/dist/services/plugins/pluginValidation.js +219 -0
- package/dist/services/plugins/pluginValidation.js.map +7 -0
- package/dist/services/plugins/skillMarketplace.js +556 -0
- package/dist/services/plugins/skillMarketplace.js.map +7 -0
- package/dist/services/responseStateManager.js +37 -3
- package/dist/services/responseStateManager.js.map +2 -2
- package/dist/services/sandbox/filesystemBoundary.js +341 -0
- package/dist/services/sandbox/filesystemBoundary.js.map +7 -0
- package/dist/services/sandbox/index.js +14 -0
- package/dist/services/sandbox/index.js.map +7 -0
- package/dist/services/sandbox/networkProxy.js +293 -0
- package/dist/services/sandbox/networkProxy.js.map +7 -0
- package/dist/services/sandbox/sandboxController.js +574 -0
- package/dist/services/sandbox/sandboxController.js.map +7 -0
- package/dist/services/sandbox/types.js +50 -0
- package/dist/services/sandbox/types.js.map +7 -0
- package/dist/services/sessionMemory.js +266 -0
- package/dist/services/sessionMemory.js.map +7 -0
- package/dist/services/taskRouter.js +324 -0
- package/dist/services/taskRouter.js.map +7 -0
- package/dist/tools/ArchitectTool/ArchitectTool.js +7 -1
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +6 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +2 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BaseTool.js +72 -0
- package/dist/tools/BaseTool.js.map +7 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js +3 -0
- package/dist/tools/BashOutputTool/BashOutputToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js +79 -3
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/BashTool/BashToolResultMessage.js +3 -0
- package/dist/tools/BashTool/BashToolResultMessage.js.map +2 -2
- package/dist/tools/BashTool/OutputLine.js +54 -0
- package/dist/tools/BashTool/OutputLine.js.map +2 -2
- package/dist/tools/BashTool/prompt.js +336 -3
- package/dist/tools/BashTool/prompt.js.map +2 -2
- package/dist/tools/FileEditTool/FileEditTool.js +29 -4
- package/dist/tools/FileEditTool/FileEditTool.js.map +2 -2
- package/dist/tools/FileEditTool/prompt.js +6 -3
- package/dist/tools/FileEditTool/prompt.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js +5 -5
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/FileWriteTool/prompt.js +4 -2
- package/dist/tools/FileWriteTool/prompt.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +4 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +36 -7
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js +3 -0
- package/dist/tools/KillShellTool/KillShellToolResultMessage.js.map +2 -2
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js +109 -0
- package/dist/tools/ListMcpResourcesTool/ListMcpResourcesTool.js.map +7 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js +19 -0
- package/dist/tools/ListMcpResourcesTool/prompt.js.map +7 -0
- package/dist/tools/LspTool/LspTool.js +664 -0
- package/dist/tools/LspTool/LspTool.js.map +7 -0
- package/dist/tools/LspTool/prompt.js +27 -0
- package/dist/tools/LspTool/prompt.js.map +7 -0
- package/dist/tools/MCPTool/MCPTool.js +9 -1
- package/dist/tools/MCPTool/MCPTool.js.map +2 -2
- package/dist/tools/MemoryReadTool/MemoryReadTool.js +19 -6
- package/dist/tools/MemoryReadTool/MemoryReadTool.js.map +2 -2
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js +6 -6
- package/dist/tools/MemoryWriteTool/MemoryWriteTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +19 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/MultiEditTool/prompt.js +5 -3
- package/dist/tools/MultiEditTool/prompt.js.map +2 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js +7 -2
- package/dist/tools/NotebookEditTool/NotebookEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js +75 -0
- package/dist/tools/PlanModeTool/EnterPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js +109 -0
- package/dist/tools/PlanModeTool/ExitPlanModeTool.js.map +7 -0
- package/dist/tools/PlanModeTool/prompt.js +94 -0
- package/dist/tools/PlanModeTool/prompt.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js +130 -0
- package/dist/tools/ReadMcpResourceTool/ReadMcpResourceTool.js.map +7 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js +17 -0
- package/dist/tools/ReadMcpResourceTool/prompt.js.map +7 -0
- package/dist/tools/SkillTool/SkillTool.js +10 -4
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/SkillTool/prompt.js +1 -1
- package/dist/tools/SkillTool/prompt.js.map +1 -1
- package/dist/tools/SlashCommandTool/SlashCommandTool.js +260 -0
- package/dist/tools/SlashCommandTool/SlashCommandTool.js.map +7 -0
- package/dist/tools/SlashCommandTool/prompt.js +35 -0
- package/dist/tools/SlashCommandTool/prompt.js.map +7 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js +190 -0
- package/dist/tools/TaskOutputTool/TaskOutputTool.js.map +7 -0
- package/dist/tools/TaskOutputTool/prompt.js +15 -0
- package/dist/tools/TaskOutputTool/prompt.js.map +7 -0
- package/dist/tools/TaskTool/TaskTool.js +310 -104
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +42 -77
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +4 -1
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/cache.js +55 -8
- package/dist/tools/URLFetcherTool/cache.js.map +2 -2
- package/dist/tools.js +31 -2
- package/dist/tools.js.map +2 -2
- package/dist/types/hooks.js +4 -0
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/marketplace.js.map +2 -2
- package/dist/types/messageGroup.js +36 -0
- package/dist/types/messageGroup.js.map +7 -0
- package/dist/types/plugin.js.map +2 -2
- package/dist/types/thinking.js +1 -0
- package/dist/types/thinking.js.map +7 -0
- package/dist/utils/BackgroundShellManager.js +136 -39
- package/dist/utils/BackgroundShellManager.js.map +2 -2
- package/dist/utils/CircuitBreaker.js +242 -0
- package/dist/utils/CircuitBreaker.js.map +7 -0
- package/dist/utils/MessageBatchBuffer.js +102 -0
- package/dist/utils/MessageBatchBuffer.js.map +7 -0
- package/dist/utils/PersistentShell.js +151 -1
- package/dist/utils/PersistentShell.js.map +2 -2
- package/dist/utils/agentLoader.js +1 -23
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentTranscripts.js +641 -0
- package/dist/utils/agentTranscripts.js.map +7 -0
- package/dist/utils/animationManager.js +213 -0
- package/dist/utils/animationManager.js.map +7 -0
- package/dist/utils/animationSync.js +110 -0
- package/dist/utils/animationSync.js.map +7 -0
- package/dist/utils/ask.js +2 -0
- package/dist/utils/ask.js.map +2 -2
- package/dist/utils/asyncFile.js +215 -0
- package/dist/utils/asyncFile.js.map +7 -0
- package/dist/utils/backgroundAgentManager.js +231 -0
- package/dist/utils/backgroundAgentManager.js.map +7 -0
- package/dist/utils/config.js +108 -10
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/conversationRecovery.js +19 -0
- package/dist/utils/conversationRecovery.js.map +2 -2
- package/dist/utils/credentials/CredentialStore.js +1 -0
- package/dist/utils/credentials/CredentialStore.js.map +7 -0
- package/dist/utils/credentials/EncryptedFileStore.js +157 -0
- package/dist/utils/credentials/EncryptedFileStore.js.map +7 -0
- package/dist/utils/credentials/index.js +37 -0
- package/dist/utils/credentials/index.js.map +7 -0
- package/dist/utils/credentials/migration.js +82 -0
- package/dist/utils/credentials/migration.js.map +7 -0
- package/dist/utils/exit.js +73 -0
- package/dist/utils/exit.js.map +7 -0
- package/dist/utils/format.js +73 -5
- package/dist/utils/format.js.map +2 -2
- package/dist/utils/generators.js +76 -6
- package/dist/utils/generators.js.map +2 -2
- package/dist/utils/globalErrorHandler.js +149 -0
- package/dist/utils/globalErrorHandler.js.map +7 -0
- package/dist/utils/groupHandlers/index.js +8 -0
- package/dist/utils/groupHandlers/index.js.map +7 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js +140 -0
- package/dist/utils/groupHandlers/parallelTasksHandler.js.map +7 -0
- package/dist/utils/groupHandlers/taskHandler.js +104 -0
- package/dist/utils/groupHandlers/taskHandler.js.map +7 -0
- package/dist/utils/groupHandlers/types.js +1 -0
- package/dist/utils/groupHandlers/types.js.map +7 -0
- package/dist/utils/logRotation.js +224 -0
- package/dist/utils/logRotation.js.map +7 -0
- package/dist/utils/markdown.js +13 -1
- package/dist/utils/markdown.js.map +2 -2
- package/dist/utils/marketplaceManager.js +3 -5
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/memSafety.js +264 -0
- package/dist/utils/memSafety.js.map +7 -0
- package/dist/utils/messageGroupManager.js +274 -0
- package/dist/utils/messageGroupManager.js.map +7 -0
- package/dist/utils/messages.js +13 -4
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +119 -15
- package/dist/utils/model.js.map +3 -3
- package/dist/utils/permissions/filesystem.js +162 -6
- package/dist/utils/permissions/filesystem.js.map +2 -2
- package/dist/utils/plan/planMode.js +143 -0
- package/dist/utils/plan/planMode.js.map +7 -0
- package/dist/utils/pluginLoader.js +17 -21
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/ripgrep.js +55 -2
- package/dist/utils/ripgrep.js.map +2 -2
- package/dist/utils/safePath.js +132 -0
- package/dist/utils/safePath.js.map +7 -0
- package/dist/utils/sanitizeInput.js +32 -0
- package/dist/utils/sanitizeInput.js.map +7 -0
- package/dist/utils/secureKeyStorage.js +312 -0
- package/dist/utils/secureKeyStorage.js.map +7 -0
- package/dist/utils/sensitiveFiles.js +125 -0
- package/dist/utils/sensitiveFiles.js.map +7 -0
- package/dist/utils/session/sessionPlugins.js +67 -0
- package/dist/utils/session/sessionPlugins.js.map +7 -0
- package/dist/utils/taskDisplayUtils.js +257 -0
- package/dist/utils/taskDisplayUtils.js.map +7 -0
- package/dist/utils/teamConfig.js +2 -1
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/theme.js +6 -6
- package/dist/utils/theme.js.map +1 -1
- package/dist/utils/todoStorage.js +92 -2
- package/dist/utils/todoStorage.js.map +2 -2
- package/dist/utils/toolRiskClassification.js +207 -0
- package/dist/utils/toolRiskClassification.js.map +7 -0
- package/dist/utils/toolTimeout.js +136 -0
- package/dist/utils/toolTimeout.js.map +7 -0
- package/dist/utils/tooling/safeRender.js +116 -0
- package/dist/utils/tooling/safeRender.js.map +7 -0
- package/dist/utils/userFriendlyError.js +346 -0
- package/dist/utils/userFriendlyError.js.map +7 -0
- package/dist/utils/vendor/ripgrep/arm64-darwin/rg +0 -0
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +17 -5
- package/scripts/postinstall.js +128 -38
- package/dist/commands/agents.js +0 -2086
- package/dist/commands/agents.js.map +0 -7
- package/dist/commands/build.js +0 -74
- package/dist/commands/build.js.map +0 -7
- package/dist/commands/compression.js +0 -57
- package/dist/commands/compression.js.map +0 -7
- package/dist/commands/listen.js +0 -37
- package/dist/commands/listen.js.map +0 -7
- package/dist/commands/login.js +0 -37
- package/dist/commands/login.js.map +0 -7
- package/dist/commands/logout.js +0 -33
- package/dist/commands/logout.js.map +0 -7
- package/dist/commands/mcp.js +0 -40
- package/dist/commands/mcp.js.map +0 -7
- package/dist/commands/mcp_refresh.js +0 -40
- package/dist/commands/mcp_refresh.js.map +0 -7
- package/dist/commands/modelstatus.js +0 -21
- package/dist/commands/modelstatus.js.map +0 -7
- package/dist/commands/onboarding.js +0 -36
- package/dist/commands/onboarding.js.map +0 -7
- package/dist/commands/plugin-interactive.js +0 -446
- package/dist/commands/plugin-interactive.js.map +0 -7
- package/dist/commands/pr_comments.js +0 -61
- package/dist/commands/pr_comments.js.map +0 -7
- package/dist/commands/release-notes.js +0 -30
- package/dist/commands/release-notes.js.map +0 -7
- package/dist/commands/review.js +0 -51
- package/dist/commands/review.js.map +0 -7
- package/dist/components/Bug.js +0 -147
- package/dist/components/Bug.js.map +0 -7
- package/dist/components/ModelSelector.js +0 -2062
- package/dist/components/ModelSelector.js.map +0 -7
- package/dist/components/ModelStatusDisplay.js +0 -87
- package/dist/components/ModelStatusDisplay.js.map +0 -7
- package/dist/entrypoints/cli-wrapper.js +0 -61
- package/dist/entrypoints/cli-wrapper.js.map +0 -7
- package/dist/hooks/useCancelRequest.js +0 -28
- package/dist/hooks/useCancelRequest.js.map +0 -7
- package/dist/screens/Doctor.js +0 -22
- package/dist/screens/Doctor.js.map +0 -7
|
@@ -2,6 +2,7 @@ import React from "react";
|
|
|
2
2
|
import { Box, Text, useInput } from "ink";
|
|
3
3
|
import { Select } from "../../components/CustomSelect/select.js";
|
|
4
4
|
import { getTheme } from "../../utils/theme.js";
|
|
5
|
+
import { SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
5
6
|
const MainMenu = ({
|
|
6
7
|
onNavigate,
|
|
7
8
|
onBack,
|
|
@@ -57,7 +58,7 @@ const MainMenu = ({
|
|
|
57
58
|
},
|
|
58
59
|
/* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Plugins")),
|
|
59
60
|
/* @__PURE__ */ React.createElement(Select, { options, onChange: handleSelect }),
|
|
60
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
61
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Esc to exit"))
|
|
61
62
|
);
|
|
62
63
|
};
|
|
63
64
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/plugin/MainMenu.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Main Menu Component\n *\n * Entry point for the interactive plugin management interface.\n * Provides navigation to all major plugin management functions.\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport type { NavigationProps } from './types'\n\nexport const MainMenu: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n onDone,\n}) => {\n const theme = getTheme()\n\n const options = [\n {\n label: '1. Browse and install plugins',\n value: 'browse',\n },\n {\n label: '2. Manage and uninstall plugins',\n value: 'manage',\n },\n {\n label: '3. Add marketplace',\n value: 'add-marketplace',\n },\n {\n label: '4. Manage marketplaces',\n value: 'manage-marketplaces',\n },\n ]\n\n const handleSelect = (value: string) => {\n switch (value) {\n case 'browse':\n onNavigate({ screen: 'marketplace-selector' })\n break\n case 'manage':\n onNavigate({ screen: 'installed-plugins-manager' })\n break\n case 'add-marketplace':\n onNavigate({ screen: 'add-marketplace' })\n break\n case 'manage-marketplaces':\n onNavigate({ screen: 'marketplace-manager' })\n break\n }\n }\n\n // Handle Escape key to exit\n useInput((input, key) => {\n if (key.escape) {\n onDone()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n Plugins\n </Text>\n </Box>\n\n <Select options={options} onChange={handleSelect} />\n\n <Box marginTop={1}>\n <Text
|
|
5
|
-
"mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,cAAc;AACvB,SAAS,gBAAgB;
|
|
4
|
+
"sourcesContent": ["/**\n * Main Menu Component\n *\n * Entry point for the interactive plugin management interface.\n * Provides navigation to all major plugin management functions.\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { getTheme } from '@utils/theme'\nimport type { NavigationProps } from './types'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\nexport const MainMenu: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n onDone,\n}) => {\n const theme = getTheme()\n\n const options = [\n {\n label: '1. Browse and install plugins',\n value: 'browse',\n },\n {\n label: '2. Manage and uninstall plugins',\n value: 'manage',\n },\n {\n label: '3. Add marketplace',\n value: 'add-marketplace',\n },\n {\n label: '4. Manage marketplaces',\n value: 'manage-marketplaces',\n },\n ]\n\n const handleSelect = (value: string) => {\n switch (value) {\n case 'browse':\n onNavigate({ screen: 'marketplace-selector' })\n break\n case 'manage':\n onNavigate({ screen: 'installed-plugins-manager' })\n break\n case 'add-marketplace':\n onNavigate({ screen: 'add-marketplace' })\n break\n case 'manage-marketplaces':\n onNavigate({ screen: 'marketplace-manager' })\n break\n }\n }\n\n // Handle Escape key to exit\n useInput((input, key) => {\n if (key.escape) {\n onDone()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n Plugins\n </Text>\n </Box>\n\n <Select options={options} onChange={handleSelect} />\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>Esc to exit</Text>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,cAAc;AACvB,SAAS,gBAAgB;AAEzB,SAAS,uBAAuB;AAEzB,MAAM,WAAsC,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AAEvB,QAAM,UAAU;AAAA,IACd;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,UAAkB;AACtC,YAAQ,OAAO;AAAA,MACb,KAAK;AACH,mBAAW,EAAE,QAAQ,uBAAuB,CAAC;AAC7C;AAAA,MACF,KAAK;AACH,mBAAW,EAAE,QAAQ,4BAA4B,CAAC;AAClD;AAAA,MACF,KAAK;AACH,mBAAW,EAAE,QAAQ,kBAAkB,CAAC;AACxC;AAAA,MACF,KAAK;AACH,mBAAW,EAAE,QAAQ,sBAAsB,CAAC;AAC5C;AAAA,IACJ;AAAA,EACF;AAGA,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,SAEjC,CACF;AAAA,IAEA,oCAAC,UAAO,SAAkB,UAAU,cAAc;AAAA,IAElD,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,gBAAgB,OAAK,aAAW,CAC/C;AAAA,EACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
updateMarketplace,
|
|
7
7
|
removeMarketplace
|
|
8
8
|
} from "../../utils/marketplaceManager.js";
|
|
9
|
+
import { SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
9
10
|
import {
|
|
10
11
|
MarketplaceError
|
|
11
12
|
} from "../../types/marketplace.js";
|
|
@@ -154,8 +155,8 @@ Installed plugins from this marketplace will not be affected.`,
|
|
|
154
155
|
borderColor: theme.primary,
|
|
155
156
|
padding: 1
|
|
156
157
|
},
|
|
157
|
-
/* @__PURE__ */ React.createElement(Box, { justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Marketplaces"), marketplaces.length > 0 && /* @__PURE__ */ React.createElement(Text, {
|
|
158
|
-
marketplaces.length === 0 ? /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No marketplaces registered."), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
158
|
+
/* @__PURE__ */ React.createElement(Box, { justifyContent: "space-between" }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Manage Marketplaces"), marketplaces.length > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "(", marketplaces.length, " registered)")),
|
|
159
|
+
marketplaces.length === 0 ? /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, "No marketplaces registered."), /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press "), /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "a"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "to add your first marketplace."))) : /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, marketplaces.map((marketplace, index) => /* @__PURE__ */ React.createElement(
|
|
159
160
|
MarketplaceListItem,
|
|
160
161
|
{
|
|
161
162
|
key: marketplace.name,
|
|
@@ -175,7 +176,7 @@ Installed plugins from this marketplace will not be affected.`,
|
|
|
175
176
|
/* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u2717 ", error)
|
|
176
177
|
),
|
|
177
178
|
loading && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(SimpleSpinner, null), /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, " Updating marketplace...")),
|
|
178
|
-
!loading && /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, {
|
|
179
|
+
!loading && /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, marketplaces.length > 0 ? "\u2191\u2193 navigate \xB7 " : "", marketplaces.length > 0 ? /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Enter") : "", marketplaces.length > 0 ? " details \xB7 " : "", /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "a"), " add \xB7", marketplaces.length > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, " u"), " update \xB7", " ") : "", marketplaces.length > 0 ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, { color: theme.error }, " r"), " remove \xB7", " ") : " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Esc"), " back"))
|
|
179
180
|
);
|
|
180
181
|
};
|
|
181
182
|
const MarketplaceListItem = ({
|
|
@@ -192,7 +193,7 @@ const MarketplaceListItem = ({
|
|
|
192
193
|
},
|
|
193
194
|
marketplace.enabled ? "\u25CF " : "\u25CB ",
|
|
194
195
|
marketplace.name
|
|
195
|
-
), !marketplace.enabled && /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, " (disabled)")), /* @__PURE__ */ React.createElement(Box, { marginLeft: 4, flexDirection: "column" }, marketplace.manifest.metadata?.description && /* @__PURE__ */ React.createElement(Text, {
|
|
196
|
+
), !marketplace.enabled && /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, " (disabled)")), /* @__PURE__ */ React.createElement(Box, { marginLeft: 4, flexDirection: "column" }, marketplace.manifest.metadata?.description && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, marketplace.manifest.metadata.description), /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, marketplace.manifest.plugins.length, " available"), installed > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " \xB7 ", installed, " installed"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", "\xB7 Updated ", formatTimeAgo(marketplace.lastUpdated))), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Source: ", formatMarketplacePath(marketplace.source))));
|
|
196
197
|
};
|
|
197
198
|
export {
|
|
198
199
|
MarketplaceManager
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/plugin/MarketplaceManager.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * MarketplaceManager Component\n *\n * Manage registered plugin marketplaces with list, update, and remove operations\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport {\n listMarketplaces,\n updateMarketplace,\n removeMarketplace,\n} from '@utils/marketplaceManager'\nimport {\n RegisteredMarketplace,\n MarketplaceError,\n} from '../../types/marketplace'\nimport { getTheme } from '@utils/theme'\nimport {\n formatMarketplacePath,\n formatTimeAgo,\n countInstalledPlugins,\n} from './utils'\nimport { NavigationProps } from './AddMarketplaceForm'\nimport { ConfirmDialog } from './ConfirmDialog'\n\nexport const MarketplaceManager: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const [marketplaces, setMarketplaces] = useState<RegisteredMarketplace[]>([])\n const [focusedIndex, setFocusedIndex] = useState(0)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<\n 'update' | 'remove' | null\n >(null)\n const theme = getTheme()\n\n // Load marketplaces\n useEffect(() => {\n refreshMarketplaces()\n }, [])\n\n const refreshMarketplaces = () => {\n try {\n const markets = listMarketplaces()\n setMarketplaces(markets)\n // Keep focus in bounds\n if (focusedIndex >= markets.length && markets.length > 0) {\n setFocusedIndex(markets.length - 1)\n }\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to load marketplaces',\n )\n }\n }\n\n const handleUpdate = async (marketplace: RegisteredMarketplace) => {\n setLoading(true)\n setError(null)\n\n try {\n await updateMarketplace(marketplace.name)\n refreshMarketplaces()\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setError(`Update failed: ${err.message}`)\n } else {\n setError(\n `Update failed: ${err instanceof Error ? err.message : 'Unknown error'}`,\n )\n }\n } finally {\n setLoading(false)\n }\n }\n\n const handleRemove = (marketplace: RegisteredMarketplace) => {\n try {\n removeMarketplace(marketplace.name)\n refreshMarketplaces()\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setError(`Remove failed: ${err.message}`)\n } else {\n setError(\n `Remove failed: ${err instanceof Error ? err.message : 'Unknown error'}`,\n )\n }\n }\n }\n\n const handleConfirmUpdate = () => {\n setShowConfirm(false)\n if (focusedIndex < marketplaces.length) {\n handleUpdate(marketplaces[focusedIndex])\n }\n }\n\n const handleConfirmRemove = () => {\n setShowConfirm(false)\n if (focusedIndex < marketplaces.length) {\n handleRemove(marketplaces[focusedIndex])\n }\n }\n\n const handleConfirmCancel = () => {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n\n useInput(\n (input, key) => {\n if (showConfirm || loading) return\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow && focusedIndex > 0) {\n setFocusedIndex(focusedIndex - 1)\n setError(null)\n } else if (key.downArrow && focusedIndex < marketplaces.length - 1) {\n setFocusedIndex(focusedIndex + 1)\n setError(null)\n } else if (key.return && marketplaces.length > 0) {\n // Navigate to marketplace details\n onNavigate({\n screen: 'marketplace-details',\n marketplace: marketplaces[focusedIndex].name,\n })\n } else if (input === 'u' && marketplaces.length > 0) {\n setConfirmAction('update')\n setShowConfirm(true)\n } else if (input === 'r' && marketplaces.length > 0) {\n setConfirmAction('remove')\n setShowConfirm(true)\n } else if (input === 'a') {\n onNavigate({ screen: 'add-marketplace' })\n }\n },\n { isActive: !showConfirm && !loading },\n )\n\n if (\n showConfirm &&\n confirmAction === 'update' &&\n focusedIndex < marketplaces.length\n ) {\n return (\n <ConfirmDialog\n title=\"Update Marketplace\"\n message={`Update marketplace \"${marketplaces[focusedIndex].name}\"?\\n\\nThis will fetch the latest plugin list from the source.`}\n onConfirm={handleConfirmUpdate}\n onCancel={handleConfirmCancel}\n />\n )\n }\n\n if (\n showConfirm &&\n confirmAction === 'remove' &&\n focusedIndex < marketplaces.length\n ) {\n return (\n <ConfirmDialog\n title=\"Remove Marketplace\"\n message={`Remove marketplace \"${marketplaces[focusedIndex].name}\"?\\n\\nInstalled plugins from this marketplace will not be affected.`}\n onConfirm={handleConfirmRemove}\n onCancel={handleConfirmCancel}\n confirmColor={theme.error}\n />\n )\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box justifyContent=\"space-between\">\n <Text bold color={theme.primary}>\n Manage Marketplaces\n </Text>\n {marketplaces.length > 0 && (\n <Text
|
|
5
|
-
"mappings": "AAMA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,OACK;AACP,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,qBAAqB;AAEvB,MAAM,qBAAgD,CAAC;AAAA,EAC5D;AAAA,EACA;AACF,MAAM;AACJ,QAAM,CAAC,cAAc,eAAe,IAAI,SAAkC,CAAC,CAAC;AAC5E,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AACtD,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAExC,IAAI;AACN,QAAM,QAAQ,SAAS;AAGvB,YAAU,MAAM;AACd,wBAAoB;AAAA,EACtB,GAAG,CAAC,CAAC;AAEL,QAAM,sBAAsB,MAAM;AAChC,QAAI;AACF,YAAM,UAAU,iBAAiB;AACjC,sBAAgB,OAAO;AAEvB,UAAI,gBAAgB,QAAQ,UAAU,QAAQ,SAAS,GAAG;AACxD,wBAAgB,QAAQ,SAAS,CAAC;AAAA,MACpC;AAAA,IACF,SAAS,KAAK;AACZ;AAAA,QACE,eAAe,QAAQ,IAAI,UAAU;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAAe,OAAO,gBAAuC;AACjE,eAAW,IAAI;AACf,aAAS,IAAI;AAEb,QAAI;AACF,YAAM,kBAAkB,YAAY,IAAI;AACxC,0BAAoB;AAAA,IACtB,SAAS,KAAK;AACZ,UAAI,eAAe,kBAAkB;AACnC,iBAAS,kBAAkB,IAAI,OAAO,EAAE;AAAA,MAC1C,OAAO;AACL;AAAA,UACE,kBAAkB,eAAe,QAAQ,IAAI,UAAU,eAAe;AAAA,QACxE;AAAA,MACF;AAAA,IACF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,eAAe,CAAC,gBAAuC;AAC3D,QAAI;AACF,wBAAkB,YAAY,IAAI;AAClC,0BAAoB;AAAA,IACtB,SAAS,KAAK;AACZ,UAAI,eAAe,kBAAkB;AACnC,iBAAS,kBAAkB,IAAI,OAAO,EAAE;AAAA,MAC1C,OAAO;AACL;AAAA,UACE,kBAAkB,eAAe,QAAQ,IAAI,UAAU,eAAe;AAAA,QACxE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,mBAAe,KAAK;AACpB,QAAI,eAAe,aAAa,QAAQ;AACtC,mBAAa,aAAa,YAAY,CAAC;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,mBAAe,KAAK;AACpB,QAAI,eAAe,aAAa,QAAQ;AACtC,mBAAa,aAAa,YAAY,CAAC;AAAA,IACzC;AAAA,EACF;AAEA,QAAM,sBAAsB,MAAM;AAChC,mBAAe,KAAK;AACpB,qBAAiB,IAAI;AAAA,EACvB;AAEA;AAAA,IACE,CAAC,OAAO,QAAQ;AACd,UAAI,eAAe,QAAS;AAE5B,UAAI,IAAI,QAAQ;AACd,eAAO;AAAA,MACT,WAAW,IAAI,WAAW,eAAe,GAAG;AAC1C,wBAAgB,eAAe,CAAC;AAChC,iBAAS,IAAI;AAAA,MACf,WAAW,IAAI,aAAa,eAAe,aAAa,SAAS,GAAG;AAClE,wBAAgB,eAAe,CAAC;AAChC,iBAAS,IAAI;AAAA,MACf,WAAW,IAAI,UAAU,aAAa,SAAS,GAAG;AAEhD,mBAAW;AAAA,UACT,QAAQ;AAAA,UACR,aAAa,aAAa,YAAY,EAAE;AAAA,QAC1C,CAAC;AAAA,MACH,WAAW,UAAU,OAAO,aAAa,SAAS,GAAG;AACnD,yBAAiB,QAAQ;AACzB,uBAAe,IAAI;AAAA,MACrB,WAAW,UAAU,OAAO,aAAa,SAAS,GAAG;AACnD,yBAAiB,QAAQ;AACzB,uBAAe,IAAI;AAAA,MACrB,WAAW,UAAU,KAAK;AACxB,mBAAW,EAAE,QAAQ,kBAAkB,CAAC;AAAA,MAC1C;AAAA,IACF;AAAA,IACA,EAAE,UAAU,CAAC,eAAe,CAAC,QAAQ;AAAA,EACvC;AAEA,MACE,eACA,kBAAkB,YAClB,eAAe,aAAa,QAC5B;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,uBAAuB,aAAa,YAAY,EAAE,IAAI;AAAA;AAAA;AAAA,QAC/D,WAAW;AAAA,QACX,UAAU;AAAA;AAAA,IACZ;AAAA,EAEJ;AAEA,MACE,eACA,kBAAkB,YAClB,eAAe,aAAa,QAC5B;AACA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,SAAS,uBAAuB,aAAa,YAAY,EAAE,IAAI;AAAA;AAAA;AAAA,QAC/D,WAAW;AAAA,QACX,UAAU;AAAA,QACV,cAAc,MAAM;AAAA;AAAA,IACtB;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,OAAI,gBAAe,mBAClB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,qBAEjC,GACC,aAAa,SAAS,KACrB,oCAAC,QAAK,
|
|
4
|
+
"sourcesContent": ["/**\n * MarketplaceManager Component\n *\n * Manage registered plugin marketplaces with list, update, and remove operations\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { SimpleSpinner } from '@components/Spinner'\nimport {\n listMarketplaces,\n updateMarketplace,\n removeMarketplace,\n} from '@utils/marketplaceManager'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport {\n RegisteredMarketplace,\n MarketplaceError,\n} from '../../types/marketplace'\nimport { getTheme } from '@utils/theme'\nimport {\n formatMarketplacePath,\n formatTimeAgo,\n countInstalledPlugins,\n} from './utils'\nimport { NavigationProps } from './AddMarketplaceForm'\nimport { ConfirmDialog } from './ConfirmDialog'\n\nexport const MarketplaceManager: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const [marketplaces, setMarketplaces] = useState<RegisteredMarketplace[]>([])\n const [focusedIndex, setFocusedIndex] = useState(0)\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<\n 'update' | 'remove' | null\n >(null)\n const theme = getTheme()\n\n // Load marketplaces\n useEffect(() => {\n refreshMarketplaces()\n }, [])\n\n const refreshMarketplaces = () => {\n try {\n const markets = listMarketplaces()\n setMarketplaces(markets)\n // Keep focus in bounds\n if (focusedIndex >= markets.length && markets.length > 0) {\n setFocusedIndex(markets.length - 1)\n }\n } catch (err) {\n setError(\n err instanceof Error ? err.message : 'Failed to load marketplaces',\n )\n }\n }\n\n const handleUpdate = async (marketplace: RegisteredMarketplace) => {\n setLoading(true)\n setError(null)\n\n try {\n await updateMarketplace(marketplace.name)\n refreshMarketplaces()\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setError(`Update failed: ${err.message}`)\n } else {\n setError(\n `Update failed: ${err instanceof Error ? err.message : 'Unknown error'}`,\n )\n }\n } finally {\n setLoading(false)\n }\n }\n\n const handleRemove = (marketplace: RegisteredMarketplace) => {\n try {\n removeMarketplace(marketplace.name)\n refreshMarketplaces()\n } catch (err) {\n if (err instanceof MarketplaceError) {\n setError(`Remove failed: ${err.message}`)\n } else {\n setError(\n `Remove failed: ${err instanceof Error ? err.message : 'Unknown error'}`,\n )\n }\n }\n }\n\n const handleConfirmUpdate = () => {\n setShowConfirm(false)\n if (focusedIndex < marketplaces.length) {\n handleUpdate(marketplaces[focusedIndex])\n }\n }\n\n const handleConfirmRemove = () => {\n setShowConfirm(false)\n if (focusedIndex < marketplaces.length) {\n handleRemove(marketplaces[focusedIndex])\n }\n }\n\n const handleConfirmCancel = () => {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n\n useInput(\n (input, key) => {\n if (showConfirm || loading) return\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow && focusedIndex > 0) {\n setFocusedIndex(focusedIndex - 1)\n setError(null)\n } else if (key.downArrow && focusedIndex < marketplaces.length - 1) {\n setFocusedIndex(focusedIndex + 1)\n setError(null)\n } else if (key.return && marketplaces.length > 0) {\n // Navigate to marketplace details\n onNavigate({\n screen: 'marketplace-details',\n marketplace: marketplaces[focusedIndex].name,\n })\n } else if (input === 'u' && marketplaces.length > 0) {\n setConfirmAction('update')\n setShowConfirm(true)\n } else if (input === 'r' && marketplaces.length > 0) {\n setConfirmAction('remove')\n setShowConfirm(true)\n } else if (input === 'a') {\n onNavigate({ screen: 'add-marketplace' })\n }\n },\n { isActive: !showConfirm && !loading },\n )\n\n if (\n showConfirm &&\n confirmAction === 'update' &&\n focusedIndex < marketplaces.length\n ) {\n return (\n <ConfirmDialog\n title=\"Update Marketplace\"\n message={`Update marketplace \"${marketplaces[focusedIndex].name}\"?\\n\\nThis will fetch the latest plugin list from the source.`}\n onConfirm={handleConfirmUpdate}\n onCancel={handleConfirmCancel}\n />\n )\n }\n\n if (\n showConfirm &&\n confirmAction === 'remove' &&\n focusedIndex < marketplaces.length\n ) {\n return (\n <ConfirmDialog\n title=\"Remove Marketplace\"\n message={`Remove marketplace \"${marketplaces[focusedIndex].name}\"?\\n\\nInstalled plugins from this marketplace will not be affected.`}\n onConfirm={handleConfirmRemove}\n onCancel={handleConfirmCancel}\n confirmColor={theme.error}\n />\n )\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box justifyContent=\"space-between\">\n <Text bold color={theme.primary}>\n Manage Marketplaces\n </Text>\n {marketplaces.length > 0 && (\n <Text color={SEMANTIC_COLORS.dim}>\n ({marketplaces.length} registered)\n </Text>\n )}\n </Box>\n\n {marketplaces.length === 0 ? (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={theme.warning}>No marketplaces registered.</Text>\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>Press </Text>\n <Text color={theme.success}>a</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n to add your first marketplace.\n </Text>\n </Box>\n </Box>\n ) : (\n <Box marginTop={1} flexDirection=\"column\">\n {marketplaces.map((marketplace, index) => (\n <MarketplaceListItem\n key={marketplace.name}\n marketplace={marketplace}\n isFocused={index === focusedIndex}\n theme={theme}\n />\n ))}\n </Box>\n )}\n\n {error && (\n <Box\n marginTop={1}\n borderStyle=\"round\"\n borderColor={theme.error}\n padding={1}\n >\n <Text color={theme.error}>\u2717 {error}</Text>\n </Box>\n )}\n\n {loading && (\n <Box marginTop={1}>\n <SimpleSpinner />\n <Text color={theme.primary}> Updating marketplace...</Text>\n </Box>\n )}\n\n {!loading && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={SEMANTIC_COLORS.dim}>\n {marketplaces.length > 0 ? '\u2191\u2193 navigate \u00B7 ' : ''}\n {marketplaces.length > 0 ? (\n <Text color={theme.success}>Enter</Text>\n ) : (\n ''\n )}\n {marketplaces.length > 0 ? ' details \u00B7 ' : ''}\n <Text color={theme.success}>a</Text> add \u00B7\n {marketplaces.length > 0 ? (\n <>\n <Text color={theme.success}> u</Text> update \u00B7{' '}\n </>\n ) : (\n ''\n )}\n {marketplaces.length > 0 ? (\n <>\n <Text color={theme.error}> r</Text> remove \u00B7{' '}\n </>\n ) : (\n ' '\n )}\n <Text color={theme.error}>Esc</Text> back\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n\n// Marketplace list item component\ninterface MarketplaceListItemProps {\n marketplace: RegisteredMarketplace\n isFocused: boolean\n theme: ReturnType<typeof getTheme>\n}\n\nconst MarketplaceListItem: React.FC<MarketplaceListItemProps> = ({\n marketplace,\n isFocused,\n theme,\n}) => {\n const installed = countInstalledPlugins(marketplace.name)\n\n return (\n <Box flexDirection=\"column\" marginBottom={1}>\n <Box>\n <Text color={isFocused ? theme.success : theme.text}>\n {isFocused ? '\u276F ' : ' '}\n </Text>\n <Text\n color={marketplace.enabled ? theme.primary : theme.secondaryText}\n bold={isFocused}\n >\n {marketplace.enabled ? '\u25CF ' : '\u25CB '}\n {marketplace.name}\n </Text>\n {!marketplace.enabled && <Text color={theme.warning}> (disabled)</Text>}\n </Box>\n\n <Box marginLeft={4} flexDirection=\"column\">\n {marketplace.manifest.metadata?.description && (\n <Text color={SEMANTIC_COLORS.dim}>\n {marketplace.manifest.metadata.description}\n </Text>\n )}\n\n <Box>\n <Text color={SEMANTIC_COLORS.dim}>\n {marketplace.manifest.plugins.length} available\n </Text>\n {installed > 0 && (\n <Text color={SEMANTIC_COLORS.dim}> \u00B7 {installed} installed</Text>\n )}\n <Text color={SEMANTIC_COLORS.dim}>\n {' '}\n \u00B7 Updated {formatTimeAgo(marketplace.lastUpdated)}\n </Text>\n </Box>\n\n <Text color={SEMANTIC_COLORS.dim}>\n Source: {formatMarketplacePath(marketplace.source)}\n </Text>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4,6 +4,7 @@ import { Select } from "../../components/CustomSelect/select.js";
|
|
|
4
4
|
import { getTheme } from "../../utils/theme.js";
|
|
5
5
|
import { listMarketplaces } from "../../utils/marketplaceManager.js";
|
|
6
6
|
import { loadAllPlugins } from "../../utils/pluginLoader.js";
|
|
7
|
+
import { SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
7
8
|
const MarketplaceSelector = ({
|
|
8
9
|
onNavigate,
|
|
9
10
|
onBack
|
|
@@ -88,7 +89,7 @@ const MarketplaceSelector = ({
|
|
|
88
89
|
},
|
|
89
90
|
/* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error"),
|
|
90
91
|
/* @__PURE__ */ React.createElement(Text, null, error),
|
|
91
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
92
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press Esc to go back"))
|
|
92
93
|
);
|
|
93
94
|
}
|
|
94
95
|
const options = marketplaceStats.map((stat) => ({
|
|
@@ -105,7 +106,7 @@ const MarketplaceSelector = ({
|
|
|
105
106
|
paddingY: 1
|
|
106
107
|
},
|
|
107
108
|
/* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Select Plugin Marketplace"),
|
|
108
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, marketplaceStats.map((stat) => /* @__PURE__ */ React.createElement(Box, { key: stat.name, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.success }, stat.name)), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, {
|
|
109
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, marketplaceStats.map((stat) => /* @__PURE__ */ React.createElement(Box, { key: stat.name, flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.success }, stat.name)), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, stat.availableCount, " plugins available \xB7 ", stat.installedCount, " ", "already installed \xB7 ", stat.source))))),
|
|
109
110
|
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(
|
|
110
111
|
Select,
|
|
111
112
|
{
|
|
@@ -114,7 +115,7 @@ const MarketplaceSelector = ({
|
|
|
114
115
|
visibleOptionCount: Math.min(options.length, 10)
|
|
115
116
|
}
|
|
116
117
|
)),
|
|
117
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
118
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2191\u2193: Navigate \xB7 Enter: Select \xB7 Esc: Back"))
|
|
118
119
|
);
|
|
119
120
|
};
|
|
120
121
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/plugin/MarketplaceSelector.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Marketplace Selector Component\n *\n * Displays registered marketplace list with statistics\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { Option } from '@inkjs/ui'\nimport { getTheme } from '@utils/theme'\nimport { listMarketplaces, getMarketplace } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { RegisteredMarketplace } from '../../types/marketplace'\nimport { NavigationProps, MarketplaceStats } from './types'\n\nexport const MarketplaceSelector: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const theme = getTheme()\n const [marketplaceStats, setMarketplaceStats] = useState<MarketplaceStats[]>(\n [],\n )\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n loadMarketplaceData()\n }, [])\n\n const loadMarketplaceData = async () => {\n try {\n setLoading(true)\n setError(null)\n\n // Load marketplace list\n const marketplaces = listMarketplaces()\n\n if (marketplaces.length === 0) {\n setError(\n 'No marketplaces registered. Use \"minto plugin add-marketplace <source>\" to add one.',\n )\n setLoading(false)\n return\n }\n\n // Load all installed plugins to calculate stats\n const installedPlugins = loadAllPlugins()\n\n // Calculate stats for each marketplace\n const stats = marketplaces.map(marketplace => {\n const availableCount = marketplace.manifest.plugins.length\n const installedCount = installedPlugins.filter(\n plugin =>\n plugin.source.type === 'marketplace' &&\n 'marketplace' in plugin.source &&\n plugin.source.marketplace === marketplace.name,\n ).length\n\n // Get source path display\n let sourcePath = ''\n if (marketplace.source.type === 'github') {\n sourcePath = marketplace.source.repo\n } else if (marketplace.source.type === 'url') {\n sourcePath = marketplace.source.url\n } else if (marketplace.source.type === 'local') {\n sourcePath = marketplace.source.path\n }\n\n return {\n name: marketplace.name,\n source: sourcePath,\n availableCount,\n installedCount,\n }\n })\n\n setMarketplaceStats(stats)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }\n\n const handleSelectMarketplace = (value: string) => {\n onNavigate({\n screen: 'plugin-browser',\n marketplace: value,\n })\n }\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading marketplaces...</Text>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Error</Text>\n <Text>{error}</Text>\n <Box marginTop={1}>\n <Text
|
|
5
|
-
"mappings": "AAMA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,YAAY;AAC1B,SAAS,cAAc;AAEvB,SAAS,gBAAgB;AACzB,SAAS,wBAAwC;AACjD,SAAS,sBAAsB;
|
|
4
|
+
"sourcesContent": ["/**\n * Marketplace Selector Component\n *\n * Displays registered marketplace list with statistics\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { Option } from '@inkjs/ui'\nimport { getTheme } from '@utils/theme'\nimport { listMarketplaces, getMarketplace } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { RegisteredMarketplace } from '../../types/marketplace'\nimport { NavigationProps, MarketplaceStats } from './types'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\nexport const MarketplaceSelector: React.FC<NavigationProps> = ({\n onNavigate,\n onBack,\n}) => {\n const theme = getTheme()\n const [marketplaceStats, setMarketplaceStats] = useState<MarketplaceStats[]>(\n [],\n )\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n loadMarketplaceData()\n }, [])\n\n const loadMarketplaceData = async () => {\n try {\n setLoading(true)\n setError(null)\n\n // Load marketplace list\n const marketplaces = listMarketplaces()\n\n if (marketplaces.length === 0) {\n setError(\n 'No marketplaces registered. Use \"minto plugin add-marketplace <source>\" to add one.',\n )\n setLoading(false)\n return\n }\n\n // Load all installed plugins to calculate stats\n const installedPlugins = loadAllPlugins()\n\n // Calculate stats for each marketplace\n const stats = marketplaces.map(marketplace => {\n const availableCount = marketplace.manifest.plugins.length\n const installedCount = installedPlugins.filter(\n plugin =>\n plugin.source.type === 'marketplace' &&\n 'marketplace' in plugin.source &&\n plugin.source.marketplace === marketplace.name,\n ).length\n\n // Get source path display\n let sourcePath = ''\n if (marketplace.source.type === 'github') {\n sourcePath = marketplace.source.repo\n } else if (marketplace.source.type === 'url') {\n sourcePath = marketplace.source.url\n } else if (marketplace.source.type === 'local') {\n sourcePath = marketplace.source.path\n }\n\n return {\n name: marketplace.name,\n source: sourcePath,\n availableCount,\n installedCount,\n }\n })\n\n setMarketplaceStats(stats)\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }\n\n const handleSelectMarketplace = (value: string) => {\n onNavigate({\n screen: 'plugin-browser',\n marketplace: value,\n })\n }\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading marketplaces...</Text>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Error</Text>\n <Text>{error}</Text>\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Build options for Select component\n const options: Option[] = marketplaceStats.map(stat => ({\n label: stat.name,\n value: stat.name,\n }))\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold color={theme.primary}>\n Select Plugin Marketplace\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {marketplaceStats.map(stat => (\n <Box key={stat.name} flexDirection=\"column\" marginBottom={1}>\n <Text>\n <Text bold color={theme.success}>\n {stat.name}\n </Text>\n </Text>\n <Box marginLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>\n {stat.availableCount} plugins available \u00B7 {stat.installedCount}{' '}\n already installed \u00B7 {stat.source}\n </Text>\n </Box>\n </Box>\n ))}\n </Box>\n\n <Box marginTop={1}>\n <Select\n options={options}\n onChange={handleSelectMarketplace}\n visibleOptionCount={Math.min(options.length, 10)}\n />\n </Box>\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2191\u2193: Navigate \u00B7 Enter: Select \u00B7 Esc: Back\n </Text>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { Box, Text, useInput } from "ink";
|
|
3
3
|
import { getTheme } from "../../utils/theme.js";
|
|
4
|
+
import { SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
4
5
|
const PlaceholderScreen = ({
|
|
5
6
|
state,
|
|
6
7
|
onBack
|
|
@@ -20,8 +21,8 @@ const PlaceholderScreen = ({
|
|
|
20
21
|
padding: 1
|
|
21
22
|
},
|
|
22
23
|
/* @__PURE__ */ React.createElement(Box, { marginBottom: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Placeholder: ", state.screen)),
|
|
23
|
-
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
24
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
24
|
+
/* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "This screen is under construction."), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Screen state: ", JSON.stringify(state, null, 2))),
|
|
25
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Esc to go back"))
|
|
25
26
|
);
|
|
26
27
|
};
|
|
27
28
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/plugin/PlaceholderScreen.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Placeholder Screen Component\n *\n * Temporary component used for screens not yet implemented.\n * Displays the screen name and provides navigation back.\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport type { NavigationProps, PluginUIState } from './types'\n\ninterface PlaceholderScreenProps extends NavigationProps {\n state: PluginUIState\n}\n\nexport const PlaceholderScreen: React.FC<PlaceholderScreenProps> = ({\n state,\n onBack,\n}) => {\n const theme = getTheme()\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n Placeholder: {state.screen}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginY={1}>\n <Text
|
|
5
|
-
"mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;
|
|
4
|
+
"sourcesContent": ["/**\n * Placeholder Screen Component\n *\n * Temporary component used for screens not yet implemented.\n * Displays the screen name and provides navigation back.\n */\n\nimport React from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport type { NavigationProps, PluginUIState } from './types'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ninterface PlaceholderScreenProps extends NavigationProps {\n state: PluginUIState\n}\n\nexport const PlaceholderScreen: React.FC<PlaceholderScreenProps> = ({\n state,\n onBack,\n}) => {\n const theme = getTheme()\n\n useInput((input, key) => {\n if (key.escape) {\n onBack()\n }\n })\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.primary}\n padding={1}\n >\n <Box marginBottom={1}>\n <Text bold color={theme.primary}>\n Placeholder: {state.screen}\n </Text>\n </Box>\n\n <Box flexDirection=\"column\" marginY={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n This screen is under construction.\n </Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Screen state: {JSON.stringify(state, null, 2)}\n </Text>\n </Box>\n\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>Esc to go back</Text>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "AAOA,OAAO,WAAW;AAClB,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AAEzB,SAAS,uBAAuB;AAMzB,MAAM,oBAAsD,CAAC;AAAA,EAClE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AAEvB,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,IAAI,QAAQ;AACd,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAa,MAAM;AAAA,MACnB,SAAS;AAAA;AAAA,IAET,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,MAAC,OAAO,MAAM,WAAS,iBACjB,MAAM,MACtB,CACF;AAAA,IAEA,oCAAC,OAAI,eAAc,UAAS,SAAS,KACnC,oCAAC,QAAK,OAAO,gBAAgB,OAAK,oCAElC,GACA,oCAAC,QAAK,OAAO,gBAAgB,OAAK,kBACjB,KAAK,UAAU,OAAO,MAAM,CAAC,CAC9C,CACF;AAAA,IAEA,oCAAC,OAAI,WAAW,KACd,oCAAC,QAAK,OAAO,gBAAgB,OAAK,gBAAc,CAClD;AAAA,EACF;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -3,6 +3,7 @@ import { Box, Text, useInput } from "ink";
|
|
|
3
3
|
import { getTheme } from "../../utils/theme.js";
|
|
4
4
|
import { getMarketplace } from "../../utils/marketplaceManager.js";
|
|
5
5
|
import { loadAllPlugins } from "../../utils/pluginLoader.js";
|
|
6
|
+
import { SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
6
7
|
const PluginBrowser = ({
|
|
7
8
|
marketplace,
|
|
8
9
|
onNavigate,
|
|
@@ -104,7 +105,7 @@ const PluginBrowser = ({
|
|
|
104
105
|
},
|
|
105
106
|
/* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Error"),
|
|
106
107
|
/* @__PURE__ */ React.createElement(Text, null, error),
|
|
107
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
108
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press Esc to go back"))
|
|
108
109
|
);
|
|
109
110
|
}
|
|
110
111
|
if (plugins.length === 0) {
|
|
@@ -118,8 +119,8 @@ const PluginBrowser = ({
|
|
|
118
119
|
paddingY: 1
|
|
119
120
|
},
|
|
120
121
|
/* @__PURE__ */ React.createElement(Text, { bold: true }, marketplace, " \u203A Install plugins"),
|
|
121
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
122
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
122
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "No plugins available in this marketplace")),
|
|
123
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press Esc to go back"))
|
|
123
124
|
);
|
|
124
125
|
}
|
|
125
126
|
const truncate = (text, maxLength) => {
|
|
@@ -153,7 +154,7 @@ const PluginBrowser = ({
|
|
|
153
154
|
}
|
|
154
155
|
);
|
|
155
156
|
})),
|
|
156
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, selectedPlugins.size > 0 && /* @__PURE__ */ React.createElement(Text, { color: theme.success }, selectedPlugins.size, " plugin", selectedPlugins.size > 1 ? "s" : "", " ", "selected"), /* @__PURE__ */ React.createElement(Text, {
|
|
157
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, selectedPlugins.size > 0 && /* @__PURE__ */ React.createElement(Text, { color: theme.success }, selectedPlugins.size, " plugin", selectedPlugins.size > 1 ? "s" : "", " ", "selected"), /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Space: (de)select \xB7 Enter: details \xB7 \u2191\u2193: navigate \xB7 Esc: back"))
|
|
157
158
|
);
|
|
158
159
|
};
|
|
159
160
|
const PluginListItem = ({
|
|
@@ -174,7 +175,7 @@ const PluginListItem = ({
|
|
|
174
175
|
if (isInstalled) {
|
|
175
176
|
infoItems.push("(installed)");
|
|
176
177
|
}
|
|
177
|
-
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 0 }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : void 0 }, isFocused ? "\u276F " : " "), /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : void 0 }, isSelected ? "\u25C9" : "\u25EF", " "), /* @__PURE__ */ React.createElement(Text, { bold: isFocused, color: isInstalled ? theme.dimColor : void 0 }, plugin.name), infoItems.length > 0 && /* @__PURE__ */ React.createElement(Text, {
|
|
178
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginBottom: 0 }, /* @__PURE__ */ React.createElement(Box, null, /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : void 0 }, isFocused ? "\u276F " : " "), /* @__PURE__ */ React.createElement(Text, { color: isFocused ? theme.success : void 0 }, isSelected ? "\u25C9" : "\u25EF", " "), /* @__PURE__ */ React.createElement(Text, { bold: isFocused, color: isInstalled ? theme.dimColor : void 0 }, plugin.name), infoItems.length > 0 && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " ", infoItems.join(" "))), plugin.description && /* @__PURE__ */ React.createElement(Box, { marginLeft: 4 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, truncate(plugin.description, 70))));
|
|
178
179
|
};
|
|
179
180
|
export {
|
|
180
181
|
PluginBrowser
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/plugin/PluginBrowser.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Plugin Browser Component\n *\n * Browse and select plugins from a marketplace with multi-select support\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { getMarketplace } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { MarketplacePlugin } from '../../types/marketplace'\nimport { NavigationProps } from './types'\n\ninterface PluginBrowserProps extends NavigationProps {\n marketplace: string\n}\n\nexport const PluginBrowser: React.FC<PluginBrowserProps> = ({\n marketplace,\n onNavigate,\n onBack,\n}) => {\n const theme = getTheme()\n const [plugins, setPlugins] = useState<MarketplacePlugin[]>([])\n const [installedPlugins, setInstalledPlugins] = useState<Set<string>>(\n new Set(),\n )\n const [selectedPlugins, setSelectedPlugins] = useState<Set<string>>(new Set())\n const [focusedIndex, setFocusedIndex] = useState(0)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n loadPluginData()\n }, [marketplace])\n\n const loadPluginData = () => {\n try {\n setLoading(true)\n setError(null)\n\n // Load marketplace\n const marketplaceData = getMarketplace(marketplace)\n if (!marketplaceData) {\n setError(`Marketplace \"${marketplace}\" not found`)\n setLoading(false)\n return\n }\n\n // Load plugins from marketplace\n const marketplacePlugins = marketplaceData.manifest.plugins\n setPlugins(marketplacePlugins)\n\n // Load installed plugins to show which are already installed\n const installed = loadAllPlugins()\n const installedNames = new Set(\n installed\n .filter(\n p =>\n p.source.type === 'marketplace' &&\n 'marketplace' in p.source &&\n p.source.marketplace === marketplace,\n )\n .map(p => p.manifest.name),\n )\n setInstalledPlugins(installedNames)\n\n // Focus first plugin if available\n if (marketplacePlugins.length > 0) {\n setFocusedIndex(0)\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }\n\n const focusedPlugin = plugins[focusedIndex]\n\n // Keyboard input handling\n useInput(\n (input, key) => {\n if (loading || plugins.length === 0) return\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setFocusedIndex(prev => (prev > 0 ? prev - 1 : plugins.length - 1))\n } else if (key.downArrow) {\n setFocusedIndex(prev => (prev < plugins.length - 1 ? prev + 1 : 0))\n } else if (input === ' ') {\n // Toggle selection with Space\n const pluginName = focusedPlugin.name\n setSelectedPlugins(prev => {\n const newSet = new Set(prev)\n if (newSet.has(pluginName)) {\n newSet.delete(pluginName)\n } else {\n newSet.add(pluginName)\n }\n return newSet\n })\n } else if (key.return) {\n // View details on Enter\n onNavigate({\n screen: 'plugin-details-install',\n marketplace,\n plugin: focusedPlugin.name,\n })\n }\n },\n { isActive: !loading && plugins.length > 0 },\n )\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading plugins from {marketplace}...</Text>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Error</Text>\n <Text>{error}</Text>\n <Box marginTop={1}>\n <Text
|
|
5
|
-
"mappings": "AAMA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;
|
|
4
|
+
"sourcesContent": ["/**\n * Plugin Browser Component\n *\n * Browse and select plugins from a marketplace with multi-select support\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getTheme } from '@utils/theme'\nimport { getMarketplace } from '@utils/marketplaceManager'\nimport { loadAllPlugins } from '@utils/pluginLoader'\nimport { MarketplacePlugin } from '../../types/marketplace'\nimport { NavigationProps } from './types'\nimport { SEMANTIC_COLORS } from '@constants/colors'\n\ninterface PluginBrowserProps extends NavigationProps {\n marketplace: string\n}\n\nexport const PluginBrowser: React.FC<PluginBrowserProps> = ({\n marketplace,\n onNavigate,\n onBack,\n}) => {\n const theme = getTheme()\n const [plugins, setPlugins] = useState<MarketplacePlugin[]>([])\n const [installedPlugins, setInstalledPlugins] = useState<Set<string>>(\n new Set(),\n )\n const [selectedPlugins, setSelectedPlugins] = useState<Set<string>>(new Set())\n const [focusedIndex, setFocusedIndex] = useState(0)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n loadPluginData()\n }, [marketplace])\n\n const loadPluginData = () => {\n try {\n setLoading(true)\n setError(null)\n\n // Load marketplace\n const marketplaceData = getMarketplace(marketplace)\n if (!marketplaceData) {\n setError(`Marketplace \"${marketplace}\" not found`)\n setLoading(false)\n return\n }\n\n // Load plugins from marketplace\n const marketplacePlugins = marketplaceData.manifest.plugins\n setPlugins(marketplacePlugins)\n\n // Load installed plugins to show which are already installed\n const installed = loadAllPlugins()\n const installedNames = new Set(\n installed\n .filter(\n p =>\n p.source.type === 'marketplace' &&\n 'marketplace' in p.source &&\n p.source.marketplace === marketplace,\n )\n .map(p => p.manifest.name),\n )\n setInstalledPlugins(installedNames)\n\n // Focus first plugin if available\n if (marketplacePlugins.length > 0) {\n setFocusedIndex(0)\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err))\n } finally {\n setLoading(false)\n }\n }\n\n const focusedPlugin = plugins[focusedIndex]\n\n // Keyboard input handling\n useInput(\n (input, key) => {\n if (loading || plugins.length === 0) return\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setFocusedIndex(prev => (prev > 0 ? prev - 1 : plugins.length - 1))\n } else if (key.downArrow) {\n setFocusedIndex(prev => (prev < plugins.length - 1 ? prev + 1 : 0))\n } else if (input === ' ') {\n // Toggle selection with Space\n const pluginName = focusedPlugin.name\n setSelectedPlugins(prev => {\n const newSet = new Set(prev)\n if (newSet.has(pluginName)) {\n newSet.delete(pluginName)\n } else {\n newSet.add(pluginName)\n }\n return newSet\n })\n } else if (key.return) {\n // View details on Enter\n onNavigate({\n screen: 'plugin-details-install',\n marketplace,\n plugin: focusedPlugin.name,\n })\n }\n },\n { isActive: !loading && plugins.length > 0 },\n )\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading plugins from {marketplace}...</Text>\n </Box>\n )\n }\n\n if (error) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Error</Text>\n <Text>{error}</Text>\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n if (plugins.length === 0) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold>{marketplace} \u203A Install plugins</Text>\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n No plugins available in this marketplace\n </Text>\n </Box>\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Helper to truncate text\n const truncate = (text: string, maxLength: number): string => {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength - 3) + '...'\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold color={theme.primary}>\n {marketplace} \u203A Install plugins\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\">\n {plugins.map((plugin, index) => {\n const isFocused = index === focusedIndex\n const isSelected = selectedPlugins.has(plugin.name)\n const isInstalled = installedPlugins.has(plugin.name)\n\n return (\n <PluginListItem\n key={plugin.name}\n plugin={plugin}\n isFocused={isFocused}\n isSelected={isSelected}\n isInstalled={isInstalled}\n theme={theme}\n truncate={truncate}\n />\n )\n })}\n </Box>\n\n <Box marginTop={1} flexDirection=\"column\">\n {selectedPlugins.size > 0 && (\n <Text color={theme.success}>\n {selectedPlugins.size} plugin{selectedPlugins.size > 1 ? 's' : ''}{' '}\n selected\n </Text>\n )}\n <Text color={SEMANTIC_COLORS.dim}>\n Space: (de)select \u00B7 Enter: details \u00B7 \u2191\u2193: navigate \u00B7 Esc: back\n </Text>\n </Box>\n </Box>\n )\n}\n\ninterface PluginListItemProps {\n plugin: MarketplacePlugin\n isFocused: boolean\n isSelected: boolean\n isInstalled: boolean\n theme: any\n truncate: (text: string, maxLength: number) => string\n}\n\nconst PluginListItem: React.FC<PluginListItemProps> = ({\n plugin,\n isFocused,\n isSelected,\n isInstalled,\n theme,\n truncate,\n}) => {\n // Build plugin info line\n const infoItems: string[] = []\n if (plugin.version) {\n infoItems.push(`v${plugin.version}`)\n }\n if (plugin.category) {\n infoItems.push(`[${plugin.category}]`)\n }\n if (isInstalled) {\n infoItems.push('(installed)')\n }\n\n return (\n <Box flexDirection=\"column\" marginBottom={0}>\n <Box>\n <Text color={isFocused ? theme.success : undefined}>\n {isFocused ? '\u276F ' : ' '}\n </Text>\n <Text color={isFocused ? theme.success : undefined}>\n {isSelected ? '\u25C9' : '\u25EF'}{' '}\n </Text>\n <Text bold={isFocused} color={isInstalled ? theme.dimColor : undefined}>\n {plugin.name}\n </Text>\n {infoItems.length > 0 && (\n <Text color={SEMANTIC_COLORS.dim}> {infoItems.join(' ')}</Text>\n )}\n </Box>\n {plugin.description && (\n <Box marginLeft={4}>\n <Text color={SEMANTIC_COLORS.dim}>\n {truncate(plugin.description, 70)}\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
getMarketplace,
|
|
7
7
|
installPluginFromMarketplace
|
|
8
8
|
} from "../../utils/marketplaceManager.js";
|
|
9
|
+
import { SEMANTIC_COLORS } from "../../constants/colors.js";
|
|
9
10
|
import { formatAuthor } from "./utils.js";
|
|
10
11
|
import { spawn } from "child_process";
|
|
11
12
|
const PluginDetailsInstall = ({
|
|
@@ -103,8 +104,8 @@ const PluginDetailsInstall = ({
|
|
|
103
104
|
paddingY: 1
|
|
104
105
|
},
|
|
105
106
|
/* @__PURE__ */ React.createElement(Text, { color: theme.error }, "Plugin not found"),
|
|
106
|
-
/* @__PURE__ */ React.createElement(Text, {
|
|
107
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
107
|
+
/* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, 'Plugin "', plugin, '" not found in marketplace "', marketplace, '"'),
|
|
108
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Press Esc to go back"))
|
|
108
109
|
);
|
|
109
110
|
}
|
|
110
111
|
const actions = [{ label: "Install now", value: "install" }];
|
|
@@ -137,7 +138,7 @@ const PluginDetailsInstall = ({
|
|
|
137
138
|
paddingY: 1
|
|
138
139
|
},
|
|
139
140
|
/* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Plugin Details"),
|
|
140
|
-
/* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column", gap: 0 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.success }, pluginData.name), pluginData.version && /* @__PURE__ */ React.createElement(Text, {
|
|
141
|
+
/* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column", gap: 0 }, /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.success }, pluginData.name), pluginData.version && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " v", pluginData.version), pluginData.category && /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, " [", pluginData.category, "]")), pluginData.description && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, null, pluginData.description)), pluginData.author && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "By: ", formatAuthor(pluginData.author))), pluginData.license && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "License: ", pluginData.license)), pluginData.homepage && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Homepage: ", pluginData.homepage)), pluginData.repository && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Repository: ", pluginData.repository)), /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Source: ", formatSource(pluginData.source))), pluginData.keywords && pluginData.keywords.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginTop: 0 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Keywords: ", pluginData.keywords.join(", "))), /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { bold: true }, "Will install:"), pluginData.agents && pluginData.agents.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Agents: ", pluginData.agents.join(", "))), pluginData.commands && pluginData.commands.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Commands: ", pluginData.commands.join(", "))), pluginData.skills && pluginData.skills.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Skills: ", pluginData.skills.join(", "))), pluginData.hooks && pluginData.hooks.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 Hooks: ", pluginData.hooks.join(", "))), pluginData.mcpServers && pluginData.mcpServers.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, "\u2022 MCP Servers: ", pluginData.mcpServers.join(", "))), !pluginData.agents?.length && !pluginData.commands?.length && !pluginData.skills?.length && !pluginData.hooks?.length && !pluginData.mcpServers?.length && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "Components will be auto-discovered from plugin directory")))),
|
|
141
142
|
installing && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, "Installing ", pluginData.name, "...")),
|
|
142
143
|
installSuccess && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "\u2713 Successfully installed ", pluginData.name)),
|
|
143
144
|
installError && /* @__PURE__ */ React.createElement(Box, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "\u2717 Installation failed"), /* @__PURE__ */ React.createElement(Text, { color: theme.error }, installError)),
|
|
@@ -149,7 +150,7 @@ const PluginDetailsInstall = ({
|
|
|
149
150
|
visibleOptionCount: Math.min(actions.length, 5)
|
|
150
151
|
}
|
|
151
152
|
)),
|
|
152
|
-
!installing && !installSuccess && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, {
|
|
153
|
+
!installing && !installSuccess && /* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { color: SEMANTIC_COLORS.dim }, "\u2191\u2193: Navigate \xB7 Enter: Select \xB7 Esc: Back"))
|
|
153
154
|
);
|
|
154
155
|
};
|
|
155
156
|
export {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/plugin/PluginDetailsInstall.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Plugin Details & Install Component\n *\n * Shows complete plugin information and installation actions\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { Option } from '@inkjs/ui'\nimport { getTheme } from '@utils/theme'\nimport {\n getMarketplace,\n installPluginFromMarketplace,\n} from '@utils/marketplaceManager'\nimport { MarketplacePlugin } from '../../types/marketplace'\nimport { NavigationProps } from './types'\nimport { formatAuthor } from './utils'\nimport { spawn } from 'child_process'\n\ninterface PluginDetailsInstallProps extends NavigationProps {\n marketplace: string\n plugin: string\n}\n\nexport const PluginDetailsInstall: React.FC<PluginDetailsInstallProps> = ({\n marketplace,\n plugin,\n onNavigate,\n onBack,\n onDone,\n}) => {\n const theme = getTheme()\n const [pluginData, setPluginData] = useState<MarketplacePlugin | null>(null)\n const [installing, setInstalling] = useState(false)\n const [installError, setInstallError] = useState<string | null>(null)\n const [installSuccess, setInstallSuccess] = useState(false)\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n loadPluginDetails()\n }, [marketplace, plugin])\n\n const loadPluginDetails = () => {\n try {\n setLoading(true)\n\n const marketplaceData = getMarketplace(marketplace)\n if (!marketplaceData) {\n setPluginData(null)\n setLoading(false)\n return\n }\n\n const pluginInfo = marketplaceData.manifest.plugins.find(\n p => p.name === plugin,\n )\n setPluginData(pluginInfo || null)\n } catch (err) {\n console.error('Error loading plugin details:', err)\n setPluginData(null)\n } finally {\n setLoading(false)\n }\n }\n\n const handleInstall = async () => {\n if (!pluginData) return\n\n setInstalling(true)\n setInstallError(null)\n setInstallSuccess(false)\n\n try {\n // Install the plugin\n const installPath = await installPluginFromMarketplace(\n plugin,\n marketplace,\n )\n\n setInstallSuccess(true)\n setInstalling(false)\n\n // Auto-navigate back after short delay to show success message\n setTimeout(() => {\n onBack()\n }, 1500)\n } catch (error) {\n setInstalling(false)\n setInstallError(error instanceof Error ? error.message : String(error))\n }\n }\n\n const handleOpenHomepage = () => {\n if (!pluginData?.homepage) return\n\n // Open URL in default browser\n const url = pluginData.homepage\n const command =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'start'\n : 'xdg-open'\n\n spawn(command, [url], { detached: true, stdio: 'ignore' }).unref()\n }\n\n const handleAction = (value: string) => {\n if (value === 'install') {\n handleInstall()\n } else if (value === 'homepage') {\n handleOpenHomepage()\n } else if (value === 'back') {\n onBack()\n }\n }\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading plugin details...</Text>\n </Box>\n )\n }\n\n if (!pluginData) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Plugin not found</Text>\n <Text dimColor>\n Plugin \"{plugin}\" not found in marketplace \"{marketplace}\"\n </Text>\n <Box marginTop={1}>\n <Text dimColor>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Build action menu\n const actions: Option[] = [{ label: 'Install now', value: 'install' }]\n\n if (pluginData.homepage) {\n actions.push({ label: 'Open homepage', value: 'homepage' })\n }\n\n actions.push({ label: 'Back to plugin list', value: 'back' })\n\n // Helper to format source\n const formatSource = (source: any): string => {\n if (typeof source === 'string') {\n return `Relative: ${source}`\n }\n if (source.source === 'github') {\n return `GitHub: ${source.repo}${source.ref ? `@${source.ref}` : ''}`\n }\n if (source.source === 'url') {\n return `URL: ${source.url}`\n }\n if (source.source === 'local') {\n return `Local: ${source.path}`\n }\n return 'Unknown'\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold color={theme.primary}>\n Plugin Details\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\" gap={0}>\n {/* Plugin name and version */}\n <Text>\n <Text bold color={theme.success}>\n {pluginData.name}\n </Text>\n {pluginData.version && <Text dimColor> v{pluginData.version}</Text>}\n {pluginData.category && (\n <Text dimColor> [{pluginData.category}]</Text>\n )}\n </Text>\n\n {/* Description */}\n {pluginData.description && (\n <Box marginTop={0}>\n <Text>{pluginData.description}</Text>\n </Box>\n )}\n\n {/* Author */}\n {pluginData.author && (\n <Box marginTop={0}>\n <Text dimColor>By: {formatAuthor(pluginData.author)}</Text>\n </Box>\n )}\n\n {/* License */}\n {pluginData.license && (\n <Box marginTop={0}>\n <Text dimColor>License: {pluginData.license}</Text>\n </Box>\n )}\n\n {/* Homepage */}\n {pluginData.homepage && (\n <Box marginTop={0}>\n <Text dimColor>Homepage: {pluginData.homepage}</Text>\n </Box>\n )}\n\n {/* Repository */}\n {pluginData.repository && (\n <Box marginTop={0}>\n <Text dimColor>Repository: {pluginData.repository}</Text>\n </Box>\n )}\n\n {/* Source */}\n <Box marginTop={0}>\n <Text dimColor>Source: {formatSource(pluginData.source)}</Text>\n </Box>\n\n {/* Keywords/Tags */}\n {pluginData.keywords && pluginData.keywords.length > 0 && (\n <Box marginTop={0}>\n <Text dimColor>Keywords: {pluginData.keywords.join(', ')}</Text>\n </Box>\n )}\n\n {/* Components */}\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Will install:</Text>\n {pluginData.agents && pluginData.agents.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Agents: {pluginData.agents.join(', ')}</Text>\n </Box>\n )}\n {pluginData.commands && pluginData.commands.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Commands: {pluginData.commands.join(', ')}</Text>\n </Box>\n )}\n {pluginData.skills && pluginData.skills.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Skills: {pluginData.skills.join(', ')}</Text>\n </Box>\n )}\n {pluginData.hooks && pluginData.hooks.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Hooks: {pluginData.hooks.join(', ')}</Text>\n </Box>\n )}\n {pluginData.mcpServers && pluginData.mcpServers.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 MCP Servers: {pluginData.mcpServers.join(', ')}</Text>\n </Box>\n )}\n {!pluginData.agents?.length &&\n !pluginData.commands?.length &&\n !pluginData.skills?.length &&\n !pluginData.hooks?.length &&\n !pluginData.mcpServers?.length && (\n <Box marginLeft={2}>\n <Text dimColor>\n Components will be auto-discovered from plugin directory\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Installation status */}\n {installing && (\n <Box marginTop={1}>\n <Text color={theme.primary}>Installing {pluginData.name}...</Text>\n </Box>\n )}\n\n {installSuccess && (\n <Box marginTop={1}>\n <Text color={theme.success}>\n \u2713 Successfully installed {pluginData.name}\n </Text>\n </Box>\n )}\n\n {installError && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={theme.error}>\u2717 Installation failed</Text>\n <Text color={theme.error}>{installError}</Text>\n </Box>\n )}\n\n {/* Action menu */}\n {!installing && !installSuccess && (\n <Box marginTop={1}>\n <Select\n options={actions}\n onChange={handleAction}\n visibleOptionCount={Math.min(actions.length, 5)}\n />\n </Box>\n )}\n\n {/* Help text */}\n {!installing && !installSuccess && (\n <Box marginTop={1}>\n <Text dimColor>\u2191\u2193: Navigate \u00B7 Enter: Select \u00B7 Esc: Back</Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
|
|
5
|
-
"mappings": "AAMA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,YAAY;AAC1B,SAAS,cAAc;AAEvB,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,OACK;
|
|
4
|
+
"sourcesContent": ["/**\n * Plugin Details & Install Component\n *\n * Shows complete plugin information and installation actions\n */\n\nimport React, { useState, useEffect } from 'react'\nimport { Box, Text } from 'ink'\nimport { Select } from '@components/CustomSelect/select'\nimport { Option } from '@inkjs/ui'\nimport { getTheme } from '@utils/theme'\nimport {\n getMarketplace,\n installPluginFromMarketplace,\n} from '@utils/marketplaceManager'\nimport { SEMANTIC_COLORS } from '@constants/colors'\nimport { MarketplacePlugin } from '../../types/marketplace'\nimport { NavigationProps } from './types'\nimport { formatAuthor } from './utils'\nimport { spawn } from 'child_process'\n\ninterface PluginDetailsInstallProps extends NavigationProps {\n marketplace: string\n plugin: string\n}\n\nexport const PluginDetailsInstall: React.FC<PluginDetailsInstallProps> = ({\n marketplace,\n plugin,\n onNavigate,\n onBack,\n onDone,\n}) => {\n const theme = getTheme()\n const [pluginData, setPluginData] = useState<MarketplacePlugin | null>(null)\n const [installing, setInstalling] = useState(false)\n const [installError, setInstallError] = useState<string | null>(null)\n const [installSuccess, setInstallSuccess] = useState(false)\n const [loading, setLoading] = useState(true)\n\n useEffect(() => {\n loadPluginDetails()\n }, [marketplace, plugin])\n\n const loadPluginDetails = () => {\n try {\n setLoading(true)\n\n const marketplaceData = getMarketplace(marketplace)\n if (!marketplaceData) {\n setPluginData(null)\n setLoading(false)\n return\n }\n\n const pluginInfo = marketplaceData.manifest.plugins.find(\n p => p.name === plugin,\n )\n setPluginData(pluginInfo || null)\n } catch (err) {\n console.error('Error loading plugin details:', err)\n setPluginData(null)\n } finally {\n setLoading(false)\n }\n }\n\n const handleInstall = async () => {\n if (!pluginData) return\n\n setInstalling(true)\n setInstallError(null)\n setInstallSuccess(false)\n\n try {\n // Install the plugin\n const installPath = await installPluginFromMarketplace(\n plugin,\n marketplace,\n )\n\n setInstallSuccess(true)\n setInstalling(false)\n\n // Auto-navigate back after short delay to show success message\n setTimeout(() => {\n onBack()\n }, 1500)\n } catch (error) {\n setInstalling(false)\n setInstallError(error instanceof Error ? error.message : String(error))\n }\n }\n\n const handleOpenHomepage = () => {\n if (!pluginData?.homepage) return\n\n // Open URL in default browser\n const url = pluginData.homepage\n const command =\n process.platform === 'darwin'\n ? 'open'\n : process.platform === 'win32'\n ? 'start'\n : 'xdg-open'\n\n spawn(command, [url], { detached: true, stdio: 'ignore' }).unref()\n }\n\n const handleAction = (value: string) => {\n if (value === 'install') {\n handleInstall()\n } else if (value === 'homepage') {\n handleOpenHomepage()\n } else if (value === 'back') {\n onBack()\n }\n }\n\n if (loading) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.primary}>Loading plugin details...</Text>\n </Box>\n )\n }\n\n if (!pluginData) {\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.error}\n paddingX={2}\n paddingY={1}\n >\n <Text color={theme.error}>Plugin not found</Text>\n <Text color={SEMANTIC_COLORS.dim}>\n Plugin \"{plugin}\" not found in marketplace \"{marketplace}\"\n </Text>\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>Press Esc to go back</Text>\n </Box>\n </Box>\n )\n }\n\n // Build action menu\n const actions: Option[] = [{ label: 'Install now', value: 'install' }]\n\n if (pluginData.homepage) {\n actions.push({ label: 'Open homepage', value: 'homepage' })\n }\n\n actions.push({ label: 'Back to plugin list', value: 'back' })\n\n // Helper to format source\n const formatSource = (source: any): string => {\n if (typeof source === 'string') {\n return `Relative: ${source}`\n }\n if (source.source === 'github') {\n return `GitHub: ${source.repo}${source.ref ? `@${source.ref}` : ''}`\n }\n if (source.source === 'url') {\n return `URL: ${source.url}`\n }\n if (source.source === 'local') {\n return `Local: ${source.path}`\n }\n return 'Unknown'\n }\n\n return (\n <Box\n flexDirection=\"column\"\n borderStyle=\"round\"\n borderColor={theme.secondaryBorder}\n paddingX={2}\n paddingY={1}\n >\n <Text bold color={theme.primary}>\n Plugin Details\n </Text>\n\n <Box marginTop={1} flexDirection=\"column\" gap={0}>\n {/* Plugin name and version */}\n <Text>\n <Text bold color={theme.success}>\n {pluginData.name}\n </Text>\n {pluginData.version && (\n <Text color={SEMANTIC_COLORS.dim}> v{pluginData.version}</Text>\n )}\n {pluginData.category && (\n <Text color={SEMANTIC_COLORS.dim}> [{pluginData.category}]</Text>\n )}\n </Text>\n\n {/* Description */}\n {pluginData.description && (\n <Box marginTop={0}>\n <Text>{pluginData.description}</Text>\n </Box>\n )}\n\n {/* Author */}\n {pluginData.author && (\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n By: {formatAuthor(pluginData.author)}\n </Text>\n </Box>\n )}\n\n {/* License */}\n {pluginData.license && (\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n License: {pluginData.license}\n </Text>\n </Box>\n )}\n\n {/* Homepage */}\n {pluginData.homepage && (\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n Homepage: {pluginData.homepage}\n </Text>\n </Box>\n )}\n\n {/* Repository */}\n {pluginData.repository && (\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n Repository: {pluginData.repository}\n </Text>\n </Box>\n )}\n\n {/* Source */}\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n Source: {formatSource(pluginData.source)}\n </Text>\n </Box>\n\n {/* Keywords/Tags */}\n {pluginData.keywords && pluginData.keywords.length > 0 && (\n <Box marginTop={0}>\n <Text color={SEMANTIC_COLORS.dim}>\n Keywords: {pluginData.keywords.join(', ')}\n </Text>\n </Box>\n )}\n\n {/* Components */}\n <Box marginTop={1} flexDirection=\"column\">\n <Text bold>Will install:</Text>\n {pluginData.agents && pluginData.agents.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Agents: {pluginData.agents.join(', ')}</Text>\n </Box>\n )}\n {pluginData.commands && pluginData.commands.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Commands: {pluginData.commands.join(', ')}</Text>\n </Box>\n )}\n {pluginData.skills && pluginData.skills.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Skills: {pluginData.skills.join(', ')}</Text>\n </Box>\n )}\n {pluginData.hooks && pluginData.hooks.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 Hooks: {pluginData.hooks.join(', ')}</Text>\n </Box>\n )}\n {pluginData.mcpServers && pluginData.mcpServers.length > 0 && (\n <Box marginLeft={2}>\n <Text>\u2022 MCP Servers: {pluginData.mcpServers.join(', ')}</Text>\n </Box>\n )}\n {!pluginData.agents?.length &&\n !pluginData.commands?.length &&\n !pluginData.skills?.length &&\n !pluginData.hooks?.length &&\n !pluginData.mcpServers?.length && (\n <Box marginLeft={2}>\n <Text color={SEMANTIC_COLORS.dim}>\n Components will be auto-discovered from plugin directory\n </Text>\n </Box>\n )}\n </Box>\n </Box>\n\n {/* Installation status */}\n {installing && (\n <Box marginTop={1}>\n <Text color={theme.primary}>Installing {pluginData.name}...</Text>\n </Box>\n )}\n\n {installSuccess && (\n <Box marginTop={1}>\n <Text color={theme.success}>\n \u2713 Successfully installed {pluginData.name}\n </Text>\n </Box>\n )}\n\n {installError && (\n <Box marginTop={1} flexDirection=\"column\">\n <Text color={theme.error}>\u2717 Installation failed</Text>\n <Text color={theme.error}>{installError}</Text>\n </Box>\n )}\n\n {/* Action menu */}\n {!installing && !installSuccess && (\n <Box marginTop={1}>\n <Select\n options={actions}\n onChange={handleAction}\n visibleOptionCount={Math.min(actions.length, 5)}\n />\n </Box>\n )}\n\n {/* Help text */}\n {!installing && !installSuccess && (\n <Box marginTop={1}>\n <Text color={SEMANTIC_COLORS.dim}>\n \u2191\u2193: Navigate \u00B7 Enter: Select \u00B7 Esc: Back\n </Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|