@within-7/minto 0.1.5 → 0.1.7
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/dist/commands/agents/AgentsCommand.js +2342 -0
- package/dist/commands/agents/AgentsCommand.js.map +7 -0
- package/dist/commands/agents/constants.js +58 -0
- package/dist/commands/agents/constants.js.map +7 -0
- package/dist/commands/agents/index.js +37 -0
- package/dist/commands/agents/index.js.map +7 -0
- package/dist/commands/agents/types.js +10 -0
- package/dist/commands/agents/types.js.map +7 -0
- package/dist/commands/agents/utils/fileOperations.js +185 -0
- package/dist/commands/agents/utils/fileOperations.js.map +7 -0
- package/dist/commands/agents/utils/index.js +21 -0
- package/dist/commands/agents/utils/index.js.map +7 -0
- package/dist/commands/bug.js +2 -2
- package/dist/commands/bug.js.map +2 -2
- package/dist/commands/compact.js +5 -5
- package/dist/commands/compact.js.map +2 -2
- package/dist/commands/ctx_viz.js +55 -22
- package/dist/commands/ctx_viz.js.map +2 -2
- package/dist/commands/mcp-interactive.js +11 -11
- package/dist/commands/mcp-interactive.js.map +2 -2
- package/dist/commands/model.js +94 -32
- package/dist/commands/model.js.map +3 -3
- package/dist/commands/plugin/AddMarketplaceForm.js +49 -21
- package/dist/commands/plugin/AddMarketplaceForm.js.map +2 -2
- package/dist/commands/plugin/ConfirmDialog.js +38 -26
- package/dist/commands/plugin/ConfirmDialog.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js +24 -8
- package/dist/commands/plugin/InstalledPluginsByMarketplace.js.map +2 -2
- package/dist/commands/plugin/InstalledPluginsManager.js +3 -1
- package/dist/commands/plugin/InstalledPluginsManager.js.map +2 -2
- package/dist/commands/plugin/MainMenu.js +16 -7
- package/dist/commands/plugin/MainMenu.js.map +2 -2
- package/dist/commands/plugin/MarketplaceManager.js +84 -39
- package/dist/commands/plugin/MarketplaceManager.js.map +2 -2
- package/dist/commands/plugin/MarketplaceSelector.js +7 -3
- package/dist/commands/plugin/MarketplaceSelector.js.map +2 -2
- package/dist/commands/plugin/PlaceholderScreen.js +16 -2
- package/dist/commands/plugin/PlaceholderScreen.js.map +2 -2
- package/dist/commands/plugin/PluginBrowser.js +4 -2
- package/dist/commands/plugin/PluginBrowser.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsInstall.js +12 -6
- package/dist/commands/plugin/PluginDetailsInstall.js.map +2 -2
- package/dist/commands/plugin/PluginDetailsManage.js +14 -5
- package/dist/commands/plugin/PluginDetailsManage.js.map +2 -2
- package/dist/commands/plugin/example-usage.js.map +2 -2
- package/dist/commands/plugin/utils.js.map +2 -2
- package/dist/commands/plugin.js +226 -46
- package/dist/commands/plugin.js.map +2 -2
- package/dist/commands/refreshCommands.js +6 -3
- package/dist/commands/refreshCommands.js.map +2 -2
- package/dist/commands/resume.js +2 -1
- package/dist/commands/resume.js.map +2 -2
- package/dist/commands/setup.js +19 -5
- package/dist/commands/setup.js.map +2 -2
- package/dist/commands/terminalSetup.js +2 -2
- package/dist/commands/terminalSetup.js.map +1 -1
- package/dist/commands.js +14 -30
- package/dist/commands.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/AskUserQuestionDialog.js.map +2 -2
- package/dist/components/AskUserQuestionDialog/QuestionView.js +10 -1
- package/dist/components/AskUserQuestionDialog/QuestionView.js.map +2 -2
- package/dist/components/BackgroundTasksPanel.js +5 -1
- package/dist/components/BackgroundTasksPanel.js.map +2 -2
- package/dist/components/Config.js +17 -4
- package/dist/components/Config.js.map +2 -2
- package/dist/components/ConsoleOAuthFlow.js.map +2 -2
- package/dist/components/CustomSelect/select-option.js +4 -1
- package/dist/components/CustomSelect/select-option.js.map +2 -2
- package/dist/components/Help.js +6 -8
- package/dist/components/Help.js.map +2 -2
- package/dist/components/Logo.js +1 -1
- package/dist/components/Logo.js.map +2 -2
- package/dist/components/ModelListManager.js.map +2 -2
- package/dist/components/ModelSelector/ModelSelector.js +2030 -0
- package/dist/components/ModelSelector/ModelSelector.js.map +7 -0
- package/dist/components/ModelSelector/ScreenContainer.js +27 -0
- package/dist/components/ModelSelector/ScreenContainer.js.map +7 -0
- package/dist/components/ModelSelector/constants.js +37 -0
- package/dist/components/ModelSelector/constants.js.map +7 -0
- package/dist/components/ModelSelector/hooks/index.js +5 -0
- package/dist/components/ModelSelector/hooks/index.js.map +7 -0
- package/dist/components/ModelSelector/hooks/useEscapeNavigation.js +21 -0
- package/dist/components/ModelSelector/hooks/useEscapeNavigation.js.map +7 -0
- package/dist/components/ModelSelector/index.js +17 -0
- package/dist/components/ModelSelector/index.js.map +7 -0
- package/dist/components/ModelSelector/types.js +1 -0
- package/dist/components/ModelSelector/types.js.map +7 -0
- package/dist/components/PressEnterToContinue.js +1 -1
- package/dist/components/PressEnterToContinue.js.map +2 -2
- package/dist/components/ProjectOnboarding.js +1 -1
- package/dist/components/ProjectOnboarding.js.map +2 -2
- package/dist/components/PromptInput.js +88 -37
- package/dist/components/PromptInput.js.map +2 -2
- package/dist/components/QuitSummary.js +17 -10
- package/dist/components/QuitSummary.js.map +2 -2
- package/dist/components/SentryErrorBoundary.js.map +2 -2
- package/dist/components/StreamingBashOutput.js.map +2 -2
- package/dist/components/StructuredDiff.js.map +2 -2
- package/dist/components/SubagentProgress.js.map +2 -2
- package/dist/components/TaskCard.js.map +2 -2
- package/dist/components/TextInput.js.map +1 -1
- package/dist/components/TodoItem.js.map +1 -1
- package/dist/components/binary-feedback/BinaryFeedbackOption.js +1 -3
- package/dist/components/binary-feedback/BinaryFeedbackOption.js.map +2 -2
- package/dist/components/messages/AssistantLocalCommandOutputMessage.js.map +1 -1
- package/dist/components/messages/AssistantToolUseMessage.js +3 -1
- package/dist/components/messages/AssistantToolUseMessage.js.map +2 -2
- package/dist/components/messages/TaskProgressMessage.js.map +2 -2
- package/dist/components/messages/TaskToolMessage.js.map +2 -2
- package/dist/components/messages/UserToolResultMessage/utils.js.map +2 -2
- package/dist/components/permissions/FileEditPermissionRequest/FileEditToolDiff.js.map +2 -2
- package/dist/components/permissions/FileWritePermissionRequest/FileWriteToolDiff.js.map +2 -2
- package/dist/components/permissions/hooks.js.map +2 -2
- package/dist/constants/modelCapabilities.js +1 -1
- package/dist/constants/modelCapabilities.js.map +2 -2
- package/dist/constants/prompts.js.map +1 -1
- package/dist/constants/timing.js +34 -0
- package/dist/constants/timing.js.map +7 -0
- package/dist/entrypoints/cli.js +128 -33
- package/dist/entrypoints/cli.js.map +3 -3
- package/dist/entrypoints/mcp.js +13 -18
- package/dist/entrypoints/mcp.js.map +2 -2
- package/dist/hooks/useCanUseTool.js.map +2 -2
- package/dist/hooks/useCancelRequest.js.map +1 -1
- package/dist/hooks/useHistorySearch.js.map +2 -2
- package/dist/hooks/useLogStartupTime.js.map +2 -2
- package/dist/hooks/usePermissionRequestLogging.js.map +2 -2
- package/dist/hooks/useTextInput.js.map +1 -1
- package/dist/hooks/useUnifiedCompletion.js +493 -394
- package/dist/hooks/useUnifiedCompletion.js.map +2 -2
- package/dist/index.js.map +2 -2
- package/dist/permissions.js +4 -7
- package/dist/permissions.js.map +2 -2
- package/dist/query.js +6 -1
- package/dist/query.js.map +2 -2
- package/dist/screens/REPL.js +72 -36
- package/dist/screens/REPL.js.map +2 -2
- package/dist/screens/ResumeConversation.js +2 -1
- package/dist/screens/ResumeConversation.js.map +2 -2
- package/dist/services/adapters/base.js.map +2 -2
- package/dist/services/adapters/chatCompletions.js.map +2 -2
- package/dist/services/adapters/responsesAPI.js +3 -1
- package/dist/services/adapters/responsesAPI.js.map +2 -2
- package/dist/services/claude.js +327 -328
- package/dist/services/claude.js.map +2 -2
- package/dist/services/customCommands.js +6 -1
- package/dist/services/customCommands.js.map +2 -2
- package/dist/services/fileFreshness.js.map +2 -2
- package/dist/services/gpt5ConnectionTest.js +20 -7
- package/dist/services/gpt5ConnectionTest.js.map +2 -2
- package/dist/services/hookExecutor.js +6 -12
- package/dist/services/hookExecutor.js.map +2 -2
- package/dist/services/mcpClient.js +29 -2
- package/dist/services/mcpClient.js.map +2 -2
- package/dist/services/mentionProcessor.js +23 -10
- package/dist/services/mentionProcessor.js.map +2 -2
- package/dist/services/modelAdapterFactory.js.map +2 -2
- package/dist/services/oauth.js.map +2 -2
- package/dist/services/openai.js +109 -72
- package/dist/services/openai.js.map +3 -3
- package/dist/services/responseStateManager.js.map +2 -2
- package/dist/services/systemReminder.js.map +2 -2
- package/dist/tools/ArchitectTool/ArchitectTool.js +10 -9
- package/dist/tools/ArchitectTool/ArchitectTool.js.map +2 -2
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js +14 -8
- package/dist/tools/AskExpertModelTool/AskExpertModelTool.js.map +2 -2
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js +8 -1
- package/dist/tools/AskUserQuestionTool/AskUserQuestionTool.js.map +2 -2
- package/dist/tools/BashOutputTool/BashOutputTool.js.map +2 -2
- package/dist/tools/BashTool/BashTool.js.map +2 -2
- package/dist/tools/FileReadTool/FileReadTool.js +23 -4
- package/dist/tools/FileReadTool/FileReadTool.js.map +2 -2
- package/dist/tools/FileWriteTool/FileWriteTool.js.map +2 -2
- package/dist/tools/GlobTool/GlobTool.js +11 -2
- package/dist/tools/GlobTool/GlobTool.js.map +2 -2
- package/dist/tools/GrepTool/GrepTool.js +7 -5
- package/dist/tools/GrepTool/GrepTool.js.map +2 -2
- package/dist/tools/MCPTool/MCPTool.js +11 -12
- package/dist/tools/MCPTool/MCPTool.js.map +2 -2
- package/dist/tools/MultiEditTool/MultiEditTool.js +4 -1
- package/dist/tools/MultiEditTool/MultiEditTool.js.map +2 -2
- package/dist/tools/NotebookReadTool/NotebookReadTool.js +11 -5
- package/dist/tools/NotebookReadTool/NotebookReadTool.js.map +2 -2
- package/dist/tools/SkillTool/SkillTool.js +18 -6
- package/dist/tools/SkillTool/SkillTool.js.map +2 -2
- package/dist/tools/TaskTool/TaskTool.js +37 -51
- package/dist/tools/TaskTool/TaskTool.js.map +2 -2
- package/dist/tools/TaskTool/prompt.js.map +2 -2
- package/dist/tools/ThinkTool/ThinkTool.js +6 -1
- package/dist/tools/ThinkTool/ThinkTool.js.map +2 -2
- package/dist/tools/TodoWriteTool/TodoWriteTool.js +29 -5
- package/dist/tools/TodoWriteTool/TodoWriteTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js +5 -2
- package/dist/tools/URLFetcherTool/URLFetcherTool.js.map +2 -2
- package/dist/tools/URLFetcherTool/cache.js +6 -3
- package/dist/tools/URLFetcherTool/cache.js.map +2 -2
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js +3 -1
- package/dist/tools/URLFetcherTool/htmlToMarkdown.js.map +2 -2
- package/dist/tools/WebSearchTool/WebSearchTool.js +6 -1
- package/dist/tools/WebSearchTool/WebSearchTool.js.map +2 -2
- package/dist/tools/WebSearchTool/prompt.js.map +2 -2
- package/dist/tools/WebSearchTool/searchProviders.js +15 -6
- package/dist/tools/WebSearchTool/searchProviders.js.map +2 -2
- package/dist/tools.js +4 -1
- package/dist/tools.js.map +2 -2
- package/dist/types/core.js +1 -0
- package/dist/types/core.js.map +7 -0
- package/dist/types/hooks.js +1 -4
- package/dist/types/hooks.js.map +2 -2
- package/dist/types/marketplace.js +8 -2
- package/dist/types/marketplace.js.map +2 -2
- package/dist/types/plugin.js +9 -6
- package/dist/types/plugin.js.map +2 -2
- package/dist/utils/BackgroundShellManager.js +76 -10
- package/dist/utils/BackgroundShellManager.js.map +2 -2
- package/dist/utils/PersistentShell.js +7 -2
- package/dist/utils/PersistentShell.js.map +2 -2
- package/dist/utils/advancedFuzzyMatcher.js +4 -1
- package/dist/utils/advancedFuzzyMatcher.js.map +2 -2
- package/dist/utils/agentLoader.js +69 -35
- package/dist/utils/agentLoader.js.map +2 -2
- package/dist/utils/agentStorage.js.map +2 -2
- package/dist/utils/async.js +163 -0
- package/dist/utils/async.js.map +7 -0
- package/dist/utils/autoUpdater.js +8 -2
- package/dist/utils/autoUpdater.js.map +2 -2
- package/dist/utils/commands.js +23 -11
- package/dist/utils/commands.js.map +2 -2
- package/dist/utils/commonUnixCommands.js +3 -1
- package/dist/utils/commonUnixCommands.js.map +2 -2
- package/dist/utils/compressionMode.js.map +2 -2
- package/dist/utils/config.js +30 -14
- package/dist/utils/config.js.map +2 -2
- package/dist/utils/debugLogger.js.map +2 -2
- package/dist/utils/env.js.map +2 -2
- package/dist/utils/envConfig.js +82 -0
- package/dist/utils/envConfig.js.map +7 -0
- package/dist/utils/errorHandling.js +89 -0
- package/dist/utils/errorHandling.js.map +7 -0
- package/dist/utils/expertChatStorage.js.map +2 -2
- package/dist/utils/fuzzyMatcher.js +13 -7
- package/dist/utils/fuzzyMatcher.js.map +2 -2
- package/dist/utils/hookManager.js +14 -4
- package/dist/utils/hookManager.js.map +2 -2
- package/dist/utils/log.js.map +2 -2
- package/dist/utils/marketplaceManager.js +44 -9
- package/dist/utils/marketplaceManager.js.map +2 -2
- package/dist/utils/messageContextManager.js.map +1 -1
- package/dist/utils/messages.js +6 -3
- package/dist/utils/messages.js.map +2 -2
- package/dist/utils/model.js +3 -1
- package/dist/utils/model.js.map +2 -2
- package/dist/utils/pluginInstaller.js +3 -15
- package/dist/utils/pluginInstaller.js.map +2 -2
- package/dist/utils/pluginLoader.js +41 -13
- package/dist/utils/pluginLoader.js.map +2 -2
- package/dist/utils/pluginRegistry.js.map +2 -2
- package/dist/utils/pluginValidator.js +71 -49
- package/dist/utils/pluginValidator.js.map +2 -2
- package/dist/utils/ptyCompat.js.map +2 -2
- package/dist/utils/roundConverter.js.map +2 -2
- package/dist/utils/secureFile.js +43 -14
- package/dist/utils/secureFile.js.map +2 -2
- package/dist/utils/sessionState.js.map +2 -2
- package/dist/utils/skillLoader.js.map +2 -2
- package/dist/utils/teamConfig.js +7 -4
- package/dist/utils/teamConfig.js.map +2 -2
- package/dist/utils/theme.js.map +2 -2
- package/dist/utils/thinking.js.map +2 -2
- package/dist/utils/unaryLogging.js.map +2 -2
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/package.json +5 -5
|
@@ -10,7 +10,9 @@ const PluginBrowser = ({
|
|
|
10
10
|
}) => {
|
|
11
11
|
const theme = getTheme();
|
|
12
12
|
const [plugins, setPlugins] = useState([]);
|
|
13
|
-
const [installedPlugins, setInstalledPlugins] = useState(
|
|
13
|
+
const [installedPlugins, setInstalledPlugins] = useState(
|
|
14
|
+
/* @__PURE__ */ new Set()
|
|
15
|
+
);
|
|
14
16
|
const [selectedPlugins, setSelectedPlugins] = useState(/* @__PURE__ */ new Set());
|
|
15
17
|
const [focusedIndex, setFocusedIndex] = useState(0);
|
|
16
18
|
const [loading, setLoading] = useState(true);
|
|
@@ -151,7 +153,7 @@ const PluginBrowser = ({
|
|
|
151
153
|
}
|
|
152
154
|
);
|
|
153
155
|
})),
|
|
154
|
-
/* @__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, { dimColor: true }, "Space: (de)select \xB7 Enter: details \xB7 \u2191\u2193: navigate \xB7 Esc: back"))
|
|
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, { dimColor: true }, "Space: (de)select \xB7 Enter: details \xB7 \u2191\u2193: navigate \xB7 Esc: back"))
|
|
155
157
|
);
|
|
156
158
|
};
|
|
157
159
|
const PluginListItem = ({
|
|
@@ -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>>(new Set())\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
|
|
5
|
-
"mappings": "AAMA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,MAAM,gBAAgB;AACpC,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAQxB,MAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,CAAC,SAAS,UAAU,IAAI,SAA8B,CAAC,CAAC;AAC9D,QAAM,CAAC,kBAAkB,mBAAmB,IAAI,
|
|
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 dimColor>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 dimColor>No plugins available in this marketplace</Text>\n </Box>\n <Box marginTop={1}>\n <Text dimColor>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 dimColor>\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 && <Text dimColor> {infoItems.join(' ')}</Text>}\n </Box>\n {plugin.description && (\n <Box marginLeft={4}>\n <Text dimColor>{truncate(plugin.description, 70)}</Text>\n </Box>\n )}\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -2,7 +2,10 @@ import React, { useState, useEffect } from "react";
|
|
|
2
2
|
import { Box, Text } from "ink";
|
|
3
3
|
import { Select } from "../../components/CustomSelect/select.js";
|
|
4
4
|
import { getTheme } from "../../utils/theme.js";
|
|
5
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
getMarketplace,
|
|
7
|
+
installPluginFromMarketplace
|
|
8
|
+
} from "../../utils/marketplaceManager.js";
|
|
6
9
|
import { formatAuthor } from "./utils.js";
|
|
7
10
|
import { spawn } from "child_process";
|
|
8
11
|
const PluginDetailsInstall = ({
|
|
@@ -30,7 +33,9 @@ const PluginDetailsInstall = ({
|
|
|
30
33
|
setLoading(false);
|
|
31
34
|
return;
|
|
32
35
|
}
|
|
33
|
-
const pluginInfo = marketplaceData.manifest.plugins.find(
|
|
36
|
+
const pluginInfo = marketplaceData.manifest.plugins.find(
|
|
37
|
+
(p) => p.name === plugin
|
|
38
|
+
);
|
|
34
39
|
setPluginData(pluginInfo || null);
|
|
35
40
|
} catch (err) {
|
|
36
41
|
console.error("Error loading plugin details:", err);
|
|
@@ -45,7 +50,10 @@ const PluginDetailsInstall = ({
|
|
|
45
50
|
setInstallError(null);
|
|
46
51
|
setInstallSuccess(false);
|
|
47
52
|
try {
|
|
48
|
-
const installPath = await installPluginFromMarketplace(
|
|
53
|
+
const installPath = await installPluginFromMarketplace(
|
|
54
|
+
plugin,
|
|
55
|
+
marketplace
|
|
56
|
+
);
|
|
49
57
|
setInstallSuccess(true);
|
|
50
58
|
setInstalling(false);
|
|
51
59
|
setTimeout(() => {
|
|
@@ -99,9 +107,7 @@ const PluginDetailsInstall = ({
|
|
|
99
107
|
/* @__PURE__ */ React.createElement(Box, { marginTop: 1 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "Press Esc to go back"))
|
|
100
108
|
);
|
|
101
109
|
}
|
|
102
|
-
const actions = [
|
|
103
|
-
{ label: "Install now", value: "install" }
|
|
104
|
-
];
|
|
110
|
+
const actions = [{ label: "Install now", value: "install" }];
|
|
105
111
|
if (pluginData.homepage) {
|
|
106
112
|
actions.push({ label: "Open homepage", value: "homepage" });
|
|
107
113
|
}
|
|
@@ -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 {
|
|
5
|
-
"mappings": "AAMA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,KAAK,YAAY;AAC1B,SAAS,cAAc;AAEvB,SAAS,gBAAgB;AACzB,
|
|
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": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import React, { useState, useEffect, useCallback } from "react";
|
|
2
2
|
import { Box, Text, useInput } from "ink";
|
|
3
|
-
import {
|
|
4
|
-
|
|
3
|
+
import {
|
|
4
|
+
getPlugin,
|
|
5
|
+
togglePluginEnabled
|
|
6
|
+
} from "../../utils/pluginLoader.js";
|
|
7
|
+
import {
|
|
8
|
+
updateMarketplace,
|
|
9
|
+
installPluginFromMarketplace
|
|
10
|
+
} from "../../utils/marketplaceManager.js";
|
|
5
11
|
import { getTheme } from "../../utils/theme.js";
|
|
6
12
|
import { formatAuthor } from "./utils.js";
|
|
7
13
|
import { rmSync } from "fs";
|
|
@@ -116,7 +122,10 @@ const PluginDetailsManage = ({
|
|
|
116
122
|
if (marketplace) {
|
|
117
123
|
await updateMarketplace(marketplace);
|
|
118
124
|
rmSync(pluginData.location, { recursive: true, force: true });
|
|
119
|
-
await installPluginFromMarketplace(
|
|
125
|
+
await installPluginFromMarketplace(
|
|
126
|
+
pluginData.manifest.name,
|
|
127
|
+
marketplace
|
|
128
|
+
);
|
|
120
129
|
setActionMessage("Plugin updated successfully!");
|
|
121
130
|
setTimeout(() => {
|
|
122
131
|
setActionMessage("");
|
|
@@ -177,7 +186,7 @@ const PluginDetailsManage = ({
|
|
|
177
186
|
}
|
|
178
187
|
};
|
|
179
188
|
const confirm = confirmMessages[confirmAction];
|
|
180
|
-
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.warning }, confirm.title), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, confirm.message), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, confirm.warning), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Y"), "es / ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "N"), "o"));
|
|
189
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.warning }, confirm.title), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, confirm.message), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, confirm.warning), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, null, /* @__PURE__ */ React.createElement(Text, { color: theme.success }, "Y"), "es /", " ", /* @__PURE__ */ React.createElement(Text, { color: theme.error }, "N"), "o"));
|
|
181
190
|
}
|
|
182
191
|
if (actionInProgress) {
|
|
183
192
|
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { color: theme.primary }, actionMessage));
|
|
@@ -189,7 +198,7 @@ const PluginDetailsManage = ({
|
|
|
189
198
|
pluginData.hooks.length > 0 && `${pluginData.hooks.length} hook(s)`,
|
|
190
199
|
pluginData.mcpServers.length > 0 && `${pluginData.mcpServers.length} MCP server(s)`
|
|
191
200
|
].filter(Boolean);
|
|
192
|
-
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, pluginData.manifest.displayName || pluginData.manifest.name), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, marketplace ? `@${marketplace}` : "local", " \xB7 v", pluginData.manifest.version), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, pluginData.manifest.description), pluginData.manifest.author && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "By ", formatAuthor(pluginData.manifest.author)), /* @__PURE__ */ React.createElement(Text, null, "Status:", " ", /* @__PURE__ */ React.createElement(Text, { color: pluginData.enabled ? theme.success : theme.warning }, pluginData.enabled ? "Enabled" : "Disabled")), componentCounts.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true }, "Components:"), pluginData.agents.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Agents: ", pluginData.agents.map((a) => a.name).join(", "))), pluginData.commands.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Commands: ", pluginData.commands.map((c) => `/${c.name}`).join(", "))), pluginData.skills.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Skills: ", pluginData.skills.map((s) => s.name).join(", "))))), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Actions:"), availableActions.map((action, index) => {
|
|
201
|
+
return /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", borderStyle: "round", padding: 1 }, /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, pluginData.manifest.displayName || pluginData.manifest.name), /* @__PURE__ */ React.createElement(Text, { dimColor: true }, marketplace ? `@${marketplace}` : "local", " \xB7 v", pluginData.manifest.version), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { flexDirection: "column", marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, null, pluginData.manifest.description), pluginData.manifest.author && /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "By ", formatAuthor(pluginData.manifest.author)), /* @__PURE__ */ React.createElement(Text, null, "Status:", " ", /* @__PURE__ */ React.createElement(Text, { color: pluginData.enabled ? theme.success : theme.warning }, pluginData.enabled ? "Enabled" : "Disabled")), componentCounts.length > 0 && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true }, "Components:"), pluginData.agents.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Agents: ", pluginData.agents.map((a) => a.name).join(", "))), pluginData.commands.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Commands:", " ", pluginData.commands.map((c) => `/${c.name}`).join(", "))), pluginData.skills.length > 0 && /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2022 Skills: ", pluginData.skills.map((s) => s.name).join(", "))))), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Text, { bold: true, color: theme.primary }, "Actions:"), availableActions.map((action, index) => {
|
|
193
202
|
const isSelected = index === selectedIndex;
|
|
194
203
|
return /* @__PURE__ */ React.createElement(Box, { key: action.value, marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: isSelected ? theme.success : void 0 }, isSelected ? "\u276F " : " ", action.label));
|
|
195
204
|
}), actionMessage && /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { color: theme.warning }, actionMessage))), /* @__PURE__ */ React.createElement(Text, null, ""), /* @__PURE__ */ React.createElement(Box, { marginLeft: 2 }, /* @__PURE__ */ React.createElement(Text, { dimColor: true }, "\u2191\u2193 Navigate \xB7 Enter Select \xB7 Esc Back")));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/plugin/PluginDetailsManage.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Plugin Details Management\n *\n * Displays detailed information about an installed plugin with management actions.\n * Provides options to enable/disable, update, uninstall, and open homepage.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport { getPlugin, togglePluginEnabled, disablePlugin, enablePlugin } from '@utils/pluginLoader'\nimport { updateMarketplace, installPluginFromMarketplace } from '@utils/marketplaceManager'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\nimport { formatAuthor } from './utils'\nimport { rmSync } from 'fs'\n\ninterface PluginDetailsManageProps extends NavigationProps {\n plugin: LoadedPlugin\n}\n\ntype ActionOption = {\n label: string\n value: string\n disabled?: boolean\n}\n\nexport const PluginDetailsManage: React.FC<PluginDetailsManageProps> = ({\n plugin,\n onNavigate,\n onBack,\n}) => {\n const [pluginData, setPluginData] = useState<LoadedPlugin>(plugin)\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<string | null>(null)\n const [actionInProgress, setActionInProgress] = useState(false)\n const [actionMessage, setActionMessage] = useState('')\n const theme = getTheme()\n\n const marketplace = pluginData.source.type === 'marketplace'\n ? pluginData.source.marketplace\n : null\n\n const loadPluginData = useCallback(() => {\n const p = getPlugin(plugin.manifest.name)\n if (p) {\n setPluginData(p)\n }\n }, [plugin])\n\n useEffect(() => {\n loadPluginData()\n }, [loadPluginData])\n\n const actions: ActionOption[] = [\n {\n label: pluginData.enabled ? 'Disable plugin' : 'Enable plugin',\n value: 'toggle',\n },\n {\n label: 'Mark for update',\n value: 'mark-update',\n disabled: !marketplace,\n },\n {\n label: 'Mark for uninstallation',\n value: 'mark-uninstall',\n },\n {\n label: 'Update now',\n value: 'update-now',\n disabled: !marketplace,\n },\n {\n label: 'Uninstall now',\n value: 'uninstall-now',\n },\n {\n label: 'Open homepage',\n value: 'homepage',\n disabled: !pluginData.manifest.homepage,\n },\n {\n label: 'Back to plugin list',\n value: 'back',\n },\n ]\n\n const availableActions = actions.filter((a) => !a.disabled)\n\n const handleAction = useCallback(\n async (action: string) => {\n if (!pluginData) return\n\n switch (action) {\n case 'toggle':\n try {\n togglePluginEnabled(pluginData.manifest.name)\n loadPluginData()\n } catch (error) {\n setActionMessage(\n `Error toggling plugin: ${error instanceof Error ? error.message : String(error)}`\n )\n }\n break\n\n case 'mark-update':\n setActionMessage(`Plugin marked for update`)\n setTimeout(() => setActionMessage(''), 3000)\n break\n\n case 'mark-uninstall':\n setActionMessage(`Plugin marked for uninstallation`)\n setTimeout(() => setActionMessage(''), 3000)\n break\n\n case 'update-now':\n if (marketplace) {\n setConfirmAction('update-now')\n setShowConfirm(true)\n }\n break\n\n case 'uninstall-now':\n setConfirmAction('uninstall-now')\n setShowConfirm(true)\n break\n\n case 'homepage':\n if (pluginData.manifest.homepage) {\n setActionMessage(`Opening ${pluginData.manifest.homepage}`)\n // In a real implementation, would open browser\n setTimeout(() => setActionMessage(''), 3000)\n }\n break\n\n case 'back':\n onBack()\n break\n }\n },\n [pluginData, marketplace, loadPluginData, onBack]\n )\n\n const handleConfirmAction = useCallback(async () => {\n if (!pluginData || !confirmAction) return\n\n setShowConfirm(false)\n setActionInProgress(true)\n\n try {\n if (confirmAction === 'update-now') {\n setActionMessage('Updating plugin...')\n\n if (marketplace) {\n // Update marketplace first\n await updateMarketplace(marketplace)\n\n // Uninstall current version\n rmSync(pluginData.location, { recursive: true, force: true })\n\n // Reinstall latest version\n await installPluginFromMarketplace(pluginData.manifest.name, marketplace)\n\n setActionMessage('Plugin updated successfully!')\n setTimeout(() => {\n setActionMessage('')\n onBack()\n }, 2000)\n }\n } else if (confirmAction === 'uninstall-now') {\n setActionMessage('Uninstalling plugin...')\n\n // Remove plugin directory\n rmSync(pluginData.location, { recursive: true, force: true })\n\n setActionMessage('Plugin uninstalled successfully!')\n setTimeout(() => {\n setActionMessage('')\n onBack()\n }, 2000)\n }\n } catch (error) {\n setActionMessage(\n `Action failed: ${error instanceof Error ? error.message : String(error)}`\n )\n setTimeout(() => setActionMessage(''), 5000)\n } finally {\n setActionInProgress(false)\n setConfirmAction(null)\n }\n }, [pluginData, confirmAction, marketplace, onBack])\n\n useInput((input, key) => {\n if (actionInProgress) return\n\n if (showConfirm) {\n if (key.return || input === 'y') {\n handleConfirmAction()\n } else if (key.escape || input === 'n') {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n return\n }\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex((prev) => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex((prev) => Math.min(availableActions.length - 1, prev + 1))\n } else if (key.return) {\n handleAction(availableActions[selectedIndex].value)\n }\n })\n\n\n if (showConfirm && confirmAction) {\n const confirmMessages = {\n 'update-now': {\n title: 'Confirm Update',\n message: `Update plugin \"${pluginData.manifest.name}\" to the latest version?`,\n warning: 'This will uninstall the current version and install the latest.',\n },\n 'uninstall-now': {\n title: 'Confirm Uninstall',\n message: `Permanently uninstall plugin \"${pluginData.manifest.name}\"?`,\n warning: 'This action cannot be undone. All plugin files will be removed.',\n },\n }\n\n const confirm = confirmMessages[confirmAction as keyof typeof confirmMessages]\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.warning}>\n {confirm.title}\n </Text>\n <Text>{''}</Text>\n <Text>{confirm.message}</Text>\n <Text dimColor>{confirm.warning}</Text>\n <Text>{''}</Text>\n <Text>\n <Text color={theme.success}>Y</Text>es / <Text color={theme.error}>N</Text>o\n </Text>\n </Box>\n )\n }\n\n if (actionInProgress) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text color={theme.primary}>{actionMessage}</Text>\n </Box>\n )\n }\n\n const componentCounts = [\n pluginData.agents.length > 0 && `${pluginData.agents.length} agent(s)`,\n pluginData.commands.length > 0 && `${pluginData.commands.length} command(s)`,\n pluginData.skills.length > 0 && `${pluginData.skills.length} skill(s)`,\n pluginData.hooks.length > 0 && `${pluginData.hooks.length} hook(s)`,\n pluginData.mcpServers.length > 0 && `${pluginData.mcpServers.length} MCP server(s)`,\n ].filter(Boolean)\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n {pluginData.manifest.displayName || pluginData.manifest.name}\n </Text>\n <Text dimColor>\n {marketplace ? `@${marketplace}` : 'local'} \u00B7 v{pluginData.manifest.version}\n </Text>\n <Text>{''}</Text>\n\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text>{pluginData.manifest.description}</Text>\n {pluginData.manifest.author && <Text dimColor>By {formatAuthor(pluginData.manifest.author)}</Text>}\n <Text>\n Status:{' '}\n <Text color={pluginData.enabled ? theme.success : theme.warning}>\n {pluginData.enabled ? 'Enabled' : 'Disabled'}\n </Text>\n </Text>\n\n {componentCounts.length > 0 && (\n <>\n <Text>{''}</Text>\n <Text bold>Components:</Text>\n {pluginData.agents.length > 0 && (\n <Box marginLeft={2}>\n <Text dimColor>\u2022 Agents: {pluginData.agents.map((a) => a.name).join(', ')}</Text>\n </Box>\n )}\n {pluginData.commands.length > 0 && (\n <Box marginLeft={2}>\n <Text dimColor>\n \u2022 Commands: {pluginData.commands.map((c) => `/${c.name}`).join(', ')}\n </Text>\n </Box>\n )}\n {pluginData.skills.length > 0 && (\n <Box marginLeft={2}>\n <Text dimColor>\u2022 Skills: {pluginData.skills.map((s) => s.name).join(', ')}</Text>\n </Box>\n )}\n </>\n )}\n </Box>\n\n <Text>{''}</Text>\n <Text bold color={theme.primary}>\n Actions:\n </Text>\n\n {availableActions.map((action, index) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={action.value} marginLeft={2}>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {action.label}\n </Text>\n </Box>\n )\n })}\n\n {actionMessage && (\n <>\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text color={theme.warning}>{actionMessage}</Text>\n </Box>\n </>\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text dimColor>\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back</Text>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
-
"mappings": "AAOA,OAAO,SAAS,UAAU,WAAW,mBAAmB;AACxD,SAAS,KAAK,MAAM,gBAAgB;AACpC,
|
|
4
|
+
"sourcesContent": ["/**\n * Plugin Details Management\n *\n * Displays detailed information about an installed plugin with management actions.\n * Provides options to enable/disable, update, uninstall, and open homepage.\n */\n\nimport React, { useState, useEffect, useCallback } from 'react'\nimport { Box, Text, useInput } from 'ink'\nimport {\n getPlugin,\n togglePluginEnabled,\n disablePlugin,\n enablePlugin,\n} from '@utils/pluginLoader'\nimport {\n updateMarketplace,\n installPluginFromMarketplace,\n} from '@utils/marketplaceManager'\nimport { LoadedPlugin } from '../../types/plugin'\nimport { getTheme } from '@utils/theme'\nimport { NavigationProps } from './types'\nimport { formatAuthor } from './utils'\nimport { rmSync } from 'fs'\n\ninterface PluginDetailsManageProps extends NavigationProps {\n plugin: LoadedPlugin\n}\n\ntype ActionOption = {\n label: string\n value: string\n disabled?: boolean\n}\n\nexport const PluginDetailsManage: React.FC<PluginDetailsManageProps> = ({\n plugin,\n onNavigate,\n onBack,\n}) => {\n const [pluginData, setPluginData] = useState<LoadedPlugin>(plugin)\n const [selectedIndex, setSelectedIndex] = useState(0)\n const [showConfirm, setShowConfirm] = useState(false)\n const [confirmAction, setConfirmAction] = useState<string | null>(null)\n const [actionInProgress, setActionInProgress] = useState(false)\n const [actionMessage, setActionMessage] = useState('')\n const theme = getTheme()\n\n const marketplace =\n pluginData.source.type === 'marketplace'\n ? pluginData.source.marketplace\n : null\n\n const loadPluginData = useCallback(() => {\n const p = getPlugin(plugin.manifest.name)\n if (p) {\n setPluginData(p)\n }\n }, [plugin])\n\n useEffect(() => {\n loadPluginData()\n }, [loadPluginData])\n\n const actions: ActionOption[] = [\n {\n label: pluginData.enabled ? 'Disable plugin' : 'Enable plugin',\n value: 'toggle',\n },\n {\n label: 'Mark for update',\n value: 'mark-update',\n disabled: !marketplace,\n },\n {\n label: 'Mark for uninstallation',\n value: 'mark-uninstall',\n },\n {\n label: 'Update now',\n value: 'update-now',\n disabled: !marketplace,\n },\n {\n label: 'Uninstall now',\n value: 'uninstall-now',\n },\n {\n label: 'Open homepage',\n value: 'homepage',\n disabled: !pluginData.manifest.homepage,\n },\n {\n label: 'Back to plugin list',\n value: 'back',\n },\n ]\n\n const availableActions = actions.filter(a => !a.disabled)\n\n const handleAction = useCallback(\n async (action: string) => {\n if (!pluginData) return\n\n switch (action) {\n case 'toggle':\n try {\n togglePluginEnabled(pluginData.manifest.name)\n loadPluginData()\n } catch (error) {\n setActionMessage(\n `Error toggling plugin: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n break\n\n case 'mark-update':\n setActionMessage(`Plugin marked for update`)\n setTimeout(() => setActionMessage(''), 3000)\n break\n\n case 'mark-uninstall':\n setActionMessage(`Plugin marked for uninstallation`)\n setTimeout(() => setActionMessage(''), 3000)\n break\n\n case 'update-now':\n if (marketplace) {\n setConfirmAction('update-now')\n setShowConfirm(true)\n }\n break\n\n case 'uninstall-now':\n setConfirmAction('uninstall-now')\n setShowConfirm(true)\n break\n\n case 'homepage':\n if (pluginData.manifest.homepage) {\n setActionMessage(`Opening ${pluginData.manifest.homepage}`)\n // In a real implementation, would open browser\n setTimeout(() => setActionMessage(''), 3000)\n }\n break\n\n case 'back':\n onBack()\n break\n }\n },\n [pluginData, marketplace, loadPluginData, onBack],\n )\n\n const handleConfirmAction = useCallback(async () => {\n if (!pluginData || !confirmAction) return\n\n setShowConfirm(false)\n setActionInProgress(true)\n\n try {\n if (confirmAction === 'update-now') {\n setActionMessage('Updating plugin...')\n\n if (marketplace) {\n // Update marketplace first\n await updateMarketplace(marketplace)\n\n // Uninstall current version\n rmSync(pluginData.location, { recursive: true, force: true })\n\n // Reinstall latest version\n await installPluginFromMarketplace(\n pluginData.manifest.name,\n marketplace,\n )\n\n setActionMessage('Plugin updated successfully!')\n setTimeout(() => {\n setActionMessage('')\n onBack()\n }, 2000)\n }\n } else if (confirmAction === 'uninstall-now') {\n setActionMessage('Uninstalling plugin...')\n\n // Remove plugin directory\n rmSync(pluginData.location, { recursive: true, force: true })\n\n setActionMessage('Plugin uninstalled successfully!')\n setTimeout(() => {\n setActionMessage('')\n onBack()\n }, 2000)\n }\n } catch (error) {\n setActionMessage(\n `Action failed: ${error instanceof Error ? error.message : String(error)}`,\n )\n setTimeout(() => setActionMessage(''), 5000)\n } finally {\n setActionInProgress(false)\n setConfirmAction(null)\n }\n }, [pluginData, confirmAction, marketplace, onBack])\n\n useInput((input, key) => {\n if (actionInProgress) return\n\n if (showConfirm) {\n if (key.return || input === 'y') {\n handleConfirmAction()\n } else if (key.escape || input === 'n') {\n setShowConfirm(false)\n setConfirmAction(null)\n }\n return\n }\n\n if (key.escape) {\n onBack()\n } else if (key.upArrow) {\n setSelectedIndex(prev => Math.max(0, prev - 1))\n } else if (key.downArrow) {\n setSelectedIndex(prev => Math.min(availableActions.length - 1, prev + 1))\n } else if (key.return) {\n handleAction(availableActions[selectedIndex].value)\n }\n })\n\n if (showConfirm && confirmAction) {\n const confirmMessages = {\n 'update-now': {\n title: 'Confirm Update',\n message: `Update plugin \"${pluginData.manifest.name}\" to the latest version?`,\n warning:\n 'This will uninstall the current version and install the latest.',\n },\n 'uninstall-now': {\n title: 'Confirm Uninstall',\n message: `Permanently uninstall plugin \"${pluginData.manifest.name}\"?`,\n warning:\n 'This action cannot be undone. All plugin files will be removed.',\n },\n }\n\n const confirm =\n confirmMessages[confirmAction as keyof typeof confirmMessages]\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.warning}>\n {confirm.title}\n </Text>\n <Text>{''}</Text>\n <Text>{confirm.message}</Text>\n <Text dimColor>{confirm.warning}</Text>\n <Text>{''}</Text>\n <Text>\n <Text color={theme.success}>Y</Text>es /{' '}\n <Text color={theme.error}>N</Text>o\n </Text>\n </Box>\n )\n }\n\n if (actionInProgress) {\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text color={theme.primary}>{actionMessage}</Text>\n </Box>\n )\n }\n\n const componentCounts = [\n pluginData.agents.length > 0 && `${pluginData.agents.length} agent(s)`,\n pluginData.commands.length > 0 &&\n `${pluginData.commands.length} command(s)`,\n pluginData.skills.length > 0 && `${pluginData.skills.length} skill(s)`,\n pluginData.hooks.length > 0 && `${pluginData.hooks.length} hook(s)`,\n pluginData.mcpServers.length > 0 &&\n `${pluginData.mcpServers.length} MCP server(s)`,\n ].filter(Boolean)\n\n return (\n <Box flexDirection=\"column\" borderStyle=\"round\" padding={1}>\n <Text bold color={theme.primary}>\n {pluginData.manifest.displayName || pluginData.manifest.name}\n </Text>\n <Text dimColor>\n {marketplace ? `@${marketplace}` : 'local'} \u00B7 v\n {pluginData.manifest.version}\n </Text>\n <Text>{''}</Text>\n\n <Box flexDirection=\"column\" marginLeft={2}>\n <Text>{pluginData.manifest.description}</Text>\n {pluginData.manifest.author && (\n <Text dimColor>By {formatAuthor(pluginData.manifest.author)}</Text>\n )}\n <Text>\n Status:{' '}\n <Text color={pluginData.enabled ? theme.success : theme.warning}>\n {pluginData.enabled ? 'Enabled' : 'Disabled'}\n </Text>\n </Text>\n\n {componentCounts.length > 0 && (\n <>\n <Text>{''}</Text>\n <Text bold>Components:</Text>\n {pluginData.agents.length > 0 && (\n <Box marginLeft={2}>\n <Text dimColor>\n \u2022 Agents: {pluginData.agents.map(a => a.name).join(', ')}\n </Text>\n </Box>\n )}\n {pluginData.commands.length > 0 && (\n <Box marginLeft={2}>\n <Text dimColor>\n \u2022 Commands:{' '}\n {pluginData.commands.map(c => `/${c.name}`).join(', ')}\n </Text>\n </Box>\n )}\n {pluginData.skills.length > 0 && (\n <Box marginLeft={2}>\n <Text dimColor>\n \u2022 Skills: {pluginData.skills.map(s => s.name).join(', ')}\n </Text>\n </Box>\n )}\n </>\n )}\n </Box>\n\n <Text>{''}</Text>\n <Text bold color={theme.primary}>\n Actions:\n </Text>\n\n {availableActions.map((action, index) => {\n const isSelected = index === selectedIndex\n return (\n <Box key={action.value} marginLeft={2}>\n <Text color={isSelected ? theme.success : undefined}>\n {isSelected ? '\u276F ' : ' '}\n {action.label}\n </Text>\n </Box>\n )\n })}\n\n {actionMessage && (\n <>\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text color={theme.warning}>{actionMessage}</Text>\n </Box>\n </>\n )}\n\n <Text>{''}</Text>\n <Box marginLeft={2}>\n <Text dimColor>\u2191\u2193 Navigate \u00B7 Enter Select \u00B7 Esc Back</Text>\n </Box>\n </Box>\n )\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/plugin/example-usage.tsx"],
|
|
4
|
-
"sourcesContent": ["/**\n * Example Usage of Plugin Marketplace Components\n *\n * This demonstrates how to integrate the Phase 2 components into a navigation flow.\n */\n\nimport React, { useState } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport { MarketplaceSelector } from './MarketplaceSelector'\nimport { PluginBrowser } from './PluginBrowser'\nimport { PluginDetailsInstall } from './PluginDetailsInstall'\nimport { PluginUIState } from './types'\n\n/**\n * Main Plugin Command Component\n * Manages navigation state and renders appropriate screen\n */\nexport const PluginCommand: React.FC<{ onDone: () => void }> = ({ onDone }) => {\n const { exit } = useApp()\n const [navigationStack, setNavigationStack] = useState<PluginUIState[]>([\n { screen: 'marketplace-selector' },\n ])\n\n const currentState = navigationStack[navigationStack.length - 1]\n\n const handleNavigate = (newState: PluginUIState) => {\n setNavigationStack([...navigationStack, newState])\n }\n\n const handleBack = () => {\n if (navigationStack.length > 1) {\n setNavigationStack(navigationStack.slice(0, -1))\n } else {\n // At root, exit\n onDone()\n }\n }\n\n const handleDone = () => {\n onDone()\n }\n\n // Render current screen based on state\n switch (currentState.screen) {\n case 'marketplace-selector':\n return (\n <MarketplaceSelector\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={handleDone}\n />\n )\n\n case 'plugin-browser':\n return (\n <PluginBrowser\n marketplace={currentState.marketplace}\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={handleDone}\n />\n )\n\n case 'plugin-details-install':\n return (\n <PluginDetailsInstall\n marketplace={currentState.marketplace}\n plugin={currentState.plugin}\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={handleDone}\n />\n )\n\n default:\n return (\n <Box>\n <Text color=\"red\"
|
|
5
|
-
"mappings": "AAMA,OAAO,SAAS,gBAAgB;AAChC,SAAS,KAAK,MAAM,cAAc;AAClC,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAC9B,SAAS,4BAA4B;AAO9B,MAAM,gBAAkD,CAAC,EAAE,OAAO,MAAM;AAC7E,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAA0B;AAAA,IACtE,EAAE,QAAQ,uBAAuB;AAAA,EACnC,CAAC;AAED,QAAM,eAAe,gBAAgB,gBAAgB,SAAS,CAAC;AAE/D,QAAM,iBAAiB,CAAC,aAA4B;AAClD,uBAAmB,CAAC,GAAG,iBAAiB,QAAQ,CAAC;AAAA,EACnD;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,gBAAgB,SAAS,GAAG;AAC9B,yBAAmB,gBAAgB,MAAM,GAAG,EAAE,CAAC;AAAA,IACjD,OAAO;AAEL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,WAAO;AAAA,EACT;AAGA,UAAQ,aAAa,QAAQ;AAAA,IAC3B,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ;AAAA;AAAA,MACV;AAAA,IAGJ,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,aAAa,aAAa;AAAA,UAC1B,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ;AAAA;AAAA,MACV;AAAA,IAGJ,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,aAAa,aAAa;AAAA,UAC1B,QAAQ,aAAa;AAAA,UACrB,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ;AAAA;AAAA,MACV;AAAA,IAGJ;AACE,aACE,oCAAC,WACC,oCAAC,QAAK,OAAM,SAAM,
|
|
4
|
+
"sourcesContent": ["/**\n * Example Usage of Plugin Marketplace Components\n *\n * This demonstrates how to integrate the Phase 2 components into a navigation flow.\n */\n\nimport React, { useState } from 'react'\nimport { Box, Text, useApp } from 'ink'\nimport { MarketplaceSelector } from './MarketplaceSelector'\nimport { PluginBrowser } from './PluginBrowser'\nimport { PluginDetailsInstall } from './PluginDetailsInstall'\nimport { PluginUIState } from './types'\n\n/**\n * Main Plugin Command Component\n * Manages navigation state and renders appropriate screen\n */\nexport const PluginCommand: React.FC<{ onDone: () => void }> = ({ onDone }) => {\n const { exit } = useApp()\n const [navigationStack, setNavigationStack] = useState<PluginUIState[]>([\n { screen: 'marketplace-selector' },\n ])\n\n const currentState = navigationStack[navigationStack.length - 1]\n\n const handleNavigate = (newState: PluginUIState) => {\n setNavigationStack([...navigationStack, newState])\n }\n\n const handleBack = () => {\n if (navigationStack.length > 1) {\n setNavigationStack(navigationStack.slice(0, -1))\n } else {\n // At root, exit\n onDone()\n }\n }\n\n const handleDone = () => {\n onDone()\n }\n\n // Render current screen based on state\n switch (currentState.screen) {\n case 'marketplace-selector':\n return (\n <MarketplaceSelector\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={handleDone}\n />\n )\n\n case 'plugin-browser':\n return (\n <PluginBrowser\n marketplace={currentState.marketplace}\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={handleDone}\n />\n )\n\n case 'plugin-details-install':\n return (\n <PluginDetailsInstall\n marketplace={currentState.marketplace}\n plugin={currentState.plugin}\n onNavigate={handleNavigate}\n onBack={handleBack}\n onDone={handleDone}\n />\n )\n\n default:\n return (\n <Box>\n <Text color=\"red\">\n Unknown screen: {(currentState as any).screen}\n </Text>\n </Box>\n )\n }\n}\n\n/**\n * Example CLI integration:\n *\n * // In your main commands file or as a slash command:\n * import { PluginCommand } from './commands/plugin/example-usage'\n *\n * // Render the component:\n * <PluginCommand onDone={() => {\n * // Return to main REPL or exit\n * }} />\n *\n * // Or as a command:\n * export const pluginInstall = () => {\n * return <PluginCommand onDone={process.exit} />\n * }\n */\n"],
|
|
5
|
+
"mappings": "AAMA,OAAO,SAAS,gBAAgB;AAChC,SAAS,KAAK,MAAM,cAAc;AAClC,SAAS,2BAA2B;AACpC,SAAS,qBAAqB;AAC9B,SAAS,4BAA4B;AAO9B,MAAM,gBAAkD,CAAC,EAAE,OAAO,MAAM;AAC7E,QAAM,EAAE,KAAK,IAAI,OAAO;AACxB,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAA0B;AAAA,IACtE,EAAE,QAAQ,uBAAuB;AAAA,EACnC,CAAC;AAED,QAAM,eAAe,gBAAgB,gBAAgB,SAAS,CAAC;AAE/D,QAAM,iBAAiB,CAAC,aAA4B;AAClD,uBAAmB,CAAC,GAAG,iBAAiB,QAAQ,CAAC;AAAA,EACnD;AAEA,QAAM,aAAa,MAAM;AACvB,QAAI,gBAAgB,SAAS,GAAG;AAC9B,yBAAmB,gBAAgB,MAAM,GAAG,EAAE,CAAC;AAAA,IACjD,OAAO;AAEL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,aAAa,MAAM;AACvB,WAAO;AAAA,EACT;AAGA,UAAQ,aAAa,QAAQ;AAAA,IAC3B,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ;AAAA;AAAA,MACV;AAAA,IAGJ,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,aAAa,aAAa;AAAA,UAC1B,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ;AAAA;AAAA,MACV;AAAA,IAGJ,KAAK;AACH,aACE;AAAA,QAAC;AAAA;AAAA,UACC,aAAa,aAAa;AAAA,UAC1B,QAAQ,aAAa;AAAA,UACrB,YAAY;AAAA,UACZ,QAAQ;AAAA,UACR,QAAQ;AAAA;AAAA,MACV;AAAA,IAGJ;AACE,aACE,oCAAC,WACC,oCAAC,QAAK,OAAM,SAAM,oBACE,aAAqB,MACzC,CACF;AAAA,EAEN;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/commands/plugin/utils.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Plugin Command Utility Functions\n *\n * Helper functions for formatting and displaying plugin information.\n */\n\n/**\n * Truncate text to maximum length\n */\nexport function truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength - 3) + '...'\n}\n\n/**\n * Format date as YYYY/MM/DD\n */\nexport function formatDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const year = d.getFullYear()\n const month = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${year}/${month}/${day}`\n}\n\n/**\n * Format plugin count statistics for display.\n *\n * @param available - Total number of plugins available in marketplace\n * @param installed - Number of plugins already installed\n * @returns Formatted string like \"65 plugins available \u00B7 8 already installed\"\n */\nexport const formatPluginCount = (available: number
|
|
5
|
-
"mappings": "AASO,SAAS,SAAS,MAAc,WAA2B;AAChE,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,SAAO,KAAK,MAAM,GAAG,YAAY,CAAC,IAAI;AACxC;AAKO,SAAS,WAAW,MAA6B;AACtD,QAAM,IAAI,OAAO,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI;AACtD,QAAM,OAAO,EAAE,YAAY;AAC3B,QAAM,QAAQ,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACtD,QAAM,MAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC/C,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAChC;AASO,MAAM,oBAAoB,
|
|
4
|
+
"sourcesContent": ["/**\n * Plugin Command Utility Functions\n *\n * Helper functions for formatting and displaying plugin information.\n */\n\n/**\n * Truncate text to maximum length\n */\nexport function truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text\n return text.slice(0, maxLength - 3) + '...'\n}\n\n/**\n * Format date as YYYY/MM/DD\n */\nexport function formatDate(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const year = d.getFullYear()\n const month = String(d.getMonth() + 1).padStart(2, '0')\n const day = String(d.getDate()).padStart(2, '0')\n return `${year}/${month}/${day}`\n}\n\n/**\n * Format plugin count statistics for display.\n *\n * @param available - Total number of plugins available in marketplace\n * @param installed - Number of plugins already installed\n * @returns Formatted string like \"65 plugins available \u00B7 8 already installed\"\n */\nexport const formatPluginCount = (\n available: number,\n installed: number,\n): string => {\n const availableText =\n available === 1 ? '1 plugin available' : `${available} plugins available`\n const installedText =\n installed === 1 ? '1 already installed' : `${installed} already installed`\n return `${availableText} \u00B7 ${installedText}`\n}\n\n/**\n * Shorten long file paths for display.\n * Truncates from the beginning if path exceeds max length.\n *\n * @param path - Full file system path\n * @param maxLength - Maximum length before truncation (default: 80)\n * @returns Formatted path, possibly with leading \"...\"\n */\nexport const formatMarketplacePathShort = (\n path: string,\n maxLength: number = 80,\n): string => {\n if (path.length > maxLength) {\n return '...' + path.slice(-(maxLength - 3))\n }\n return path\n}\n\n/**\n * Format marketplace source path for display\n */\nexport function formatMarketplacePath(source: any): string {\n switch (source.type) {\n case 'github':\n return `github:${source.repo}${source.ref ? `@${source.ref}` : ''}`\n case 'url':\n return truncate(source.url, 60)\n case 'local':\n return source.path\n default:\n return 'unknown'\n }\n}\n\n/**\n * Format marketplace source for display.\n * Converts source type and details into readable string.\n *\n * @param type - Source type (github, url, local)\n * @param details - Additional source details\n * @returns Formatted source string\n */\nexport const formatMarketplaceSource = (\n type: string,\n details: string,\n): string => {\n switch (type) {\n case 'github':\n return `GitHub: ${details}`\n case 'url':\n return `URL: ${details}`\n case 'local':\n return `Local: ${formatMarketplacePathShort(details)}`\n default:\n return `${type}: ${details}`\n }\n}\n\n/**\n * Format time ago\n */\nexport function formatTimeAgo(date: Date | string): string {\n const d = typeof date === 'string' ? new Date(date) : date\n const now = new Date()\n const seconds = Math.floor((now.getTime() - d.getTime()) / 1000)\n\n if (seconds < 60) return 'just now'\n if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`\n if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`\n if (seconds < 604800) return `${Math.floor(seconds / 86400)}d ago`\n if (seconds < 2592000) return `${Math.floor(seconds / 604800)}w ago`\n\n return formatDate(d)\n}\n\n/**\n * Count installed plugins from a marketplace\n */\nexport function countInstalledPlugins(marketplaceName: string): number {\n // TODO: Implement plugin installation tracking\n // For now, return 0 as we don't track this yet\n return 0\n}\n\n/**\n * Format author field for display.\n * Handles both string and object formats.\n *\n * @param author - Author information (string or object)\n * @returns Formatted author string\n */\nexport function formatAuthor(\n author: string | { name: string; email?: string; url?: string } | undefined,\n): string {\n if (!author) return 'Unknown'\n if (typeof author === 'string') return author\n return author.name\n}\n"],
|
|
5
|
+
"mappings": "AASO,SAAS,SAAS,MAAc,WAA2B;AAChE,MAAI,KAAK,UAAU,UAAW,QAAO;AACrC,SAAO,KAAK,MAAM,GAAG,YAAY,CAAC,IAAI;AACxC;AAKO,SAAS,WAAW,MAA6B;AACtD,QAAM,IAAI,OAAO,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI;AACtD,QAAM,OAAO,EAAE,YAAY;AAC3B,QAAM,QAAQ,OAAO,EAAE,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACtD,QAAM,MAAM,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC/C,SAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG;AAChC;AASO,MAAM,oBAAoB,CAC/B,WACA,cACW;AACX,QAAM,gBACJ,cAAc,IAAI,uBAAuB,GAAG,SAAS;AACvD,QAAM,gBACJ,cAAc,IAAI,wBAAwB,GAAG,SAAS;AACxD,SAAO,GAAG,aAAa,SAAM,aAAa;AAC5C;AAUO,MAAM,6BAA6B,CACxC,MACA,YAAoB,OACT;AACX,MAAI,KAAK,SAAS,WAAW;AAC3B,WAAO,QAAQ,KAAK,MAAM,EAAE,YAAY,EAAE;AAAA,EAC5C;AACA,SAAO;AACT;AAKO,SAAS,sBAAsB,QAAqB;AACzD,UAAQ,OAAO,MAAM;AAAA,IACnB,KAAK;AACH,aAAO,UAAU,OAAO,IAAI,GAAG,OAAO,MAAM,IAAI,OAAO,GAAG,KAAK,EAAE;AAAA,IACnE,KAAK;AACH,aAAO,SAAS,OAAO,KAAK,EAAE;AAAA,IAChC,KAAK;AACH,aAAO,OAAO;AAAA,IAChB;AACE,aAAO;AAAA,EACX;AACF;AAUO,MAAM,0BAA0B,CACrC,MACA,YACW;AACX,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO,WAAW,OAAO;AAAA,IAC3B,KAAK;AACH,aAAO,QAAQ,OAAO;AAAA,IACxB,KAAK;AACH,aAAO,UAAU,2BAA2B,OAAO,CAAC;AAAA,IACtD;AACE,aAAO,GAAG,IAAI,KAAK,OAAO;AAAA,EAC9B;AACF;AAKO,SAAS,cAAc,MAA6B;AACzD,QAAM,IAAI,OAAO,SAAS,WAAW,IAAI,KAAK,IAAI,IAAI;AACtD,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,UAAU,KAAK,OAAO,IAAI,QAAQ,IAAI,EAAE,QAAQ,KAAK,GAAI;AAE/D,MAAI,UAAU,GAAI,QAAO;AACzB,MAAI,UAAU,KAAM,QAAO,GAAG,KAAK,MAAM,UAAU,EAAE,CAAC;AACtD,MAAI,UAAU,MAAO,QAAO,GAAG,KAAK,MAAM,UAAU,IAAI,CAAC;AACzD,MAAI,UAAU,OAAQ,QAAO,GAAG,KAAK,MAAM,UAAU,KAAK,CAAC;AAC3D,MAAI,UAAU,OAAS,QAAO,GAAG,KAAK,MAAM,UAAU,MAAM,CAAC;AAE7D,SAAO,WAAW,CAAC;AACrB;AAKO,SAAS,sBAAsB,iBAAiC;AAGrE,SAAO;AACT;AASO,SAAS,aACd,QACQ;AACR,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,SAAO,OAAO;AAChB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|